|
Влияние каналов АЦП друг на друга?, ATMega16 |
|
|
|
Sep 25 2011, 06:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Собирается прибор для одновременного измерения сетевого напряжения и тока. Входные каскады - схема. БП на 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) откалибровал, работает. Показывает почти также, как и мультиметры. Для нашего брата сойдёт  . Приступил к току (ADC2). Вот тут начались странности. Когда напряжение подано, а нагрузки нет, тока нагрузки нет, на выходе ТТ - чистый 0, а прибор показывает на входе АЦП - 0.01-0.02в (округлённо - %.2f). Вопроса пересчёта напряжения на АЦП в амперы я здесь не касаюсь. Облазил весь код - ничего, всё нормально. Потом случайно отключил обмотку измерения напряжения T3 (подключена через разъёмчик), остался только R2, запаянный в плату. И, о, чудо - увидел 0в на обоих входах АЦП  . После целенаправленных разборок в этом направлении увидел, что напряжение на ADC1 как-то влияет на ADC2. Вопрос - можно ли как-то избавиться от этого влияния и как? Может я чего не учёл? Или взять модификацию ATMega16A? Слышал, что у них аналоговая часть сделана более грамотно. Ставить внешний АЦП? У меня есть микрочиповский MCP3202. Где гарантия, что и у него нету подобных эффектов? PS. Пошарив по интернету, нашёл ещё пару жалоб на такой же эффект в ATMega8, но решений так и нету. Где-то предлагали реже опрашивать АЦП, но мне это не выход, т.к. идеально вообще - ток и напряжение замерять строго одновременно. Спасибо.
Сообщение отредактировал hd44780 - Sep 25 2011, 06:50
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 27)
|
Sep 25 2011, 08:05
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(hd44780 @ Sep 25 2011, 09:47)  а прибор показывает на входе АЦП - 0.01-0.02в ADC2 относительно ADC0 ? Попробуйте закоротить тогда ADC2 и ADC0 И посмотреть, что выйдет. Может дело и вовсе не в контроллере. Также, рекомендую использовать режим непрерывного измерения с переключением каналов в прерывании от АЦП. Атмел рекомендует не использовать первый результат измерения сразу после переключения канала, но это касается дифф-режимов. И вообще, по поводу измерения сетевых параметров будет весьма полезен аппнот 465
|
|
|
|
|
Sep 25 2011, 10:45
|
Местный
  
Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864

