В этой статье рассказано, как создать свой цифровой вольтметр на микроконтроллере.
В качестве индикатора используется LCD на контроллере HD44780. Микроконтроллер, применяемый в этом проекте, имеет 12 входов/выходов, из которых 8 могут быть настроены как аналоговые входы для встроенного АЦП (аналого-цифрового преобразования). В качестве опорного напряжения для АЦП выбрано напряжение питания Vdd (+5V).
В этой статье рассмотрим измерение напряжения в пределах 0-20 В.
Т.к микроконтроллер не может принимать 20 В непосредственно на вход АЦП, для понижения напряжения используется простая схема делителя напряжения на резисторах.
Для питания схемы используется линейный регулятор напряжения +5В (7805 или 78L05).
Расчет АЦП
Точность измерений зависит от правильного расчета резисторов для делителя и стабильности линейного регулятора +5В. По формуле, приведенной выше рассчитываем значения для R1 и R2, это 1267 и 3890 Ом. Измеренная стабильность регулятора +5.02 В. Расчеты для АЦП:
0 - 5.02 V (опорное) ---> 0-1023 (10-бит АЦП, Digital Count )
==> Разрешение (5,02-0)/(1023-0)=0,004907 В/шаг
Va = 1267*Vin/(1267+3890) = 0.2457*Vin =>Vin= 4.07*Va = 4.07* Digital Count * 0.004907 = 0.01997 * Digital Count = 0.02*Digital Count (округлили) Чтобы избавиться от плавающих чисел рассчитаем входное напряжение как 2*Digital Count
Например, измеряемое напряжение Vin = 7.6V. Тогда, Va = 0.2457*Vin = 1.87V => Digital Count = 1.87/0.004907 = 381 => Рассчитанное через АЦП напряжение = 2*381 = 0762 = 07.6V (Первые 3 цифры из 4.)
Программа для микроконтроллера
Код для микроконтроллера написан на mikroC:
// подключаем LCD модуль
sbit LCD_RS at RC4_bit; sbit LCD_EN at RC5_bit; sbit LCD_D4 at RC0_bit; sbit LCD_D5 at RC1_bit; sbit LCD_D6 at RC2_bit; sbit LCD_D7 at RC3_bit; sbit LCD_RS_Direction at TRISC4_bit; sbit LCD_EN_Direction at TRISC5_bit; sbit LCD_D4_Direction at TRISC0_bit; sbit LCD_D5_Direction at TRISC1_bit; sbit LCD_D6_Direction at TRISC2_bit; sbit LCD_D7_Direction at TRISC3_bit;
char Message1[] = "Voltage"; unsigned int ADC_Value, DisplayVolt; char *volt = "00.0";
void main() { ANSEL = 0b00000100; // RA2/AN2 аналоговый вход ADCON0 = 0b00001000; // Выбран аналоговый вход @ AN2 ADCON1 = 0x00; CMCON0 = 0x07 ; // Отключаем компаратор
TRISC = 0b00000000; // PORTC Все Выход
TRISA = 0b00001100; // PORTA Все выходы, исключая RA3 и RA2 Lcd_Init(); // Инициализация LCD Lcd_Cmd(_LCD_CLEAR); // Очищаем дисплей Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,4,Message1); Lcd_Chr(2,10,'V');
do {
ADC_Value = ADC_Read(2); DisplayVolt = ADC_Value * 2; volt[0] = DisplayVolt/1000 + 48; volt[1] = (DisplayVolt/100)%10 + 48; volt[3] = (DisplayVolt/10)%10 + 48; Lcd_Out(2,5,volt); delay_ms(100); } while(1);
}
При перепечатке данного материала ссылка на сайт transistor.3dn.ru ОБЯЗАТЕЛЬНА! |