Включение, выключение, регулировка ШИМ

olegue
Offline
Зарегистрирован: 23.09.2020

Здравтсвуйте.

мне нужно регулировать ШИМ в зависимости от нажатой кнопки (есть код кнопки)

  // on
  if (receivedCode==66100)  
{  analogWrite(6, 255);   }
   // off
  if (receivedCode==66132)  
{  analogWrite(6, 0);   }
      // ступенчатое увеличение яркости
   if (receivedCode==66099)  
   { 
     //AR6=analogRead(6);  // текущее значение яркости
     //AR6 = map(analogRead(6), 0, 1023, 1, 255); 
     AR6 = analogRead(6); 
      lcd.setCursor(0, 1);
      lcd.print(AR6);
     if (AR6>250) {return;}// ничего не делаем - яркость максимальная
            analogWrite(6, AR6/4+20);  // если дошли до этой строки уменьшаем якрость
   }
   // ступенчатое уменьшение яркости
   if (receivedCode==66105)  
   { 
     //AR6=analogRead(6);  // текущее значение яркости
     //AR6 = map(analogRead(6), 0, 1023, 1, 255); 
     AR6 = analogRead(6); 
      lcd.setCursor(0, 1);
      lcd.print(AR6);
     if (AR6<20) {return;}// ничего не делаем - яркость минимальная
      analogWrite(6, AR6/4-20);  // если дошли до этой строки увеличиваем якрость
   }

функция AnalogRead(6) выдает какую то дичь. Когда я включаю шим, то посылаю 255 в AnalogWrite().

А когда опрашиваю AnalogRead(), то должне получить 1023, а получаю ерунду. 

Что здесь не так.

(в коде пытаюсь сделать ступенчаное регулирование)

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ШИМ в ардуине не аналоговый сигнал, а цифровой. Его нельзя напрямую мерять с помощью AnalogRead.

olegue
Offline
Зарегистрирован: 23.09.2020

А как его измерить?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
-NMi-
Онлайн
Зарегистрирован: 20.08.2018

olegue пишет:

А как его измерить?

А нахер те его мерить? При 0-255 восьмибитки сдвинь 0-1023 вправо два раза и буит те тож-самое, шо ты намеряшЪ с ШИМа через ФНЧ.

olegue
Offline
Зарегистрирован: 23.09.2020

согласен, дурень я.

записал в ЕЕPROM, и обновляю при изменении.

  
 // on
  if (receivedCode==66100)  
    AR6 =eeprom_read_byte(0); при включении возврат к настроенной яркости
{  analogWrite(9, AR6); 
  }
   // off
  if (receivedCode==66132)  

{  analogWrite(9, 0);  }

     
   // ступенчатое увеличение яркости
   if (receivedCode==66099)  
   { 
     
      
      AR6 =eeprom_read_byte(0);     прочитаем текущую яркость
     
        AR6=AR6+20;
        if (AR6>255) {AR6=255;}// Без перебора байт 
        analogWrite(9, AR6);  // если дошли до этой строки уменьшаем якрость
        eeprom_write_byte(0,AR6);     // Обновим значени в памяти

     
   }
   // ступенчатое уменьшение яркости
     
   if (receivedCode==66105)  
   { 
     
     AR6 =eeprom_read_byte(0);      
     
      AR6=AR6-20;
      if (AR6<10) {AR6=10;}// стопорим на этом значении минимальную яркость.
      analogWrite(9, AR6);  // 
      eeprom_write_byte(0,AR6);     
      
      

   }

 

 
olegue
Offline
Зарегистрирован: 23.09.2020

-NMi- пишет:

 

А нахер те его мерить? При 0-255 восьмибитки сдвинь 0-1023 вправо два раза и буит те тож-самое, шо ты намеряшЪ с ШИМа через ФНЧ.

но в этом месте не понял, попрошу пояснить. Если можно куском кода. Спасибо

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

olegue пишет:

Здравтсвуйте.

мне нужно регулировать ШИМ в зависимости от нажатой кнопки (есть код кнопки)

  
{  analogWrite(6, 255);   }
...
   AR6=analogRead(6);  // текущее значение яркости
  
   }

функция AnalogRead(6) выдает какую то дичь. Когда я включаю шим, то посылаю 255 в AnalogWrite().

А когда опрашиваю AnalogRead(), то должне получить 1023, а получаю ерунду. 

Что здесь не так.

Ну, как уже сказали мерять ШИМ АЦП без сглаживание плохая идея, это раз

Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6 

olegue
Offline
Зарегистрирован: 23.09.2020

asam пишет:

 

Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6 

 

странно... это все. Почему такая неочевидность. Надо для аналоговых пинов букву А писать перед пином, например А6, уже сталкивался с такой фигней. Но в любом случае мне это мало чем поможет. тем более что я нашел другое решение и уже реализовал его на практике. 

Кстати , когда это все делал мне в голову приходила эта мысль.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

olegue пишет:

asam пишет:

 

Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6 

 

странно... это все. Почему такая неочевидность. Надо для аналоговых пинов букву А писать перед пином, например А6, уже сталкивался с такой фигней. Но в любом случае мне это мало чем поможет. тем более что я нашел другое решение и уже реализовал его на практике. 

Кстати , когда это все делал мне в голову приходила эта мысль.

 

Читайе документацию на используемые функции, там все написано.

Кстати AnalogRead(5) и AnalogRead(А5) это одно и то же. Но во втором случае нагляднее.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

olegue пишет:

странно... это все. Почему такая неочевидность. 

Дело в том, что аналогового выхода (ЦАП) в ардуине нет (* в большинстве моделей). Поэтому analogWrite() работает с цифровыми пинами и ШИМ. Т.е. analogWrite на самом деле никакой не analog... Зачем разработчики изначально неправильной терминологией вводят пользователей в заблуждение - непонятно. Функцию логично было бы назвать pwmWrite() или pwmOut().

olegue
Offline
Зарегистрирован: 23.09.2020

Ребята, подскажите что я опять тут нахамутал.

 

  if (receivedCode==66100)  
{  
    AR6 =eeprom_read_byte(0);
    AR=0;

  do {
      analogWrite(9, AR);
      AR=AR+1;
      delay(500);
      } while (AR<=AR6)
  ; 
}

хочу плавно включить, расчитываю,что delay(500) это 0.5 сек. Стало быть если яркость =250, то 125 секунд будет гаснуть. А гаснет в натуре за 1 сек. В чем ппроблемаа?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

логарифм знаешь чо такое?

P.S. Хотя, тут не в логарифме дело. 

olegue
Offline
Зарегистрирован: 23.09.2020

DetSimen пишет:

 

P.S. Хотя, тут не в логарифме дело. 

загадками говоришь?

За логарифм знал раньше. И производную с площадью криволинейной трапецией тоже грыз. Когда-то.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А чему AR6 равно то? И как в еепром это значение попало? И какого типа AR и AR6?

-NMi-
Онлайн
Зарегистрирован: 20.08.2018

DetSimen пишет:

логарифм знаешь чо такое?

Дет пахож НАТУРАЛЬНЫМ лагариффмом сёдня закусывал ))))))))))))))))))))))

-NMi-
Онлайн
Зарегистрирован: 20.08.2018

olegue пишет:

За логарифм знал раньше. И производную с площадью криволинейной трапецией тоже грыз. Когда-то.

Уотт те делать нех, каг грысть ГМО фсякое...

Ты зайди на агарот, памидорки, агурчики, йаблочки... фкуснатенЪ!!!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

-NMi- пишет:

DetSimen пишет:

логарифм знаешь чо такое?

Дет пахож НАТУРАЛЬНЫМ лагариффмом сёдня закусывал ))))))))))))))))))))))

Натуральным. Токашто с грятки. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

а если?

 if (receivedCode==66100)  
{  
    AR6 = 255;
    AR=0;

  do {
      analogWrite(9, AR);
      AR=AR+1;
      delay(500);
      } while (AR<=AR6)
  ; 
}

 

olegue
Offline
Зарегистрирован: 23.09.2020
Приведу весь код. Delay работает совершенно неадекватно.
Пробовал посмотреть ЕЕпром, там все ок. Записывается именно то что нужно.
Да и на экране я это все вижу. Сериала у меня нету, программирую через usbASp


// include the library code:
#include <LiquidCrystal.h>
#include <RemoteReceiver.h>
#include <avr/eeprom.h>

// initialize the library with the numbers of the interface pins
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(12, 11, 5, 4, 6, 7);
//const unsigned long receivedCode=0;
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  //lcd.print("hello, world!");
 //Connect the receiver to digital pin 2.-пин 2.это вход для Радиоприёмника
  RemoteReceiver::init(0, 3, showCode);
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);  //шим на выход, там частот около 1кгц
  // Пины D9 и D10 - 31.4 кГц (Переопределяем частоту ШИМ)
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000001;  // x1 phase correct
}

void showCode(unsigned long receivedCode, unsigned int period)
{  
  lcd.clear();
  lcd.print(":");
  lcd.print(receivedCode);
  lcd.print(",p:");
  lcd.print(period);
 
int AR6;
int AR;
   // on
  if (receivedCode==66100)  
{  
    AR6 =eeprom_read_byte(0);
   //AR6=255;
    AR=0;
  while (AR<=AR6) 
  {
      analogWrite(9, AR);
      AR=AR+1;
      //delay(500);
       lcd.setCursor(0, 1);
        lcd.print(AR);
      } 
}
   // off
  if (receivedCode==66132)  
{ 
     AR6 =eeprom_read_byte(0);
      do {
      analogWrite(9, AR6);
      AR6=AR6-1;
      delay(500);
       lcd.setCursor(0, 1);
        lcd.print(AR6);
      } while (AR6>0)
  ; 
  }
  // ступенчатое увеличение яркости
   if (receivedCode==66099)  
   { 
      lcd.setCursor(0, 1);
      lcd.print(AR6);
      AR6 =eeprom_read_byte(0);     
         AR6=AR6+20;
        if (AR6>255) {AR6=255;}// 
        analogWrite(9, AR6);  //  якрость
        eeprom_write_byte(0,AR6);     
      lcd.setCursor(0, 1);
      lcd.print(AR6);
   }
   // ступенчатое уменьшение яркости
   if (receivedCode==66105)  
   { 
      AR6 =eeprom_read_byte(0);      
       AR6=AR6-20;
      if (AR6<10) {AR6=10;}// ничего не делаем - яркость минимальная
      analogWrite(9, AR6);  //  якрость
      eeprom_write_byte(0,AR6);     
      lcd.setCursor(0, 1);
      lcd.print(AR6);
    }
  
 } 

void loop() {
}