реклама на сайте
подробности

 
 
> ATmega128 проблема переключения каналов АЦП, проскок данных из соседнего канала
pokk
сообщение Sep 18 2014, 00:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Здравствуйте, не как не могу разобраться с данной проблемой.
Ацп работает в режиме автоматического перезапуска с частотой 12 кГц и тактовая частотой АЦП 156 кГц (1 такт АЦП 64 такта процессора). Прерывания внутри АЦП разрешены для работы таймера. Приведённый ниже код работает, переключение каналов происходит. Буфер накапливается и значения АЦП по USART забирается (с периодом 300мс). Но примерно пару раз в минуту данные идут не с того канала в частности в обработке канала I2_MAIN проскакивают значения из канала I_42_MAIN почему такое происходит?
При убирании задержки в 200 тактов(для записи MUX) или запрет прерывания в обработчике АЦП, таких частых проскоков не наблюдается. Как это может быть связанно ? Без задержки в 200 тактов такое происходили но с периодичностью в минут 30.
CODE
////=============ADCinitialization==================================================
=================
////ADCSRA=0;
//ADMUX=2; //I1
//ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
//
//ADC_I42
//ADMUX=1; //slave in
//ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
////================================================================================
============
interrupt [ADC_INT] void adc_isr(void){
#asm("sei")
switch(adc_main){
case I1_MAIN:{
adc_main=I_42_MAIN; // Переход на измерения следующего канала
ADC_BUF->test_int[4]=ADCW; //записали в буфер(данный буфер выдаётся в UART по запросу)
ADMUX_TEMP=3; //I2 переключаемся на канал I2 через итерацию(для установления переходных процессов) с задержкой в 200 тактов
//ADC_I28
break;
}
case I_42_MAIN:{
adc_main=I2_MAIN; // Переход на измерения следующего канала
ADC_BUF->test_int[3]=ADCW; //записали в буфер(данный буфер выдаётся в USART по запросу)
ADMUX_TEMP=1; //I28 переключаемся на канал I28 через итерацию (для установления переходных процессов) с задержкой в 200 тактов
break;
}
case I2_MAIN:{
// Правильно значение АПЦ равно 647 в основном оно так и приходит но время от времени (пару раз в минуту)
// Проскакивает значение с АЦП c предыдущего канала.
// функция DEBUGER заносит в очередь ошибку(и значение АЦП) для отправки по USART

if(ADCW>700){DEBUGER("ADCW_HIGEST=",0,ADCW,var2);}
if(ADCW<600){
DEBUGER("ADC_INT_ADCW=",0,ADCW,var2);
LED_GREEN_DOWN();
test_I2[test_I2_index]=ADCH;
test_I2[test_I2_index+1]=ADCL;
test_I2_index++;
if(test_I2_index>14){test_I2_index=0;}
}
ADC_BUF->test_int[1]=ADCW;
adc_main=I28_SLAVE;
ADMUX_TEMP=2; //I
//ADC_I42
break;
}
case I28_SLAVE:{
adc_main=I1_MAIN;
ADC_BUF->test_int[5]=ADCW;
ADMUX_TEMP=1;
break;
}
default:{
adc_main=I1_MAIN;
DEBUGER("adc_main=error",0,0,MESEGER);
}
}

#include <nop2.c> // задержка 200 nop
ADMUX=ADMUX_TEMP;
}


Сообщение отредактировал IgorKossak - Sep 19 2014, 15:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pokk
сообщение Sep 18 2014, 06:30
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Обработчик АЦП успевает выполнится В AVR studio пробегался там было максимум 200 а так в основном около 100(это был другой код там было 6 каналов и обработка их ). А вот на счёт таймера не знаю там у меня программный 1-wire сидит а у него временные задержки маленькие. Хотя там всё на case сделано по идее должно быстро работать. Сейчас по пробую как-нибудь в таймере замерить время выполнения его.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 18 2014, 06:36
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Если мне не изменяет память, то после смены канала первое преобразование надо выкидывать, т.к. оно не валидно.
Я конечно могу путать и вводить вас в заблуждение, но что-то такое всплывает на задворках памяти.
Еще не так давно Сергей Борщь говорил, что все траблы с АЦП AVR идут из-за несоответствия электрических характеристик схемы включения параметрам, указанным в даташите.
Превышен входной-выходной ток или ёмкость на аналоговых пинах... В общем почитайте даташит внимательно ещё раз.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Sep 18 2014, 06:57
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(demiurg_spb @ Sep 18 2014, 10:36) *
Если мне не изменяет память, то после смены канала первое преобразование надо выкидывать, т.к. оно не валидно.

Путаете, у Вас смешалось:
1. First Analog Comparator conversion may be delayed
If the device is powered by a slow rising VCC, the first Analog Comparator conversion will
take longer than expected on some devices.
Problem Fix/Workaround
When the device has been powered or reset, disable then enable theAnalog Comparator
before the first conversion.

и
The value of these bits selects which combination of analog inputs are connected to the ADC.
These bits also select the gain for the differential channels. See Table 98 for details. If these bits
are changed during a conversion, the change will not go in effect until this conversion is
complete (ADIF in ADCSRA is set).

Я бы всё же не заморачивался с FreeRunning, а ценой некоторого снижения sample rate воспользовался одиночными преобразованиями с переключением канала в обработчике и потом в том же обработчике запуск преобразования.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016