|
Вопрос по АЦП, Free running mode |
|
|
|
Jan 14 2008, 22:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
При работе с АЦП делаю заранее заданное демпфирование по каналам. То есть порядок выборки каналов у меня постоянно скачет. Это поменять нельзя. АЦП запущено в "Free running mode" и проверяется по таймеру. Время с момента переключения канала и до выборки значения АЦП вдвое превышает означенные 25 тактов (пробовал и увеличивать). По каким-то, для меня непонятным причинам, иногда (достаточно редко) с АЦП в память попадает не текущее значение АЦП (точнее не то, что должно быть), а с предыдущего канала. Причём если я в данной точке останавливаюсь по JTAG, то в АЦП микросхемы вижу правильное значение. Например: Код 127 default: 128 x0=Adc[TekChan].X1=ADCH; // Прочитать значение АЦП \ ??pvPWWLvl1_7: \ 000000B8 91300079 LDS R19, 121 \ ??pvPWWLvl1_9: \ 000000BC 8334 STD Z+4, R19 \ 000000BE 2E23 MOV R2, R19 То есть по databreakpoint останавливаюсь в последней строчке и вижу в АЦП значение FF к примеру, а в ячейку уже занесено 83. Каналы и всё прочее выставляется верно. Создаётся впечатление, что АЦП не успевает завершить операцию. Но, как я уже писал, при увеличении времени в разы сама ошибка остаётся. Может я чего не знаю. Может необходимо как то обновить значение. Типа прочитать два раза или что-то ещё. Я в непонятках.
|
|
|
|
|
 |
