|
ATtiny25 - АЦП в биполярном режиме. |
|
|
|
Apr 25 2011, 13:37
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279

|
Для измерения втекающего/вытекающего тока была выбрана схема согласно вложенного файла. Rш - измерительный шунт, R и C - интегрирующее звено с частотой среза < 4 кГц. Был выбран дифференциальный канал (MUX3...0 = 0111) с предусилением 20x в биполярном режиме (BIN = 1). Опорное напряжение Vref = 1,1В. Согласно Атмелу ни на прямом, ни на инверсном входах напряжение не должно быть ниже Vgnd. Т.е., при измерении двунаправленного тока оба входа должны бы иметь определенную подтяжку относительно земли, чтобы ни при каких условиях не возникало ситуации, когда на одном из них появляется отрицательное напряжение относительно земли. В моем случае это несколько неудобно. Наиболее подходящим для схемотехники был бы вариант, когда один из концов шунта сидит на земле. Конечно, можно было бы в разрыв между инверсным входом и землей вставить резистор с сопротивлением R и оба входа подтянуть к питанию дополнительными резисторами, чтобы обеспечить достаточное смещение (при Vref = 1,1В это >55мВ), но по определенным соображениям этого делать бы не хотелось. Но так ли обязательна подтяжка? Для моего случая в контроллере перед АЦП стоит дифференциальный предусилитель на 20x. Многие операционники и дифференциальные усилители с однополярным питанием вполне неплохо себя чувствуют при небольших отрицательных напряжениях на их входах. В моем случае это напряжение не будет превосходить -55мВ. Специально провел эксперимент, выбрав опорное в 2,56В, т.е. дифференциальное напряжение доходит до +/- 128мВ на весь диапазон. Проверил линейность АЦП при помощи В7-40. В обе стороны она в пределах нормы. Симметрия соблюдалась не смотря на то, что для отрицательных напряжений на прямом входе был минус относительно земли. Если АЦП ведет себя вполне адекватно при минус 128мВ, то при минус 55мВ (для моего случая) - должен бы тем более. Все же хотелось бы узнать на сей счет соображения других участников форума.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Apr 25 2011, 22:02
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279

|
Да, уж... Обнаружились абсолютно непонятные грабли. Опишу ниже. Итак, контроллер ATtiny25, 5В питание, 1Мгц от внутреннего RC (с предделением на 8), АЦП - дифференциальный канал, 125кГц, MUX3...0 = 0111, усиление 20, (+)ADC2, (-)ADC3. Выбран биполярный режим (BIN = 1), оба входа подключены непосредственно к земле. При внутреннем опорном 2,56В показывает +2...3, что соответствует приблизительно +2,5...3,8мВ смещения. При опорном 1,1В показывает +5...7, что соответствует +2,7...3,8мВ смещения. Вроде как вполне согласуется для разых опорных. Было бы неплохо учесть это смещение. Для этого есть возможность - MUX3...0 = 0101, оба входа усилителя внутри контроллера коммутируются на ADC2. Т.е. таким образом можно компенсировать смещение при измерении, вычитая это значение. Хорошо, выбираем MUX = 0101, смотрим отсчеты и... офигеваем. Вместо положенных +5...7 при 1,1В опоры имеем -29...35, при 2,56В опоры получаем соответственно -11...12. Совершенная чертовщина. Во избежание лишних вопросов - пуллапов нет, утечек на плате нет, при коммутации каналов - дополнительные задержки 0,1 сек вставлены, без разницы, как определяется завершение преобразования, то ли со sleep и прерыванием, то ли по опросу ADIF, все равно грабли одни и те же. Мало того, если выбираю усиление 1x, (MUX = 0110) и (MUX = 0100), показывает уже смещение -11 и -17 для 2,56В, -23 и -31 для 1,1В соответственно. Пробовал давать на оба соединенных вместе входа через делитель положительное смещение порядка 0,5В для всех вышеприведенных ситуаций - картина совершенно не меняется. Вот такие пироги...  PS: Перепаял контроллер, поставил другой экземпляр. Цифры несколько поменялись, но все равно фигня. Для 1,1В опоры замкнутые снаружи входы дают смещение +11...13, замкнутые внутри контроллера дают -19...23. Ерунда... Может кто даст подсказку, почему АЦП так себя ведет, возможно есть моя ошибка, в чем она заключается?
|
|
|
|
|
May 6 2011, 14:23
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(kv_addr @ Apr 25 2011, 21:02)  Итак, контроллер ATtiny25, 5В питание, 1Мгц от внутреннего RC (с предделением на 8), АЦП - дифференциальный канал, 125кГц, MUX3...0 = 0111, усиление 20, (+)ADC2, (-)ADC3. Выбран биполярный режим (BIN = 1), оба входа подключены непосредственно к земле. При внутреннем опорном 2,56В показывает +2...3, что соответствует приблизительно +2,5...3,8мВ смещения. При опорном 1,1В показывает +5...7, что соответствует +2,7...3,8мВ смещения. Вроде как вполне согласуется для разных опорных А как вы так считали, не учитывая Ку? Ку=20, тогда смещение 0.5..0.75мВ в обоих случаях
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 6 2011, 15:21
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279

