analogReference(INTERNAL) - шум
- Войдите на сайт для отправки комментариев
Ср, 13/11/2013 - 17:41
Приветствую all, кто подскажет как с этим быть?
В устройстве питающемся от одной банки Li-Ion надо проверять заряд батареи, подключил делитель 130k+20k на один из входов, если запитать от 3.3 то стабильно на АЦП приходит около 416 (на меге328, то есть образец 1.1 В), но раз в 15-20 замеров (через каждые 200 мс) приходит либо ниже (от 390), либо сильно выше (до 450). Резюки новые китайские, на питание керамика 0.1 мкФ. Девайс никакой не шумящий, просто светодиодами мигает, никаких электродвигателей и т. п. нету. Мега работает без кварца на частоте 8 МГц.
Пока складываю в int 8 раз и потом делю на 8, т. о. выясняю среднее арифметическое. Есть ли ещё способы?
Можно выкидывать заведомо плохие значения, например, "отличающиеся от предыдущего среднего более чем на N", где N = 10-20 единиц АЦП... Чтобы не нарушать концепцию - можно измерения не выкидывать, а заменять этим самым значением "предыдущего среднего".
Вы решили аппаратно проблему? У меня как раз такая-же была. В моём случае были виноваты наводки. Резистор от аналогового пина контроллера "на землю" должен быть как можно ближе к самому контроллеру. Идеально вообще его распаять на плате ардуино, а не на дочерней плате. И кстати номиналы делителя я бы взял поменьше. Например 50к /10к Тогда максимальное напряжение, подаваемое на делитель будет 6 вольт, это достаточно даже с учётом его зарядки.
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