|
Цитата Вопрос - можно ли как-то избавиться от этого влияния и как? Нужно уменьшить частоту выборки АЦП и этот эффект пропадет. Делал похожее устройство и тоже столкнулся с таким эффектом.
|
|
|
|
|
Sep 25 2011, 11:23
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Цитата(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 входных канала никакого влияния не заметил, работает хорошо. А вот диф.режим выдаёт странные результаты - воспользоваться им так и не смог.
Сообщение отредактировал Юрий_СВ - Sep 25 2011, 11:56
|
|
|
|
|
Sep 25 2011, 14:23
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Цитата(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)
|
|
|
|
|
Sep 25 2011, 15:54
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(hd44780 @ Sep 25 2011, 12:38)  А что это даст? Ведь резистор R9 для этого и поставил... Имел в виду вообще оторвать вывод от входных измерительных цепей, чтобы удостоверится, что "наводка" именно внутри мультиплексора АЦП. насчет частоты выборок - было озвучено 20 на период = 10 на полуволну - это уже довольно мало. Для линейной нагрузкт еще можно так упрощать, но любой импульснный БП вам испортит всю точность измерений на 20-30%. и, кстати о цифрах. Если у вас "средняя точка 2,5В", то я так понимаю, опора = напряжение питания ?? если так то это +1 источник проблем. Во-вторых, при таких раскладах, 10-20мв это 1-2 разряда АЦП - а это в пределах погрешностей.
|
|
|
|
|
Sep 26 2011, 06:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
BAS70-04 в прайсе нашёл, доберусь до магазина, куплю. Они заразы, SMD, у меня макетка DIP  . Придётся изголяться ... Пока на канал ADC2 поставил шоттки SR110, были под руками. На ADC3 оставил те, что указаны на схеме. Там некритично. Резисторы R7, R8 пока вообще убрал. Для экспериментов. Изменений не увидел. Насчёт частоты выборки не понял  . -SANYCH- советует её понизить, для снижения эффекта взаимовлияния каналов, Клим советует увеличить для улучшения точности. Я помню, раньше, ещё где-то в мае, пытался поднять частоту выборок за период раз в 10 кажется - 200 на период. Вообще фигня была - все показания "дрожали" - очень быстро менялись вблизи каких-то центральных значений. Усреднять тогда не стал, понизил частоту выборок. Чую, дело пахнет заменой АЦП ...
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Sep 26 2011, 09:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134

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

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Попробуйте увеличить задержку в word read_adc(byte adc_input) раз в 5 (н-р, с 10 до 50).
|
|
|
|
|
Sep 26 2011, 12:12
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
а еще попробуйте померить осциллографом, что реально на входах ацп, а то может он совсем не причем. и не путайте время выборки (sample time, hold time) со временем преобразования (convertion time), с авр не работал, у мсп430, пик, стм32 и стм8 эти вещи задаются раздельно. ну и увеличить паузу, как советовали выше, тоже может помочь. если другие шоттки не помогли, BAS70 не помогут тоже, можете не искать
|
|
|
|
|
Sep 27 2011, 10:19
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Осциллографом глядел миллион раз. Когда нагрузки нет - на ADC2 идеально ровная полоса 2.5в. Переделал алгоритм, теперь использует прерывания АЦП и ждёт 50 нс после переключения мультиплексора - ещё хуже стало. Теперь при полном отсутствии сигнала и по напряжению и по току показывает 0.1в и 0.4-0.5в соответственно. Я иссяк  . Пошёл менять АЦП на MCP3202....
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Sep 27 2011, 18:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Как-то натыкался на взаимовлияние каналов. Лечилось или полным отказом от 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); ловит результат этого преобразования, а не предыдущего - уже готового на момент входа в процедуру???
|
|
|
|
|
Sep 28 2011, 03:50
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(hd44780 @ Sep 27 2011, 13:19)  Осциллографом глядел миллион раз. Когда нагрузки нет - на ADC2 идеально ровная полоса 2.5в. Ровная... не ровная... Что на ADC2 относительно ADC0 ? Что именно выдает АЦП? (не в вольтах) Какая опора, все таки, AVCC или AREF? Если AREF, то какое там напряжение? И вообще, схема подключения? А то "все стандартно", в моем понимании - это использование внутренней опоры с кондесатором на AREF. Цитата Переделал алгоритм, теперь использует прерывания АЦП и ждёт 50 нс после переключения мультиплексора - ещё хуже стало. Теперь при полном отсутствии сигнала и по напряжению и по току показывает 0.1в и 0.4-0.5в соответственно. Т.е. после программных изменений "влияние каналов друг на друга" стало еще больше" ???
|
|
|
|
|
Sep 28 2011, 08:00
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(-SANYCH- @ Sep 28 2011, 09:55)  Сначала не обратил внимание но когда присмотрелся то увидел что Вы измеряете сигнал через 100к резистор. Если это так то АЦП и будет плясать. Ну он уже написал, что эти резисторы убрал. Мне больше неясно, почему напряжение средней точки меряется на входе ОУ, а не на выходе. назначение резистора в 1М мне тоже непонятно.
|
|
|
|
|
Sep 28 2011, 08:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Цитата(Клим @ Sep 28 2011, 11:00)  назначение резистора в 1М мне тоже непонятно. Это я притягивал вход АЦП к земле. Думал, там какие-то наводки в отсутствии сигнала. Видел такое решение с промышленно выпускаемых приборах. Не помогло оно ... Резисторов в 100кил на входах уже нет. Одни диоды остались. Опора - AREF=VCC=5в со стабилизатора. Кондёр, там как в ДШ есть. Только дросселя нету. Остальное, думаю до вечера проверю, отпишусь.
Сообщение отредактировал hd44780 - Sep 28 2011, 08:11
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Sep 29 2011, 09:41
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 1-12-07
Пользователь №: 32 868

|
Не по делу, так как все что мог придумть уже посоветовали. Какой трансформатор используете в качестве датчика напряжения (T3)? Решаю похожую задачу. Описываемые вами эфекты встречал, но все они лечились двойным опросом, причем запускаем первое преобразование сразу после переключения канала. Как предположение - возможно компилятор "оптимизировал" это дейтсвие в вашем случае?
Сообщение отредактировал SAWushka - Sep 29 2011, 09:43
|
|
|
|
|
Sep 29 2011, 15:12
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Вот изобразил текущую схему. Может уже оффтоп в данной теме. Выдернул из колодки контроллер и снял осциллограмму на ADC2 oтносительно ADC0 - рис 1. Рис 2 - просто увеличенный кусок. Вольтметр AC показывает 0.03-0.04в. При подключении T3 становится 0.06-0.07в. Откуда лезут эти 50 Гц, не могу понять... Питание смотрел, оно чистое. Осциллограф - цифровой UNI-T UT-81B. Всё ничего, но в программе, на скриншотах размерности по осям хрен знает какие ...
Сообщение отредактировал hd44780 - Sep 29 2011, 15:47
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|