Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП на Atmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
shemmer
Добрый день

Вот решил сделать блок питания с управлением на МК
Возникли проблемы с АЦП, а именно:
Не могу настроить его так чтобы он мерил многократно, а не 1 раз
Работаю в CVAVR, симулирую в ПРОТЕУСЕ

Делаю так:
interrupt [ADC_INT] void adc_isr(void){
Vizm=ADCW;
Vpr = (float) Vizm; //переводим формат данных из целочисленно в фиксированную арифметику
Vpr = Vpr * 0.03128; //умножаем на множитель масштаба(измерение до 32В)
Vdec = (int) Vpr; //выделяем целую часть;
Vpr = Vpr - (float) Vdec;//выделяем милливольты
Vpr = Vpr * 1000; //избавляемся от целой части
Vmili = (int) Vpr; //переводим милливольты в вольты
}
Дальше преобразовываю в BCD и вывожу на LED.(ADCSRA=0b11011111;
ADMUX=0b11000000

Но он делает преобразование 1 раз и останавливается.
Если установить ADFR=1, то в протеусе на индикаторе кракозябры
(может на железе будет нормально?)
Как заставить делать преобразование многократно?
WEST128
Тут надо приводить не ваш код обработки данных с АЦП, а то, как вы инициализируете его регистры. Там есть несколько режимов работы, если вы не хотите сами запускать АЦП, то настройте его в режиме непрерывного преобразования (FreeRunning). По поводу используемого вами симулятора можно сказать, что он бывает ошибается, проверять всегда лучше на железке. Неплохо бы привести тип вышего контроллера.
shemmer
МК Atmega8
что-бы настроить Free runing нужно, как я понимаю ADFR установить в 1.
Но при этом на индикаторе всякая всячина.
Т.е все работает когда ADCSRA=0b11011111 ADMUX=0b11000000 и
interrupt [ADC_INT] void adc_isr(void){
Vizm=ADCW;
Vpr = (float) Vizm;
Vpr = Vpr * 0.03128;
Vdec = (int) Vpr;
Vpr = Vpr - (float) Vdec;
Vpr = Vpr * 1000;
Vmili = (int) Vpr;

}
как только я делаю ADCSRA=0b11111111 или выношу из прерывания перевод в формат float
на индикаторе не весть что
В чем может быть причина?
SasaVitebsk
Для непрерывного режима АЦП, в 1 устанавливается бит ADATE и для первого запуска бит ADSC. В старых МК бит ADATE мог называться ADFR. (всё это находится в регистре ADSRA). После переключения канала необходимо чтобы прошло не менее 26 циклов АЦП.

Ну и ещё некоторые советы. Вы их вольны не использовать.
В прерывании, обычно, не делают никаких "приведений" результатов. Только усреднение либо фильтрация. И работают с непосредственно снимаемыми данными либо с данными после усреднения. Если требуется численное значение на дисплее, то преобразование осуществляют непосредственно перед выводом. Причина проста. Измерение осуществляется сотни/тысячи раз в секунду. Вывод на дисплей - единицы раз в секунду.
bodja74
Динамика в протеусе работает кривовато ,точнее с ней нужно поигратся ,чтобы отображало корректно,
заюзайте реальный девайс ,будет проще.

Еще ,проще думаю сделать опорник от 5вольт и результат сдвинуть влево ,делитель на входе 1\10,сможете и 50в мерять и не париться с коэфициентами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.