2016-12-18 21 views
0

Используя Arduino Mini Pro 3.3V, я просто наткнулся на проблему при переключении между опорным напряжением «ВНУТРЕННИЙ» и «ПО УМОЛЧАНИЮ» для АЦП. Я хочу измерить выход делителя напряжения [GND - 110kOhm - A2 - 500kOhm - VCC] для расчета VCC. VCC измеряется как 3,3 В. Он обеспечивается регулятором напряжения.Arduino Mini Pro 3.3V не использует внутреннюю ссылку 1.1V для ADC

В цикле я сначала измеряю выход делителя напряжения с внутренним эталоном, а затем с помощью задания по умолчанию по умолчанию. Я видел примеры кода, где люди рекомендуют ждать несколько миллисекунд перед чтением следующего значения, а (analogReference() documentation) рекомендует игнорировать первые показания после вызова analogReference(). Я следую этим рекомендациям.

я приведу минимальный пример эскиза:

// the setup function runs once when you press reset or power the board 
void setup() 
{ 
    pinMode(A2, INPUT); // ADC pin 
    Serial.begin(9600); 
    Serial.println("----------------"); 
} 

void burn8Readings(int pin) 
{ 
    for (int i = 0; i < 8; i++) 
    { 
    analogRead(pin); 
    } 
} 

// the loop function runs over and over again forever 
void loop() 
{ 
    uint16_t nResult1, nResult2; 

    analogReference(INTERNAL); // set the ADC reference to 1.1V 
    delay(10);     // idle some time 
    burn8Readings(A2);   // make 8 readings but don't use them to ensure good reading after ADC reference change 

    nResult1 = analogRead(A2); // read actual value 

    analogReference(DEFAULT);  // set the ADC reference back to internal for other measurements 
    delay(10);     // idle again 
    burn8Readings(A2);   // make 8 readings but don't use them to ensure good reading after ADC reference change 

    nResult2 = analogRead(A2); // do other measurements 

// print result to serial interface.. 
    Serial.print("1: "); 
    Serial.print(nResult1); 
    Serial.print(" - 2: "); 
    Serial.println(nResult2); 

    delay(2000); 
} 

Первая пара результатов АЦП кажется правильным (553/184), но в следующих итераций первое значение неисправна без изменения фактического напряжения на контакт ADC. (240/183) Результат ADC для ссылки DEFAULT всегда прекрасен.

Для справки 2,56 В было бы целесообразно использовать значение 240. Я знаю, что некоторые ATmegas использовать опорный 2.56V напряжение, но ATmega328 должен иметь только 1.1V. Странно, что (ATmega328/P datasheet) упоминает ссылку 2.56V в примере АЦП в главе 28.7, поэтому я запутался.

Есть ли возможность использования АЦП 2,56 В в определенной версии ATmega328p?

+1

Только один комментарий: почему вы должны изменить источник опорного напряжения во время выполнения? Я думаю, что если ваше приложение требует точной ссылки, вы должны настроить его на внутренние для всех своих мер (и поэтому установите ссылку в настройке и никогда не меняйте ее) – frarugi87

+0

В моем минимальном примере эскиза я просто измерил VCC дважды. Там я должен признать, что я не знаю причины, почему для переключения опорного напряжения. В моем фактическом приложении я хочу прочитать другие датчики, которые действуют как разделитель напряжения между GND и VCC. Используя ту же VCC, как опорное напряжение АЦП позволяет мне интерпретировать результаты измерений независимо от фактического VCC. – random

+0

, а затем вам также нужно что-то измерить с более стабильной ссылкой. Это вполне разумно.Спасибо – frarugi87

ответ

0

Оказывается, сходство с 2.56V было совпадением и, вероятно, ошибкой в ​​техническом описании (или в моем понимании). Проблема заключалась в том, что после вызова analogReference (INTERNAL) значение ADC должно быть немедленно прочитано! Не через несколько миллисекунд, как я это сделал. (Source)

Все еще важно также подождать несколько миллисекунд после выполнения фиктивного считывания. Для меня достаточно одного считывания и задержки (5), но я думаю, это зависит от заряда, оставшегося в конденсаторе АЦП: Поэтому я бы рекомендовал более высокие задержки.

Правильная последовательность:

analogReference(INTERNAL); // set the ADC reference to 1.1V 
    burn8Readings(A2);   // make 8 readings but don't use them 
    delay(10);     // idle some time 
    nResult1 = analogRead(A2); // read actual value 

и

analogReference(DEFAULT);  // set the ADC reference back to internal 
    burn8Readings(A2);   // make 8 readings but don't use them 
    delay(10);     // idle again 
    nResult2 = analogRead(A2); // read actual value 

Изменение ссылки обратно по умолчанию, как представляется, в меньшей степени подвержены ... но, по крайней мере, один отсчет до сих пор было необходимо для точных результатов.

Я надеюсь, что никто не должен тратить время на это больше ...