Обсуждаем контроллеры компании Atmel.
Ответить

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Сб сен 25, 2021 00:28:46

Достаточно повысить ток через потенциометр. И да - максимальное сопротивление резистор или потенциометра в цепи АЦП - всего 10 кОм. Средств увеличения времени накопления или периода опроса УВХ в старых атмегах нет. В новых есть. Поэтому там и 100кОм сопротивления вообще не проблема.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Сб сен 25, 2021 14:11:29

для приличия надо бы еще хоть немного программно пофильтровать результаты АЦП

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Пн сен 27, 2021 19:09:36

Интересно, регистр ICR1 имеет двойную буферизацию в режиме Т1 №8 (ШИМ c точной фазой и частотой)?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Пн сен 27, 2021 20:11:08

а в даташите что на это написано?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 09:57:12

Читал Евстифеева. Там как-то неоднозначно написано по этому вопросу. :) Похоже проблема с прерыванием ШИМа обусловлена именно тем, что регистр ICR1 не имеет двойной буферизации. Подключил один порт МК к светодиодам и вывел на него данные ADCH, которые записываются в регистр ICR1. Оказалось, что при плавном вращении потенциометра возникает ситуация, когда данные регистра ADCH начинают скакать. Причем с достаточно большой частотой (светодиоды порта начинают быстро мигать). Вот тогда и начинаются прерывания сигнала ШИМ. Видимо, идет беспорядочная и быстрая запись в регистр ICR1. А поскольку ICR1 не имеет двойной буферизации, то запись в этот регистр происходит в случайный момент времени работы таймера Т1 и он начинает сбоить. Думаю, когда счетный регистр приближается к точке ICR1 и в этот момент регистр ICR1 перезаписывается на меньшее число, которое TCNT1 > ICR1, то счетчик начинает считать до самого упора (0xffff), а потом разворачивается и начинает считать обратно пока не достигнет точки ICR1. Соответственно, пока счетчик наматывает ненужные круги, в неинвертированном режиме выход OC1A будет в 0.
Можно было бы сделать программную защиту (например сделать массив и кидать туда данные ADCH, а потом выводить среднее арифметическое) или поменять потенциометр на кнопку. Но я решил разобраться как работает режим Т1 №9? Я предположил, что в этом режиме регистры ICR1 и OCR1A должны были поменяться местами. Таким образом решилась бы проблема с двойной буферизацией регистра задающего период сигнала. Но... что-то этот режим у меня не работает ))) Светодиод просто горит, ни какого ШИМа нет. В чем моя ошибка? :)

Добавлено after 17 minutes 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Можно, кстати, записывать регистр ICR1 по флагу TOV1 - по даташиту он меняется на нижнем пределе счетчика. Наверно, так и сделаю. Но все равно интересно как работает режим №9 счетчика T1?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:01:09

нужно создать еще одно прерывание - по переполнению таймера1.
это прерывание срабатывает, когда счетчик находится в нуле. и в этом прерывании записывать значение ADCH в ICR1.
тогда не будет подобных конфликтов.
то есть, записывать регистр не в обработке АЦП, а в прерывании по переполнению.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:05:27

Starichok51, да, уже понял )) Спасибо!

Добавлено after 1 minute 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Starichok51 писал(а):нужно создать еще одно прерывание - по переполнению таймера1.

При этом в подпрограмме прерывания АЦП нужно блокировать общее разрешение прерываний в регистре SREG?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:11:31

пока я отправлял свой пост, ты успел отправить дополнение к своему посту.
как я понимаю, в режиме №9 "верхушку" задает регистр OCR1A, а для ШИМ тогда остается только один канал В. а по каналу А в этом режиме ШИМ невозможен.
не надо в обработке АЦП ничего блокировать.
просто в обработке АЦП регистр ADCH где-то сохраняешь. а потом в прерывании по переполнению сохраненное значение записываешь в ICR1.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:15:13

Starichok51, понял. Спасибо!

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:18:19

При входе в подпрограмму обработки прерывания глобальный флаг разрешения прерываний снимается автоматом.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 10:46:48

Kalisnik, и по второму потенциометру делаешь точно также - значение АЦП сохраняешь, а в прерывании по переполнению оба сохраненных значения записываешь, соответственно, в регистры ICR1 и OCR1A.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 11:41:58

Starichok51, из каких соображений запись регистра OCR1A лучше перенести в подпрограмму прерывания по переполнению таймера?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 11:52:21

для синхронности изменения обоих регистров.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 12:00:11

OCR1A вроде автоматом записывается по нижнему пределу или я чего-то не понял?

Добавлено after 2 minutes 47 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Это и является сутью двойной буферизации.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 13:50:46

это не записывается, а обновляется из буфера. Update - это обновление.
а тебе нужно записать новое значение в регистр (буфер).

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 14:02:01

Starichok51 писал(а):а тебе нужно записать новое значение в регистр (буфер).

OCR1A обновляется из буфера по нижнему пределу счетчика. Буфер обновляется непосредственно в момент записи. Зачем мне синхронизировать запись в буфер? Буфер - это же TEMP. Он начинает выполнять свою функцию только в нижнем пределе счетчика. Или я снова чего-то не понимаю?

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 14:42:38

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

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 20:28:32

дубовость тоже аргумент

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Вт сен 28, 2021 22:26:34

...как и рейтинг сообщений.

Re: Atmega8, ШИМ - низкий уровень на выводе после остановки

Ср сен 29, 2021 03:41:08

умник, давай свой код
Ответить