Страница 1 из 1
Поведение таймера в atmega16
Добавлено: Вт сен 29, 2020 10:15:11
alex1126
Вопрос в следующем. Есть Атмега16. Есть связка l298+l297 для шагового двигателя. Клоки для l297 выдаются путём дёрганья ноги OC1A, которая инвестируется по таймеру, настроенныи на сброс при совпадении.
Все ок. Но хочется регулировать скорость двигателя, для этого надо менять значение OCR1A и инверсия будет происходить чаще или реже.
А теперь вопрос. Если TCNT1 доклокает, например, до 100, а мы в этот момент изменим OCR1A со 105 до 95, то таймера так и будет кликать до 65536, сбросится и только со второго захода «совпадёт»? Или как только он поймёт что «перешагал» он синвертирует ногу?
Re: Поведение таймера в atmega16
Добавлено: Вт сен 29, 2020 16:07:50
Ivanoff-iv
почитай по режимы PWM в них есть буферизация и такая ситуация исключается.
можно, конечно обновлять предел в прерывании по совпадению... но это костыль и не 100% надёжно
Re: Поведение таймера в atmega16
Добавлено: Вт сен 29, 2020 16:41:31
alex1126
Шим мне не нужен. Скважность то у меня всегда 50%, а вот длительность периода меняется.
А почему если менять в прерывании по совпадению это не будет 100% работать?
Re: Поведение таймера в atmega16
Добавлено: Вт сен 29, 2020 17:26:32
NStorm
alex1126, всё это прекрасно расписано в ДШ:
An interrupt can be generated at each time the counter value reaches the TOP value by eitherusing the OCF1A or ICF1 Flag according to the register used to define the TOP value. If theinterrupt is enabled, the interrupt handler routine can be used for updating the TOP value. How-ever, changing the TOP to a value close to BOTTOM when the counter is running with none or alow prescaler value must be done with care since the CTC mode does not have the double buff-ering feature. If the new value written to OCR1A or ICR1 is lower than the current value ofTCNT1, the counter will miss the compare match. The counter will then have to count to its max-imum value (0xFFFF) and wrap around starting at 0x0000 before the compare match can occur.In many cases this feature is not desirable. An alternative will then be to use the fast PWM modeusing OCR1A for defining TOP (WGM13:0 = 15) since the OCR1A then will be double buffered.
Можно менять в прерывании в режиме CTC. Но когда меняете вниз, и значения близко к нулю (BOTTOM), а прескейлер небольшой, может случится так, что к этому моменту таймер уже "перешагнет" через TOP (верхнее значение в OCR1A). Тогда и случится круговой просчет до 0xFFFF. И прям в последнем предложении говорится, что поэтому лучше использовать режим Fast PWM, где OCR1A имеет двойной буфер и обновляется железом автоматом именно после прохождения полного периода (о чем вам
Ivanoff-iv писал).
Re: Поведение таймера в atmega16
Добавлено: Чт окт 08, 2020 20:52:36
alex1126
Нашёл режим пвм с коррекцией частоты. Правда частота в два раза падает если делать «Красиво» через дёрганье ногой, но если дергать ногу самостоятельно через прерывание то и частоту оставляем.