Ответов
|
Apr 15 2008, 08:02
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Имею проблему с выводом по UART результата измерения АЦП (Mega48, 20Мгц), работающего в free running mode. Настроен только на измерение с одного канала. Синхронизация передачи значения АЦП в BCD формате по UART осуществляется в главном цикле по флагу DISPLAY. UART работает с использованием прерывания (avr306 - interrupt controlled UART). В программе еще используется прерывание от таймера1 (вызывается через 10 мсек), в котором осуществляется динамическая индикация и обработка кнопок. Код void Initialise(void) { ................. //ADC initialisation: ADMUX=(1<<REFS1)|(1<<REFS0);//Установка Photo_Channel (ADC0), //Internal 1.1V Voltage Reference with external capacitor at AREF pin //Старт непрерывного преобразования с частотой 156,25 кГц, Предделитель = 128, //Разрешить прерывание АЦП ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); }
//////////////////////////////////////////////// void main(void) { Initialise(); __enable_interrupt(); for(;;) { if(Flags&DISPLAY) { itoa(tmp, buf2); TransmitByte(*(buf2+0)+'0'); TransmitByte(*(buf2+1)+'0'); TransmitByte(*(buf2+2)+'0'); TransmitByte(*(buf2+3)+'0'); TransmitByte(13); //CR TransmitByte(10); //LF // delay_ms(250); Flags &= ~DISPLAY; } __sleep(); //Idle mode } }
////////////////////////////// #pragma vector=ADC_vect __interrupt void ADC_ISR(void) { acum += ADC;
if(++SampleCounter == max) { value = acum/max; SampleCounter=0; acum=0; if(!(Flags&DISPLAY)) { tmp = value; Flags |= DISPLAY; } } .... } Собственно, я подошел к сути проблемы. На терминале получаю значения АЦП, чередующиеся с 0, типа так: 0031 0031 0030 0000 0000 0000 0031 0031 0030 0000 0000 0000Если остановить таймер1, то выводит то, что положено - без нулей. Если запустить таймер1 и после очередной отправки результата по UART вставить задержку 250ms (в приведенном коде закомментирована), то выводит также без нулей. При уменьшении задержки до 100ms начинают вылазить нули. Почему так происходит? PS. Выводить результат на UART нужно максимально быстро. Single Mode не предлагать.
|
|
|
|
Сообщений в этой теме
SasaVitebsk Вопрос по АЦП Jan 14 2008, 22:53 Baser Может быть там присутствуют наложения циклов АЦП и... Jan 15 2008, 08:38 GDI При переключении мультиплексора, вроде, рекомендую... Jan 15 2008, 08:52 Сергей Борщ Я тоже склоняюсь к мысли, что это биения от несовп... Jan 15 2008, 08:58 xemul Цитата(Сергей Борщ @ Jan 15 2008, 11:58) ... Jan 15 2008, 12:04 GDI Ну может не в даташитах но на форуме эта тема под... Jan 15 2008, 10:04 Сергей Борщ Цитата(GDI @ Jan 15 2008, 12:04) "ну... Jan 15 2008, 10:48  singlskv Цитата(Сергей Борщ @ Jan 15 2008, 13:48) ... Jan 15 2008, 20:56   SasaVitebsk Цитата(singlskv @ Jan 16 2008, 00:56) Он ... Jan 15 2008, 23:54    pokos Цитата(SasaVitebsk @ Jan 16 2008, 02:54) ... Jan 16 2008, 08:24     SasaVitebsk Цитата(pokos @ Jan 16 2008, 12:24) Ну, во... Jan 16 2008, 11:36    singlskv Цитата(SasaVitebsk @ Jan 16 2008, 02:54) ... Jan 18 2008, 09:36     _Pasha Цитата(singlskv @ Jan 18 2008, 13:36) ...... Jan 18 2008, 14:26      singlskv Цитата(_Pasha @ Jan 18 2008, 17:26) Вообщ... Jan 18 2008, 14:35   Сергей Борщ Цитата(singlskv @ Jan 15 2008, 22:56) Ну ... Jan 16 2008, 15:19    singlskv Цитата(Сергей Борщ @ Jan 16 2008, 18:19) ... Jan 16 2008, 20:16 pokos Насколько я понимаю процесс жизнедеятельности этог... Jan 15 2008, 14:01 xemul Цитата(pokos @ Jan 15 2008, 17:01) Наскол... Jan 15 2008, 14:32 Сергей Борщ Цитата(pokos @ Jan 15 2008, 16:01) Наскол... Jan 15 2008, 14:36 Anjey_N Хочу тоже задать вопрос!
МК ATmega8, задейств... Jan 15 2008, 17:03 Baser Цитата(Anjey_N @ Jan 15 2008, 19:03) При ... Jan 15 2008, 17:24  Anjey_N Цитата(Baser @ Jan 15 2008, 21:24) Можно ... Jan 15 2008, 17:40 SasaVitebsk Не буду утверждать, так как для каких либо утвержд... Jan 15 2008, 17:46 pokos "ADMUX can be safely updated in the following... Jan 16 2008, 11:49 oran-be Я отжимался со свободным режимом - отлично работае... Jan 16 2008, 18:26 _Pasha В самом первом посте увидел инструкцию STD. У меня... Jan 16 2008, 21:18 _Diman_ Разьясните пожалуйста пару моментов.
13 - 260 ... Jan 16 2008, 21:42 _Pasha Цитата(_Diman_ @ Jan 17 2008, 01:42) По э... Jan 16 2008, 22:09 _Diman_ Небольшоё, аккумулятор-> 510 ом и 0,2uF на земл... Jan 16 2008, 23:20 SasaVitebsk Ещё раз поясняю младший бит не может "отличат... Jan 16 2008, 23:33 IGK Цитата(SasaVitebsk @ Jan 17 2008, 01:33) ... Jan 17 2008, 15:38 SasaVitebsk Сейчас изделие отправили на натурные испытания на ... Jan 17 2008, 17:08 _Pasha Цитата(IGK @ Jan 17 2008, 19:38) Но есть ... Jan 17 2008, 20:14 IGK Цитата(_Pasha @ Jan 17 2008, 22:14) Чушь... Jan 17 2008, 22:47 _Pasha Цитата(singlskv @ Jan 18 2008, 18:35) А г... Jan 19 2008, 04:54 SasaVitebsk Ну это не мой вариант. Я работаю с 8-ми битным реж... Jan 19 2008, 14:18 singlskv Цитата(SasaVitebsk @ Jan 19 2008, 17:18) ... Jan 19 2008, 15:55  _Pasha Цитата(singlskv @ Jan 19 2008, 19:55) Ну ... Jan 19 2008, 19:43   singlskv Цитата(_Pasha @ Jan 19 2008, 22:43) Вы, с... Jan 19 2008, 20:04    _Pasha Цитата(singlskv @ Jan 20 2008, 00:04) Вы ... Jan 19 2008, 20:45 defunct 2 SashaVitebsk.
IMHO считывать АЦП по таймеру нем... Jan 20 2008, 01:56 SasaVitebsk А Flags у вас объявлен как volatile?
Просто похоже... Apr 15 2008, 09:19 alux Цитата(SasaVitebsk @ Apr 15 2008, 12:19) ... Apr 15 2008, 12:38  Сергей Борщ Цитата(alux @ Apr 15 2008, 15:38) volatil... Apr 15 2008, 14:07   alux Цитата(Сергей Борщ @ Apr 15 2008, 17:07) ... Apr 15 2008, 16:12 SasaVitebsk Предложу вам другой вариант работы с флагами. Комп... Apr 15 2008, 20:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|