Я пытаюсь измерить напряжение батареи 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
он варьируется от 0 до 1023, это должно выглядеть так:
batteryVoltage = (adcReading * 30) / 1023
Однако обратите внимание, что такое обозначение напряжения целыми вольтами даст вам только 31 возможное значение (от 0 до 30). Более полезный результат может быть в милливольтах:
batteryVoltageMillivolts = (adcReading * 30000) / 1023
Обратите внимание, что в этом случае batteryVoltageMillivolts
должен быть long
, а не int
.
@Mahmoud - в зависимости от разрешения вашего АЦП (10 бит, 12 бит?) Я бы хотел разделить на 10, используя ваш резисторный делитель - так что 32 В == 3,2 В на АЦП
Это дает возможный диапазон 50 В == 5,0 В на АЦП, поэтому нет перегрузки входа.
Для 10-битного АЦП это дает разрешение 0,049 В для входа 50 В.
Если вам нужно немного больше точности, разделите на 35 В == 5,0 В на входе, что дает разрешение 0,034 В.
pjc50
Махмуд
Ник Джонсон
Махмуд