Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Влияние каналов АЦП друг на друга?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
hd44780
Собирается прибор для одновременного измерения сетевого напряжения и тока.
Входные каскады - схема. БП на LM7805, МК (ATMega16, 8 MHz), LCD типа HD4478, кнопки, светодиодики не рисовал, там всё стандартно.

ОУ DA2.1 - средняя точка 2.5в, регулируется R3.
Входы ADC1, 2 АЦП опрашиваются 20 раз за период 50 Гц (в обработчике таймера, 1 мс):

// Замер напряжения - ADC1
adc = read_adc(ADC_U);
// убираем смещение
adcU=adc-adcUsm;

// Квадрат
adcSqr=adcU;
adcSqr*=adcU;

// Сумма квадратов напряжения
summUsqr+=adcSqr;

....................................

Для тока (ADC2) абсолютно также, переменные другие. Все расчёты здесь - 100% целочисленные, никакой плавающей точки.
АЦП работает без прерываний, по опросам:

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=0x00;
ADCSRA=0x83; // 0x10000011 - Enable, CLK/8=1MHz
.......................

// Read the AD conversion result
word read_adc(byte adc_input)
{
ADMUX=adc_input;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);

// Start the AD conversion (ADSC)
ADCSRA|=0x40;

// Wait for the AD conversion to complete (ADIF)
while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

// Обнуляем мл. бит
return ADCW&0xFFFE;
} // read_adc

Функция read_adc сгенерирована генератором кода CvAVR. Я её не менял.
Напряжение средней точки (ADC0) - adcUsm - замеряется в начале каждого цикла замеров. Каждый цикл - 0.5 сек - 10 периодов 50 Гц.
ADC2 - канал измерения большого тока (>4A) контроллером пока не обрабатывается.

Далее идут пересчёты в напряжение сети и ток.

Начал отлаживать. Канал напряжения (ADC1) откалибровал, работает. Показывает почти также, как и мультиметры. Для нашего брата сойдёт biggrin.gif .

Приступил к току (ADC2). Вот тут начались странности.
Когда напряжение подано, а нагрузки нет, тока нагрузки нет, на выходе ТТ - чистый 0, а прибор показывает на входе АЦП - 0.01-0.02в (округлённо - %.2f). Вопроса пересчёта напряжения на АЦП в амперы я здесь не касаюсь.
Облазил весь код - ничего, всё нормально.

Потом случайно отключил обмотку измерения напряжения T3 (подключена через разъёмчик), остался только R2, запаянный в плату. И, о, чудо - увидел 0в на обоих входах АЦП 08.gif .
После целенаправленных разборок в этом направлении увидел, что напряжение на ADC1 как-то влияет на ADC2.

Вопрос - можно ли как-то избавиться от этого влияния и как? Может я чего не учёл? Или взять модификацию ATMega16A? Слышал, что у них аналоговая часть сделана более грамотно.
Ставить внешний АЦП? У меня есть микрочиповский MCP3202. Где гарантия, что и у него нету подобных эффектов?

PS. Пошарив по интернету, нашёл ещё пару жалоб на такой же эффект в ATMega8, но решений так и нету. Где-то предлагали реже опрашивать АЦП, но мне это не выход, т.к. идеально вообще - ток и напряжение замерять строго одновременно.

Спасибо.
Клим
Цитата(hd44780 @ Sep 25 2011, 09:47) *
а прибор показывает на входе АЦП - 0.01-0.02в

ADC2 относительно ADC0 ?
Попробуйте закоротить тогда ADC2 и ADC0 И посмотреть, что выйдет. Может дело и вовсе не в контроллере.

Также, рекомендую использовать режим непрерывного измерения с переключением каналов в прерывании от АЦП.

Атмел рекомендует не использовать первый результат измерения сразу после переключения канала, но это касается дифф-режимов.
И вообще, по поводу измерения сетевых параметров будет весьма полезен аппнот 465
hd44780
Дифф режим не использую, смещение вычитается программно:

// Замер напряжения - ADC1
adc = read_adc(ADC_U);
// убираем смещение (ADC0)
adcU=adc-adcUsm;

МК в DIP40, там дифф. режим пользовать не рекоомендуют.

