Включение, выключение, регулировка ШИМ
- Войдите на сайт для отправки комментариев
Пнд, 28/09/2020 - 16:52
Здравтсвуйте.
мне нужно регулировать ШИМ в зависимости от нажатой кнопки (есть код кнопки)
// 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, а получаю ерунду.
Что здесь не так.
(в коде пытаюсь сделать ступенчаное регулирование)
ШИМ в ардуине не аналоговый сигнал, а цифровой. Его нельзя напрямую мерять с помощью AnalogRead.
А как его измерить?
https://www.google.com/search?q=сглаживание+шим+сигнала
https://www.google.com/search?q=%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%...
А как его измерить?
А нахер те его мерить? При 0-255 восьмибитки сдвинь 0-1023 вправо два раза и буит те тож-самое, шо ты намеряшЪ с ШИМа через ФНЧ.
согласен, дурень я.
записал в ЕЕ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); }А нахер те его мерить? При 0-255 восьмибитки сдвинь 0-1023 вправо два раза и буит те тож-самое, шо ты намеряшЪ с ШИМа через ФНЧ.
но в этом месте не понял, попрошу пояснить. Если можно куском кода. Спасибо
А если ШИМ не сглаженнвй/фильтрованный, то можно цифровым пином скважность померять.
Здравтсвуйте.
мне нужно регулировать ШИМ в зависимости от нажатой кнопки (есть код кнопки)
{ analogWrite(6, 255); } ... AR6=analogRead(6); // текущее значение яркости }функция AnalogRead(6) выдает какую то дичь. Когда я включаю шим, то посылаю 255 в AnalogWrite().
А когда опрашиваю AnalogRead(), то должне получить 1023, а получаю ерунду.
Что здесь не так.
Ну, как уже сказали мерять ШИМ АЦП без сглаживание плохая идея, это раз
Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6
Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6
странно... это все. Почему такая неочевидность. Надо для аналоговых пинов букву А писать перед пином, например А6, уже сталкивался с такой фигней. Но в любом случае мне это мало чем поможет. тем более что я нашел другое решение и уже реализовал его на практике.
Кстати , когда это все делал мне в голову приходила эта мысль.
Потом вы в курсе, что AnalogRead(6) и AnalogWrite(6)работают с совсем разными пинами? В первом случае это А6 , а во втором D6
странно... это все. Почему такая неочевидность. Надо для аналоговых пинов букву А писать перед пином, например А6, уже сталкивался с такой фигней. Но в любом случае мне это мало чем поможет. тем более что я нашел другое решение и уже реализовал его на практике.
Кстати , когда это все делал мне в голову приходила эта мысль.
Читайе документацию на используемые функции, там все написано.
Кстати AnalogRead(5) и AnalogRead(А5) это одно и то же. Но во втором случае нагляднее.
странно... это все. Почему такая неочевидность.
Дело в том, что аналогового выхода (ЦАП) в ардуине нет (* в большинстве моделей). Поэтому analogWrite() работает с цифровыми пинами и ШИМ. Т.е. analogWrite на самом деле никакой не analog... Зачем разработчики изначально неправильной терминологией вводят пользователей в заблуждение - непонятно. Функцию логично было бы назвать pwmWrite() или pwmOut().
Ребята, подскажите что я опять тут нахамутал.
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 сек. В чем ппроблемаа?
логарифм знаешь чо такое?
P.S. Хотя, тут не в логарифме дело.
P.S. Хотя, тут не в логарифме дело.
загадками говоришь?
За логарифм знал раньше. И производную с площадью криволинейной трапецией тоже грыз. Когда-то.
А чему AR6 равно то? И как в еепром это значение попало? И какого типа AR и AR6?
логарифм знаешь чо такое?
Дет пахож НАТУРАЛЬНЫМ лагариффмом сёдня закусывал ))))))))))))))))))))))
За логарифм знал раньше. И производную с площадью криволинейной трапецией тоже грыз. Когда-то.
Уотт те делать нех, каг грысть ГМО фсякое...
Ты зайди на агарот, памидорки, агурчики, йаблочки... фкуснатенЪ!!!
логарифм знаешь чо такое?
Дет пахож НАТУРАЛЬНЫМ лагариффмом сёдня закусывал ))))))))))))))))))))))
Натуральным. Токашто с грятки.
а если?
if (receivedCode==66100) { AR6 = 255; AR=0; do { analogWrite(9, AR); AR=AR+1; delay(500); } while (AR<=AR6) ; }Приведу весь код. 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() { }