Mã:
void ADC_Init()
{
ADCSRA |= ((1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)); //Kích hoạt ADC, Chọn hệ số chia tần số là 64
ADMUX = INTRERNAL_MODE; // Chọn điện áp tham chiếu nội 2,56v
}
Tiếp theo chúng ta có thể tiến hành đọc điện áp trên các kênh ADC.
Mã:
unsigned int ADC_READ(unsigned char ADC_Chanel)
{
ADMUX = INTRERNAL_MODE|ADC_Chanel; //Chọn kênh ADC
ADCSRA |= (1<<ADSC); // Bắt đầu quá trình chuyển đổi
loop_until_bit_is_set(ADCSRA,ADIF); // đợi đến khi cờ ADIF báo quá trình chuyển đổi hoàn tất
ADCSRA|=(1<<ADIF); // Xóa cờ báo
return ADCW; // trả về giá trị mà ADC đọc được
}
Để hiển thị kết quả ra màn hình ta dùng LCD. Các sử dụng và thư viện của LCD mình đã trình bày ở bài trước.
Mã:
while (1)
{
unsigned int ADC_UValueAverage=0, ADC_IValueAverage=0;
for (unsigned char i=0;i<20;i++)
{
unsigned int ADC_UValue;
ADC_UValue= ((ADC_READ(0)*(2.56/1024)*((R1+R2+R6)/R1))*100); // nhân với 100 để lấy 2 chữ số sau dấu phẩy
ADC_UValueAverage +=ADC_UValue;
_delay_ms(10);
unsigned int ADC_IValue;
ADC_IValue= (((ADC_READ(1)*(2.56/1024))/((R3*R4)/(R3+R4)))*100);
ADC_IValueAverage += ADC_IValue;
_delay_ms(10);
}
ADC_IValueAverage = ADC_IValueAverage/20;
ADC_UValueAverage = ADC_UValueAverage/20;
unsigned char ADC_Value_V=ADC_UValueAverage/100;
unsigned char ADC_Value_mV=ADC_UValueAverage%100;
LCD_Gotoxy(0,0);
LCD_Puts("Volgate:");
LCD_PutChar((ADC_Value_V/10)+48);
LCD_PutChar((ADC_Value_V%10)+48);
LCD_PutChar('.');
LCD_PutChar((ADC_Value_mV/10)+48);
LCD_PutChar((ADC_Value_mV%10)+48);
LCD_PutChar('V');
unsigned char ADC_Value_A=ADC_IValueAverage/100;
unsigned char ADC_Value_mA=ADC_IValueAverage%100;
LCD_Gotoxy(0,1);
LCD_Puts("Current:");
LCD_PutChar((ADC_Value_A/10)+48);
LCD_PutChar((ADC_Value_A%10)+48);
LCD_PutChar('.');
LCD_PutChar((ADC_Value_mA/10)+48);
LCD_PutChar((ADC_Value_mA%10)+48);
LCD_PutChar('A');
}
Như vậy là bạn đã có thể đo được dòng điện và điện áp với VĐK.