Аппнот этот я знаю.
hd44780
Цитата(Клим @ Sep 25 2011, 11:05) *
Попробуйте закоротить тогда ADC2 и ADC0 И посмотреть, что выйдет. Может дело и вовсе не в контроллере.


А что это даст? Ведь резистор R9 для этого и поставил...
-SANYCH-
Цитата
Вопрос - можно ли как-то избавиться от этого влияния и как?


Нужно уменьшить частоту выборки АЦП и этот эффект пропадет. Делал похожее устройство и тоже столкнулся с таким эффектом.
Юрий_СВ
Цитата(hd44780 @ Sep 25 2011, 09:47) *
(ATMega16, 8 MHz)
Входы ADC1, 2 АЦП опрашиваются 20 раз за период 50 Гц (в обработчике таймера, 1 мс):
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
ADCSRA=0x83; // 0x10000011 - Enable, CLK/8=1MHz

А зачем такая большая частота синхронизации АЦП ?
(если частота выборок всего лишь 1(4) кГц)
Цитата
By default, the successive approximation circuitry requires an input clock frequency between 50
kHz and 200 kHz to get maximum resolution
. If a lower resolution than 10 bits is needed, the
input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate.

-----------------------------------------------------------------------------------------------------------------
На Мега64 использовал 4 входных канала никакого влияния не заметил, работает хорошо.

А вот диф.режим выдаёт странные результаты - воспользоваться им так и не смог.
hd44780
Поставил частоту синхронизации 125 кГц и добавил 2 холостых выборки:

read_adc(ADC_U);
read_adc(ADC_U);
adc = read_adc(ADC_U);

......................................................
read_adc(ADC_I_LO);
read_adc(ADC_I_LO);
adc = read_adc(ADC_I_LO);

отличий не заметил.

Сейчас буду переделывать весь алгоритм замеров, чтобы АЦП по прерываниям работал...
dac
имхо косяк в отрицательном напряжении на входе. многие многоканальные ацп этим грешат. поставьте последовательно резистор и диоды как на ADC2. только желательно шоттки типа BAS70, с токами утечки поменьше.
и еще 100кОм слишком большое сопротивление последовательно со входом, в этом случае время выборки больше надо делать, что бы конденсатор УВХ успевал зарядиться.
Юрий_СВ
Цитата(dac @ Sep 25 2011, 16:24) *
100кОм слишком большое сопротивление последовательно со входом, в этом случае время выборки больше надо делать, что бы конденсатор УВХ успевал зарядиться.


В описании сказано так:
"The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less."



ADC0 логичнее подключить к выходу повторителя - иначе будете мерять смещение.
И на входах АЦП лучше поставить ёмкости. (чтобы получить RC)
Клим
Цитата(hd44780 @ Sep 25 2011, 12:38) *
А что это даст? Ведь резистор R9 для этого и поставил...

Имел в виду вообще оторвать вывод от входных измерительных цепей, чтобы удостоверится, что "наводка" именно внутри мультиплексора АЦП.
насчет частоты выборок - было озвучено 20 на период = 10 на полуволну - это уже довольно мало. Для линейной нагрузкт еще можно так упрощать, но любой импульснный БП вам испортит всю точность измерений на 20-30%.
и, кстати о цифрах. Если у вас "средняя точка 2,5В", то я так понимаю, опора = напряжение питания ?? если так то это +1 источник проблем. Во-вторых, при таких раскладах, 10-20мв это 1-2 разряда АЦП - а это в пределах погрешностей.
hd44780
BAS70-04 в прайсе нашёл, доберусь до магазина, куплю. Они заразы, SMD, у меня макетка DIP crying.gif . Придётся изголяться ...
Пока на канал ADC2 поставил шоттки SR110, были под руками. На ADC3 оставил те, что указаны на схеме. Там некритично.
Резисторы R7, R8 пока вообще убрал. Для экспериментов.
Изменений не увидел.

