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

 
 
> AVR ADC, межканальные помехи?
r_spb
сообщение Feb 20 2015, 07:52
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 19-06-14
Пользователь №: 81 994



Здравствуйте, друзья. Помогите разобраться. Стоит задача контролировать уровень постоянного напряжения на четырех входах АЦП микроконтроллера Mega16 (порты PA4-PA7). Далее мой код.
CODE
void adc_init(void)
{
//настройка АЦП
ADCSRA|=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
ADMUX|=(1<<REFS0)|(0<<REFS1);
}


uint16_t make_single_adc_cycle(unsigned char port_number)
{
switch(port_number)
{
case 0:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
break;
case 1:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);
break;
case 2:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);
break;
case 3:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0);
break;
case 4:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0);
break;
case 5:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0);
break;
case 6:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);
break;
case 7:
ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0);
break;
default:
return 0;
break;
}
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
return ADC;
}

int main (void)
{
volatile uint16_t result[4];
//...
//здесь заполняю массив данными для отправки через uart
for(unsigned char i=4; i<8; i++)
{
result[i-4]=make_single_adc_cycle(i);
}
sData[5]=result[0]>>8;
sData[6]=result[0];
sData[7]=result[1]>>8;
sData[8]=result[1];
sData[9]=result[2]>>8;
sData[10]=result[2];
sData[11]=result[3]>>8;
sData[12]=result[3];

//...


Проблема в следующем: когда на ноге PA4 отсутствует напряжение (я могу включать и выключать его через PA0-PA3), а на остальных ногах (PA5-PA7) присутствует, то я не получаю нулевой результат измерения АЦП на PA4. По uart мне приходят данные, что на этой ноге еденица (мультиметр показывает ноль). Нулевого результата измерения получается добиться только один раз после сброса питания мк, после этого глюк возвращается. Аналогично в ситуации наоборот, когда на PA4 - единица, на PA5-7 - нули, то АЦП говорит, что на PA4 тоже ноль. И еще несколько комбинаций с подобным результатом.
Если проводить измерения одной ноги, а остальные вообще не трогать, то ничего подобного нет.
Напряжние на этих ногах 2,2В, к ним подключены фильтрующие кондеры 0,1 мкФ (не рядом с мк). АЦП работает от AVcc (4,98В), также подключен кондер 0,1 мкФ (уже рядом с мк), но без дросселя, как даташите Атмел. Частота кварца 7,3728 МГц.

Сообщение отредактировал IgorKossak - Feb 21 2015, 18:07
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Сергей Борщ
сообщение Feb 20 2015, 12:39
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Каково сопротивление подключенного к PA4 источника сигнала?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
r_spb
сообщение Feb 24 2015, 07:34
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 19-06-14
Пользователь №: 81 994



Там делитель напряжения 10кОм-1кОм. Если не ошибаюсь, то выходное сопротивление делителя чуть меньше 1кОм. Как это может влиять?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 24 2015, 08:02
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(r_spb @ Feb 24 2015, 09:34) *
Там делитель напряжения 10кОм-1кОм. Если не ошибаюсь, то выходное сопротивление делителя чуть меньше 1кОм.
Тогда должно быть все в порядке.
Цитата(r_spb @ Feb 24 2015, 09:34) *
Как это может влиять?
Через это сопротивление заряжается/разряжается конденсатор устройства выборки-хранения. Если сопротивление будет длшком большое - конденсатор не успеет перезарядиться за время выборки и в конденсаторе останется часть заряда от предыдущего канала.

Цитата(r_spb @ Feb 24 2015, 09:34) *
Код
        case 5:
        ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0);
        break;
        case 6:
        ADMUX|=(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);
        break;
Как вы думаете, какое число будет в ADMUX после вызова make_single_adc_cycle(5); make_single_adc_cycle(6); ?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
r_spb
сообщение Feb 24 2015, 08:30
Сообщение #5





Группа: Новичок
Сообщений: 7
Регистрация: 19-06-14
Пользователь №: 81 994



Без учета битов REFS 5, а затем 6? Вы к тому, что так нельзя прописывать регистр?
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Feb 24 2015, 09:32
Сообщение #6


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

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Стоит хотя-бы 1 раз, в начале, записывать весь регистр явно (не |=), чтобы быть уверенным в начальном значении.
Затем, у вас старт преобразования без задержки после переключения, может задержка нужна?
PS
В ADMUX полностью переписывайте номер канала.

Сообщение отредактировал Копейкин - Feb 24 2015, 09:45
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 24 2015, 10:01
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(r_spb @ Feb 24 2015, 10:30) *
Вы к тому, что так нельзя прописывать регистр?
Что значит "нельзя?". Льзя, но только в данном случае в результате получилось не то, что вы хотели. У вас вместо шестого канала будет преобразован седьмой. Догадаетесь, почему?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
r_spb
сообщение Feb 24 2015, 11:01
Сообщение #8





Группа: Новичок
Сообщений: 7
Регистрация: 19-06-14
Пользователь №: 81 994



Цитата(Сергей Борщ @ Feb 24 2015, 11:01) *
Что значит "нельзя?". Льзя, но только в данном случае в результате получилось не то, что вы хотели. У вас вместо шестого канала будет преобразован седьмой. Догадаетесь, почему?

Да, вы правы, там будет чушь получаться. Попробую по другому.
Go to the top of the page
 
+Quote Post

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

 


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


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