|
Влияние каналов АЦП друг на друга?, ATMega16 |
|
|
|
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
Эскизы прикрепленных изображений
 РЈРСеньшено Р Т‘Р С• 54%
371 x 287 (9.2 килобайт)
|
 РЈРСеньшено Р Т‘Р С• 54%
371 x 287 (7.99 килобайт)
|
 РЈРСеньшено Р Т‘Р С• 87%
1298 x 927 (19.97 килобайт)
|
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|