Насчёт частоты выборки не понял sad.gif .
-SANYCH- советует её понизить, для снижения эффекта взаимовлияния каналов, Клим советует увеличить для улучшения точности.
Я помню, раньше, ещё где-то в мае, пытался поднять частоту выборок за период раз в 10 кажется - 200 на период. Вообще фигня была - все показания "дрожали" - очень быстро менялись вблизи каких-то центральных значений. Усреднять тогда не стал, понизил частоту выборок.
Чую, дело пахнет заменой АЦП ...
MaslovVG
Цитата(hd44780 @ Sep 26 2011, 10:14) *
Насчёт частоты выборки не понял sad.gif .
-SANYCH- советует её понизить, для снижения эффекта взаимовлияния каналов, Клим советует увеличить для улучшения точности.
Я помню, раньше, ещё где-то в мае, пытался поднять частоту выборок за период раз в 10 кажется - 200 на период. Вообще фигня была - все показания "дрожали" - очень быстро менялись вблизи каких-то центральных значений. Усреднять тогда не стал, понизил частоту выборок.
Чую, дело пахнет заменой АЦП ...

Необходимо увеличить паузу между переключением каналов о измерением. Пока устаканится напряжение на УВХ(устройство выборки хранения). При большой разнице напряжений каналов конденсатор УВХ не успевает перезарядиться.
Для повышения точности необходимо повышать частоту выборок. Это и есть противоречие не решаемое на одном внутреннем АЦП.
Stanislav_S
Известная проблема sm.gif Я делаю так:
- делитель тактирования АЦП ставите на 128, таким образом время преобразования будет 104 мкс
- завожу таймер на 200 мкс, АЦП настраивается на запуск от таймера, таким образом практически устраняется влияние каналов друг на друга, еще как вариант можно пропускать первое измерение в канале, но это обычно для режима Free running.
Navovvol
Я как то словил интересный баг на быстром переключении каналов АЦП, а именно : на ADC0 подал 1,7В, на ADC1 - 1B. Так сначала выдавало: ADC0-1.7В ADC1-1.7B, потом ADC0-1B, ADC1-1,7B, т.е. сигналы поменялись местами.
Юрий_СВ
Попробуйте увеличить задержку в word read_adc(byte adc_input) раз в 5 (н-р, с 10 до 50).
dac
а еще попробуйте померить осциллографом, что реально на входах ацп, а то может он совсем не причем.
и не путайте время выборки (sample time, hold time) со временем преобразования (convertion time), с авр не работал, у мсп430, пик, стм32 и стм8 эти вещи задаются раздельно. ну и увеличить паузу, как советовали выше, тоже может помочь.
если другие шоттки не помогли, BAS70 не помогут тоже, можете не искать
hd44780
Осциллографом глядел миллион раз. Когда нагрузки нет - на ADC2 идеально ровная полоса 2.5в.

Переделал алгоритм, теперь использует прерывания АЦП и ждёт 50 нс после переключения мультиплексора - ещё хуже стало.
Теперь при полном отсутствии сигнала и по напряжению и по току показывает 0.1в и 0.4-0.5в соответственно.

Я иссяк sad.gif . Пошёл менять АЦП на MCP3202....
ArtemKAD
Как-то натыкался на взаимовлияние каналов. Лечилось или полным отказом от sleep-режима или холостым преобразованием при переключении канала. Последнее как по мне проще всего делать выключением АЦП в начале прерывания, а затем включением при запуске. Тогда АЦП делает полный цикл в 25 тактов, что эквивалентно первому выброшенному.
Что-то типа такого:

Код
#define ADCSRA_ON     (1 << ADEN)|(1 << ADIF)|(1 << ADIE)|(1<<ADSC)|(1<<ADPS1)    
#define ADCSRA_OFF     (1 << ADIF)    // выключение АЦП    

__interrupt void ADC_INT (void)
{
  unsigned int adc = ADC;            // Считываем значение
//.....
  ADCSRA = ADCSRA_OFF;                //полное отключение АЦП
//.....
  {
//.....
    ADMUX = MUX_12V_IN;
//.....
  }

//.....
    ADCSRA=ADCSRA_ON;
    return;
};



Цитата
// Read the AD conversion result
word read_adc(byte adc_input)
{
ADMUX=adc_input;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);

// Start the AD conversion (ADSC)
ADCSRA|=0x40;

// Wait for the AD conversion to complete (ADIF)
while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

// Обнуляем мл. бит
return ADCW&0xFFFE;
} // read_adc

Функция read_adc сгенерирована генератором кода CvAVR. Я её не менял.

