Измерение 32В с помощью АЦП Atmega8

Я пытаюсь измерить напряжение батареи 30 В, используя АЦП AVR Atmega8, AVCC подключен к 5 В.

Подключил подходящий делитель напряжения: R1 270к, R2 10к. Результат, который я получаю, вообще неверен, при 30 В я получаю 23 В. Я использую уравнение batteryvoltage = 5*1023/adcReading.

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
unsigned int adcReading = 0;

adcReading = read_adc(0);
batteryVoltage = 5*1023/adcReading;
Почему вы делите на adcReading?
@ pjc50, чтобы получить полное представление о батарее?
adcReading должен быть числителем, а не знаменателем. При такой конфигурации результат будет уменьшаться с увеличением напряжения.
@NickJohnson Результат всегда равен нулю ... Как я могу изменить его, чтобы результат увеличивался с уменьшением напряжения?

Ответы (2)

Ваш расчет напряжения батареи неверен. Предполагая, что adcReadingон варьируется от 0 до 1023, это должно выглядеть так:

batteryVoltage = (adcReading * 30) / 1023

Однако обратите внимание, что такое обозначение напряжения целыми вольтами даст вам только 31 возможное значение (от 0 до 30). Более полезный результат может быть в милливольтах:

batteryVoltageMillivolts = (adcReading * 30000) / 1023

Обратите внимание, что в этом случае batteryVoltageMillivoltsдолжен быть long, а не int.

Не могли бы вы помочь мне с проблемой делителя напряжения, пожалуйста? думаю тоже влияет..
Какая проблема с делителем напряжения? Вы не указали его в вопросе.
Я указал R1 = 50 кОм, R2 = 10 кОм, это дает 5 В при 30 В, но все же вывод неверен, используя ваши уравнения выше.
Вы сказали, что R1 = 270k выше! Каковы фактические показания вольтметра на входном контакте АЦП?
Вы хотите убедиться, что делитель допускает некоторое «переполнение» - если вы хотите измерить 32 В, но ваше входное напряжение АЦП составляет 5 В (т.е. максимальное) при 30 В, у вас возникнут проблемы!
@ Эндрю, да, я хотел бы обеспечить некоторое переполнение, а также предотвратить его.

@Mahmoud - в зависимости от разрешения вашего АЦП (10 бит, 12 бит?) Я бы хотел разделить на 10, используя ваш резисторный делитель - так что 32 В == 3,2 В на АЦП

Это дает возможный диапазон 50 В == 5,0 В на АЦП, поэтому нет перегрузки входа.

Для 10-битного АЦП это дает разрешение 0,049 В для входа 50 В.

Если вам нужно немного больше точности, разделите на 35 В == 5,0 В на входе, что дает разрешение 0,034 В.

это 10 бит AVR Atmega8