подскажите как ШИМом сделать 0
- Войдите на сайт для отправки комментариев
Добрый день!
Помогите разобраться с ШИМ.
На многих сайтах пишут, что изменяя содержимое регистра сравнения OCR от 0 до 256 можно регулировать коэффициент заполнения сигнала от 0 до 1. Но у меня получается, что если записать в OCR 0, то диод, подключенный к выходу ШИМ, продолжает чуть-чуть светится. Частота ШИМ 62,5 кГц.
В книжке Хартова "Микроконтроллеры АВР" написано следующее: "Если в регистре сравнения содержится 0, то на выходе будут наблюдаться короткие выбросы". После того как счетный регистр TCNT переполнен он обнуляется и в этот момент времени его значение совпадает с значением нуля в OCR - на выходе формируется коротенький импульс.
Подскажите как этого избежать. Получается, что если даже в OCR будет 0, то контроллер будет ШИМом пытаться открывать ключи в схеме? Работаю с Atmega2560 (arduino atmega). Пишу на С через AVRstudio.
Спасибо.
А так пробовали?
AnalogWrite
На других языках также - режим вывода, в запись цифрового регистра ЛОГ 0
Если пишете на С напрямую, то проще отключать соответствующий таймер для подачи нуля.
Кстати, содержимое восьмибитного регистра не может изменяться от 0 до 256, только от 0 до 255.
Весь таймер, наверное, отключать не стоит вдруг это TIMER0 или на нем еще что-то крутится. Лучше отключить конкретную ногу МК в регистре TCCRA сбросив биты COMA1/COMB1 и COMA0/COMB0 в нули - Normal port operation, OCA/OCB disconnected.
Пример на TIMER0 для ноги OC0A для режима Fast PWM Mode, в этом режиме COM0A0 всегда равен нулю (Clear OC0A on Compare Match, set OC0A at BOTTOM), поэтому что бы отключить/включить ШИМ достаточно изменить состояние бита COM0A1:
если OCR0A не равен нулю, то устанавливаем COM0A1 в единицу иначе сбрасываем в ноль.
http://arduino.ru/forum/apparatnye-voprosy/shim-bolee-chem-8-bit#comment-24593
Спасибо большое!
С COM битами все получилось.
Биты OCIE0B (2) и OCIE0A (1) разрешают прерывания при совпадении с A и B, а бит TOIE0 (0) разрешает прерывание по переполнению при установке 1. Если в эти биты записать 0, прерывания от таймера/счетчика будут запрещены.
ах ты некромант проклятый!!! :)
Paul_B - просто обрабатывайте "ноль" как особый случай
ах ты некромант проклятый!!! :)
Просто сам столкнулся с проблемой на ATtiny13. Управляю сервой. С вывода PB0 все управляется нормально, а просто в программе меняю PB0 на PB1 и ни черта не работает. Начал копать, думаю все дело в ШИМ.
Никаких регистров, связанных с таймером T0 не менял, все стоит по умолчанию, а остаточное свечение светодиода на PB0 присутствует, что связано с тем, что таймер по переполнению все-таки по умолчанию работает. Возмодно это таймер на ноге PB1 "устраивает пляски", что сервой управлять невозмодно становится.
под attiny13 не пробовал, но вот код под 85ю, подсветка коридора по датчику движения,
по окончании времени, отключаю ШИМ совсем, все отлично работает
все оказалось прозаично - у pb1 не хватало мощности прокачать серво - уровень сигнала проваливался до 1В. Поставил через транзистор и все стало ок.
ты PB1 сразу к серве подключал штоли, гений?
ты PB1 сразу к серве подключал штоли, гений?
нормальный электронщик может подключить шо угодно куда угодно...
У сервы есть +5В, Земля и управляющий провод. Так вот PB0 нормально управлял сервой, просадки нет абсолютно. Почему просадка на PB1 я не знаю (смотрю через осциоллограф).