Зря не меняли. Она оставляет работать АЦП после преобразования и при этом не стирает бит флага прерывания при запуске нового преобразования.
Откуда уверенность, что это:
Код
// Wait for the AD conversion to complete (ADIF)
while ((ADCSRA & 0x10)==0);

ловит результат этого преобразования, а не предыдущего - уже готового на момент входа в процедуру???
Клим
Цитата(hd44780 @ Sep 27 2011, 13:19) *
Осциллографом глядел миллион раз. Когда нагрузки нет - на ADC2 идеально ровная полоса 2.5в.

Ровная... не ровная...
Что на ADC2 относительно ADC0 ?
Что именно выдает АЦП? (не в вольтах)
Какая опора, все таки, AVCC или AREF?
Если AREF, то какое там напряжение?
И вообще, схема подключения? А то "все стандартно", в моем понимании - это использование внутренней опоры с кондесатором на AREF.
Цитата
Переделал алгоритм, теперь использует прерывания АЦП и ждёт 50 нс после переключения мультиплексора - ещё хуже стало.
Теперь при полном отсутствии сигнала и по напряжению и по току показывает 0.1в и 0.4-0.5в соответственно.

Т.е. после программных изменений "влияние каналов друг на друга" стало еще больше" ???
-SANYCH-
Сначала не обратил внимание но когда присмотрелся то увидел что Вы измеряете сигнал через 100к резистор. Если это так то АЦП и будет плясать.
Клим
Цитата(-SANYCH- @ Sep 28 2011, 09:55) *
Сначала не обратил внимание но когда присмотрелся то увидел что Вы измеряете сигнал через 100к резистор. Если это так то АЦП и будет плясать.

Ну он уже написал, что эти резисторы убрал.
Мне больше неясно, почему напряжение средней точки меряется на входе ОУ, а не на выходе.
назначение резистора в 1М мне тоже непонятно.
hd44780
Цитата(Клим @ Sep 28 2011, 11:00) *
назначение резистора в 1М мне тоже непонятно.


Это я притягивал вход АЦП к земле. Думал, там какие-то наводки в отсутствии сигнала. Видел такое решение с промышленно выпускаемых приборах. Не помогло оно ...
Резисторов в 100кил на входах уже нет. Одни диоды остались.

Опора - AREF=VCC=5в со стабилизатора. Кондёр, там как в ДШ есть. Только дросселя нету.

Остальное, думаю до вечера проверю, отпишусь.
Lexdaw
Вы будете смеятся ,но в одном из приборов взаимовлияние устранил увеличением частоты преобразования.Т.е. был делитель 1/128 после смены на 1/32 всё заработало.
SAWushka
Не по делу, так как все что мог придумть уже посоветовали.
Какой трансформатор используете в качестве датчика напряжения (T3)? Решаю похожую задачу.
Описываемые вами эфекты встречал, но все они лечились двойным опросом, причем запускаем первое преобразование сразу после переключения канала.
Как предположение - возможно компилятор "оптимизировал" это дейтсвие в вашем случае?
hd44780
Цитата(SAWushka @ Sep 29 2011, 12:41) *
Какой трансформатор используете в качестве датчика напряжения (T3)?


Обычный, как в БП. Использовал сперва 2 транса (один на питание, 2-й для измерения), потом купил какую-то китайчатину с 2-мя независимыми вторичками. На нём написано T08339A. 2 вторички по 15в.
Никакой разницы не заметил. Только R2 подкрутил, чтобы синусоида была в границах где-то 0.5-4.5в и всё.
hd44780
Вот изобразил текущую схему.

Может уже оффтоп в данной теме.

Выдернул из колодки контроллер и снял осциллограмму на ADC2 oтносительно ADC0 - рис 1. Рис 2 - просто увеличенный кусок.
Вольтметр AC показывает 0.03-0.04в. При подключении T3 становится 0.06-0.07в.
Откуда лезут эти 50 Гц, не могу понять...
Питание смотрел, оно чистое.

Осциллограф - цифровой UNI-T UT-81B. Всё ничего, но в программе, на скриншотах размерности по осям хрен знает какие ...
defunct
Пропускайте первое измерение после смены канала.
hd44780
Всё работает.
Сделал 50 нс ожидания после переключения канала и 3 холостых выборки. АЦП без прерываний, по опросу. Пока нормально.

Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.