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

 
 
> ATtiny25 - АЦП в биполярном режиме.
kv_addr
сообщение Apr 25 2011, 13:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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мВ (для моего случая) - должен бы тем более.

Все же хотелось бы узнать на сей счет соображения других участников форума.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kv_addr
сообщение Apr 29 2011, 15:25
Сообщение #2


Местный
***

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



Вобщем, с измерением смещения какие-то не совсем понятные грабли. Но, вроде как можно обойтись и без этого. Проверял смещение на нескольких различных образцах tiny25 и tiny45, оно небольшое, мало изменяется от температуры, его можно учесть один раз в процессе калибровки, а если учесть то, что достаточно 8 бит, то все вполне укладывается в предъявляемые требования.

Возникла иная проблема. Вот фрагмент тестовой программы (IAR). Задействовано прерывание от АЦП для пробуждения по завершению измерения и прерывание по сравнению от Таймера1 для побуждения и проведения измерения. Интервалы 0,25 сек.
Код
...
#pragma vector = TIM1_COMPA_vect
__interrupt void tim1_compa(void)
{
}
...
#pragma vector = ADC_vect
__interrupt void adc(void)
{
}
...
  for(;;) // Главный цикл.
  {
    int I,U;
    ADCSRB |= (1<<BIN); // Биполярный режим
    ADMUX = I_ADC; // Ток
//  __delay_cycles(250000);
// ADCSRA &= (0<<ADEN);
    __sleep(); // спать до прерывания от таймера (0,25сек)
// ADCSRA |= (1<<ADEN);
    MCUCR = Noise_Reduction_Mode;
    ADCSRA |= (1<<ADSC); // Start_Conv;
    __sleep(); // спать до прерывания от АЦП
    MCUCR = Idle_Mode;
    I = ADC;
    Int_LED(I/64); // Вывод на СИД
    ADCSRB &= (0<<BIN); // Униполярный режим
    ADMUX = U_ADC; // Напряжение
//  __delay_cycles(250000);
// ADCSRA &= (0<<ADEN);
    __sleep(); // спать до прерывания от таймера (0,25сек)
// ADCSRA |= (1<<ADEN);
    MCUCR = Noise_Reduction_Mode;
    ADCSRA |= (1<<ADSC); // Start_Conv;
    __sleep(); // спать до прерывания от АЦП
    MCUCR = Idle_Mode;
    U = ADC;
    Int_LED(U); // Вывод на СИД
  }


В этом фрагменте заремлены программные задержки. Если их разремить и заремить рядом стоящие __sleep, все работает корректно. Если разремить до и после __sleep запрет и разрешение прерывания от АЦП, пробуждение от таймера происходит нормально. А вот в представленном выше виде происходит досрочное пробуждение от АЦП, хотя по логике его быть не должно. Т.е. вместо таймера пробуждает АЦП, если на это время его не запрещать совсем.

И с чего бы это АЦП пробуждать, если цикл измерения уже полностью отработан до того?
Может кто даст объяснение, почему такое может происходить?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:50
Рейтинг@Mail.ru


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