View Single Post
Old 22-04-2010, 12:53 PM   #1
kiemsi_88
Nhập môn đệ tử
 
Tham gia ngày: Nov 2009
Bài gửi: 5
:
Giúp giải đáp thắc mắc về ADC

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

thay đổi nội dung bởi: namqn, 22-04-2010 lúc 01:09 PM. Lý do: định dạng code
kiemsi_88 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn