Обсуждаем контроллеры компании Atmel.
Сб сен 25, 2021 00:28:46
Достаточно повысить ток через потенциометр. И да - максимальное сопротивление резистор или потенциометра в цепи АЦП - всего 10 кОм. Средств увеличения времени накопления или периода опроса УВХ в старых атмегах нет. В новых есть. Поэтому там и 100кОм сопротивления вообще не проблема.
Сб сен 25, 2021 14:11:29
для приличия надо бы еще хоть немного программно пофильтровать результаты АЦП
Пн сен 27, 2021 19:09:36
Интересно, регистр ICR1 имеет двойную буферизацию в режиме Т1 №8 (ШИМ c точной фазой и частотой)?
Пн сен 27, 2021 20:11:08
а в даташите что на это написано?
Вт сен 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?
Вт сен 28, 2021 10:01:09
нужно создать еще одно прерывание - по переполнению таймера1.
это прерывание срабатывает, когда счетчик находится в нуле. и в этом прерывании записывать значение ADCH в ICR1.
тогда не будет подобных конфликтов.
то есть, записывать регистр не в обработке АЦП, а в прерывании по переполнению.
Вт сен 28, 2021 10:05:27
Starichok51, да, уже понял )) Спасибо!
Добавлено after 1 minute 33 seconds:Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.Starichok51 писал(а):нужно создать еще одно прерывание - по переполнению таймера1.
При этом в подпрограмме прерывания АЦП нужно блокировать общее разрешение прерываний в регистре SREG?
Вт сен 28, 2021 10:11:31
пока я отправлял свой пост, ты успел отправить дополнение к своему посту.
как я понимаю, в режиме №9 "верхушку" задает регистр OCR1A, а для ШИМ тогда остается только один канал В. а по каналу А в этом режиме ШИМ невозможен.
не надо в обработке АЦП ничего блокировать.
просто в обработке АЦП регистр ADCH где-то сохраняешь. а потом в прерывании по переполнению сохраненное значение записываешь в ICR1.
Вт сен 28, 2021 10:15:13
Starichok51, понял. Спасибо!
Вт сен 28, 2021 10:18:19
При входе в подпрограмму обработки прерывания глобальный флаг разрешения прерываний снимается автоматом.
Вт сен 28, 2021 10:46:48
Kalisnik, и по второму потенциометру делаешь точно также - значение АЦП сохраняешь, а в прерывании по переполнению оба сохраненных значения записываешь, соответственно, в регистры ICR1 и OCR1A.
Вт сен 28, 2021 11:41:58
Starichok51, из каких соображений запись регистра OCR1A лучше перенести в подпрограмму прерывания по переполнению таймера?
Вт сен 28, 2021 11:52:21
для синхронности изменения обоих регистров.
Вт сен 28, 2021 12:00:11
OCR1A вроде автоматом записывается по нижнему пределу или я чего-то не понял?
Добавлено after 2 minutes 47 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Это и является сутью двойной буферизации.
Вт сен 28, 2021 13:50:46
это не записывается, а обновляется из буфера. Update - это обновление.
а тебе нужно записать новое значение в регистр (буфер).
Вт сен 28, 2021 14:02:01
Starichok51 писал(а):а тебе нужно записать новое значение в регистр (буфер).
OCR1A обновляется из буфера по нижнему пределу счетчика. Буфер обновляется непосредственно в момент записи. Зачем мне синхронизировать запись в буфер? Буфер - это же TEMP. Он начинает выполнять свою функцию только в нижнем пределе счетчика. Или я снова чего-то не понимаю?
Вт сен 28, 2021 14:42:38
ну да, но тогда откуда у тебя проблемы в работе ШИМ?
ты сначала сделай, как я предлагаю. когда заработает нормально, тогда будешь экспериментировать с записью в буфер не в прерывании, а при обработке АЦП.
но я не сторонник подобных экспериментов - лучше делать сразу надежно, чтобы не было сюрпризов, как это сейчас у тебя.
Вт сен 28, 2021 20:28:32
дубовость тоже аргумент
Вт сен 28, 2021 22:26:34
...как и рейтинг сообщений.
Ср сен 29, 2021 03:41:08
умник, давай свой код
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.