analogReference(INTERNAL) - шум

std
Offline
Зарегистрирован: 05.01.2012

Приветствую all, кто подскажет как с этим быть?

В устройстве питающемся от одной банки Li-Ion надо проверять заряд батареи, подключил делитель 130k+20k на один из входов, если запитать от 3.3 то стабильно на АЦП приходит около 416 (на меге328, то есть образец 1.1 В), но раз в 15-20 замеров (через каждые 200 мс) приходит либо ниже (от 390), либо сильно выше (до 450). Резюки новые китайские, на питание керамика 0.1 мкФ. Девайс никакой не шумящий, просто светодиодами мигает, никаких электродвигателей и т. п. нету. Мега работает без кварца на частоте 8 МГц.

Пока складываю в int 8 раз и потом делю на 8, т. о. выясняю среднее арифметическое. Есть ли ещё способы?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Можно выкидывать заведомо плохие значения, например, "отличающиеся от предыдущего среднего более чем на N", где N = 10-20 единиц АЦП... Чтобы не нарушать концепцию - можно измерения не выкидывать, а заменять этим самым значением "предыдущего среднего".

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Вы решили аппаратно  проблему? У меня как раз такая-же была. В моём случае были виноваты наводки. Резистор от аналогового пина контроллера "на землю" должен быть как можно ближе к самому контроллеру. Идеально вообще его распаять на плате ардуино, а не на дочерней плате.  И кстати номиналы делителя я бы взял поменьше. Например 50к /10к Тогда максимальное напряжение, подаваемое на делитель будет 6 вольт, это достаточно даже с учётом его зарядки.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

std пишет:

 

1. В устройстве питающемся от одной банки Li-Ion надо проверять заряд батареи,

2. подключил делитель 130k+20k на один из входов,

3. на питание керамика 0.1 мкФ.

4. Пока складываю в int 8 раз и потом делю на 8, т. о. выясняю среднее арифметическое. Есть ли ещё способы?

1. Давно избитая тема - меряем напряжения питания процессора...

Например тут 

http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

http://mk90.blogspot.com/2009/06/vcc.html

http://code.google.com/p/tinkerit/wiki/SecretVoltmeter

2. И не будет никакого делителя пожирающего ток батареи.

Проверено не 2560,  на ЮСБ питание гуляет (и это понятно), а на 9 Вольтах внешнего стоит как вкопанное

void setup(void)
  {
  Serial.begin(115200);
  }
    
void loop(void)
  {
  Serial.println (readVcc ());
  delay(1000);
  }

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  
 
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring
 
  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both
 
  long result = (high<<8) | low;
 
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

3. Я бы ещё кондёр на нижнее плечо делителя поставил (хотя из-за пунктов 1 и 2 уже не актуально)

4. По поводу среднего я уже писАл

http://arduino.ru/forum/proekty/dosvetka-v-teplitse#comment-49692