PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   ai biết đo adc 2 kênh ko giúp mình với (http://www.picvietnam.com/forum/showthread.php?t=33775)

duykhanhuctdt4 13-09-2014 07:58 PM

ai biết đo adc 2 kênh ko giúp mình với
 
Mình định đo adc 2 kênh nhưng khi viết code nếu setup kênh nào sau thì chỉ đo đc adc kênh đó thôi .ai giúp mình đây là code của mình
NHƯ CODE Ở DƯỚI THÌ CHỈ ĐO ĐC ADC CỦA KÊNH AN1 THÔI
#include <16f877a.h>
#device adc=10
#include <def_877a.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20M)
#include <lcd_lib_4bit.c>
unsigned int16 nghin, tram, chuc, donvi, adc;
float value;
#int_timer0
void interrupts_timer0()
{
TMR0IF = 0;
}

void hienthi(unsigned int16 giatri)
{
nghin=giatri/1000;
tram=(giatri-nghin*1000)/100;
chuc=(giatri-nghin*1000-tram*100)/10;
donvi=giatri%10;
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(donvi+48);
lcd_putchar(" ");
}
void doc_adc_0(void)
{
set_adc_channel(0);
delay_us(10);
value=read_adc();
adc=(value*2200)/1023;
}
void doc_adc_1(void)
{
lcd_putcmd(0xc0);
set_adc_channel(1);
delay_us(10);
value=read_adc();
adc=(value*4500)/1023;
}
void main()
{

set_tris_a(0x01);
set_tris_d(0x00);
lcd_init();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(6);
enable_interrupts(int_timer0);
setup_adc_ports(all_analog);
setup_adc(adc_clock_internal);
while(true)
{
doc_adc_0();
delay_ms(100);
doc_adc_1();
lcd_putcmd(0x80);
lcd_putchar(" adc: ");
hienthi(adc);
}
}
thank nha

hatuan296 17-09-2014 11:11 PM

Bạn chú ý chổ này . Sau khi đọc giá trị ADC kênh 0 xong thì nên lưu riêng giá trị ra một biến . VD ADC0_value . Sau đó mới set cho đọc kênh 1 . Cũng lưu riêng giá trị ra . VD ADC1_value . Sau đó mới xuất cả hai ra giá trị ra LCD .
Theo như code của bạn thì sau khi đọc giá trị ADC thì đều lưu vào cùng 1 biến nên giá trị kênh 0 sẽ bị thay thế bằng giá trị của kênh 1 được đọc liền sau đó .

Hoặc bạn cũng có thể đọc giá trị kênh 0 xong và xuất ra LCD liền rồi sau đó mới tiếp tục đọc kênh 1 và xuất ta LCD .

Code:

while(true)
  {
      doc_adc_0();
      delay_ms(100);
      doc_adc_1();
      lcd_putcmd(0x80);
      lcd_putchar(" adc:  ");
      hienthi(adc);
  }
}



Múi giờ GMT. Hiện tại là 08:19 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam