ADC trong PIC 16F877A là 10 bit
Mình nối 1 nguồn áp 1 chiều Vin vào chân AN0.Quan hệ giữa đầu ra của ADC và điện áp vào Vin là:
N=Vin*1024/Vref (ở đây mình chọn Vref=5V)
Mình lại có 1 biến E=500*Vin (1)
nên E=500*N*Vref/1024=2.44*N (2)
Vấn đề là khi mình đọc ADC (N =read_adc()

để tính E và hiển thị lên LCD thì giá trị tính được theo biểu thức (1), (2) và giá trị hiển thị trên LCD lại khác nhau khá nhiều(với 1 giá trị điện áp Vin).
Mình không hiểu mong mọi người trợ giúp
Dưới là code mình viết
Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD
#use rs232(baud=15200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
int8 low,high,dvi,chuc,tram,tg;
int value;
int8 E;
//Ham chuyen thanh ma de hien thi len LCD
//E<=10
void convert_bcd(int8 a)
{ a=a+0x30;
LCD_putchar(a);
}
//E<=100
void convert_bcd1(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang chuc
low = low + 0x30;
high = high + 0x30;
LCD_putchar(high);
LCD_putchar(low);
}
//E>100
void convert_bcd2(int8 y)
{
dvi=y%10;
tg=y/10;
chuc=tg%10;
tram=tg/10;
dvi=dvi+0x30;
chuc=chuc+0x30;
tram=tram+0x30;
LCD_putchar(tram);
LCD_putchar(chuc);
LCD_putchar(dvi);
}
void main()
{
trisb = 0x00;
portb=0x00;
LCD_init();
LCD_putcmd(0x82);//Dinh vi tri con tro de hien thi
delay_us(100);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(100);
value =read_adc();
//Gia tri cua cuong do anh sang E
E=2.44*value;
If(E<=10)
convert_bcd((int8)E);
Else
{
If((E>10)&&(E<=100))
convert_bcd1((int8)E);
Else
convert_bcd2((int8)E);
delay_ms(100);
}
}
Thanks