Полная версия этой страницы:
АЦП на Atmega
shemmer
Sep 23 2007, 09:55
Добрый день
Вот решил сделать блок питания с управлением на МК
Возникли проблемы с АЦП, а именно:
Не могу настроить его так чтобы он мерил многократно, а не 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
Sep 23 2007, 10:17
Тут надо приводить не ваш код обработки данных с АЦП, а то, как вы инициализируете его регистры. Там есть несколько режимов работы, если вы не хотите сами запускать АЦП, то настройте его в режиме непрерывного преобразования (FreeRunning). По поводу используемого вами симулятора можно сказать, что он бывает ошибается, проверять всегда лучше на железке. Неплохо бы привести тип вышего контроллера.
shemmer
Sep 23 2007, 11:41
МК 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
Sep 23 2007, 15:45
Для непрерывного режима АЦП, в 1 устанавливается бит ADATE и для первого запуска бит ADSC. В старых МК бит ADATE мог называться ADFR. (всё это находится в регистре ADSRA). После переключения канала необходимо чтобы прошло не менее 26 циклов АЦП.
Ну и ещё некоторые советы. Вы их вольны не использовать.
В прерывании, обычно, не делают никаких "приведений" результатов. Только усреднение либо фильтрация. И работают с непосредственно снимаемыми данными либо с данными после усреднения. Если требуется численное значение на дисплее, то преобразование осуществляют непосредственно перед выводом. Причина проста. Измерение осуществляется сотни/тысячи раз в секунду. Вывод на дисплей - единицы раз в секунду.
bodja74
Sep 23 2007, 17:44
Динамика в протеусе работает кривовато ,точнее с ней нужно поигратся ,чтобы отображало корректно,
заюзайте реальный девайс ,будет проще.
Еще ,проще думаю сделать опорник от 5вольт и результат сдвинуть влево ,делитель на входе 1\10,сможете и 50в мерять и не париться с коэфициентами.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.