|
Цитата(=GM= @ May 6 2011, 17:23)  А как вы так считали, не учитывая Ку? Ку=20, тогда смещение 0.5..0.75мВ в обоих случаях Да, конечно, именно эти значения, при написании там у меня вкралась досадная ошибка. Любая перепроверка ее выявила бы. Собственно говоря, именно эти значения потом и использовал. Но ввиду особенностей движка форума в том посте исправить ошибку не представляется возможным.  Цитата(stells @ May 6 2011, 17:24)  в книжке Евстифеева написано: "...при смене канала с дифференциальным входом первое измерение следует производить не ранее, чем через 125мкс после выборки канала. Указанное время требуется для установления значения коэффициента усиления предусилителя..." Собственно говоря, практические результаты дают тот же порядок чисел. Вот пример основного фрагмента тестовой программы, где все утрясено, попеременно через 1/8 сек измеряются ток и напряжение: Код int Get_ADC(char mode) // Подпрограмма цикла измерения { ADMUX = mode; MCUCR = 0xE0; // Idle Sleep ADCSRA &= 0xF7; // Запрет прерывания от АЦП __sleep(); // спать до прерывания от таймера (период - 0,125сек) ADCSRA |= 0x08; // Разрешение прерывания от АЦП MCUCR = 0xE8; //ADC Sleep __sleep(); // запустить АЦП и спать до прерывания return ADC; }
for(;;) // Главный цикл. { ADCSRB |= 0x80; // Биполярный дифференциальный режим с предусилением 20 int I = Get_ADC(0xB7); // Ток Int_LED(I/64); // Вывод на СИД ADCSRB &= 0x7F; // Униполярный одновходовый режим int U = Get_ADC(0x91); // Напряжение Int_LED(U); // Вывод на СИД }; Все коммутации в АЦП и предусилителе производятся задолго до цикла измерения.
|
|
|
|
Сообщений в этой теме
kv_addr ATtiny25 - АЦП в биполярном режиме. Apr 25 2011, 13:37 stells Цитата(kv_addr @ Apr 25 2011, 17:37) Если... Apr 25 2011, 13:44 arisov Цитата(stells @ Apr 25 2011, 17:44) не та... Apr 25 2011, 15:38  stells Цитата(arisov @ Apr 25 2011, 19:38) Дайте... Apr 25 2011, 16:07 kv_addr Вобщем, с измерением смещения какие-то не совсем п... Apr 29 2011, 15:25 kv_addr С истинными причинами проблемы разобрался, тема за... May 4 2011, 18:44 GDI Огласили бы эти истинные причины, интересно же. May 6 2011, 08:46 kv_addr Цитата(GDI @ May 6 2011, 11:46) Огласили ... May 6 2011, 11:40  stells Цитата(kv_addr @ May 6 2011, 15:40) 1) Пр... May 6 2011, 14:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|