RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Các vấn đề ADC/DAC trong PIC

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

  • ngndangtan
    replied
    mà cái này biết khi nào là 8bit khi nào là 10 nhĩ thấy khi khai báo thì chỉ có 2 kiểu là cạnh trái và cạnh phải của 2 thanh ghi ADRESH và ADRESL thôi mà

    Leave a comment:


  • eethn
    replied
    phần hiển thị e đã test rồi,thử riêng chạy ok luôn.E nghĩ do cấu hình adc có vấn đề gì đó ,vẫn đang nghiên cứu theo datasheet của nó mà

    Leave a comment:


  • Zz_Bi_zZ
    replied
    Nguyên văn bởi eethn Xem bài viết
    e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ là dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.(E lập trình bằng C18)

    phần code hiển thị ra led 7 thanh:
    Code:
    #include "p18f4620.h"
    #include "delays.h"
    #include "adc.h"
    #pragma config OSC=HS, WDT=OFF
    
    const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int a,b,n,doC,dvi,chuc,tram;
    void convert(int a)
    {
    tram=a/100;
    a=a%100;
    chuc=a/10;
    dvi=a%10;
    }
    void hienthi() // quet led
    {
    for(n=0;n<10;n++)
    {
    PORTB=dig[dvi];
    PORTD=0x01;       //bat led 1
    Delay100TCYx(20);  // tre 100us
    PORTB=dig[chuc];
    PORTD=0x02;        // bat led 2
    Delay100TCYx(20);
    PORTB=dig[tram];
    PORTD=0x04;         // bat led 3
    Delay100TCYx(20);
    }
    }
     void main(void)
    {
    TRISB=0;  // chon cong B la cong ra
    TRISD=0;   // chon cong D la cong ra
    TRISAbits.TRISA0=1;  // chon cong A la cong vao
    ADCON0=0x03;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
    ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
    ADCON2bits.ACQT2=1;         //
    ADCON2bits.ACQT1=0;         //
    ADCON2bits.ACQT0=0;         //3 bits lua chon thoi gian thu thap du lieu TAD
    ADCON2bits.ADCS2=1;         //
    ADCON2bits.ADCS1=0;         //
    ADCON2bits.ADCS0=1;         //3 bits lua chon tan so chuyen doi
    Delay10TCY();
    
    
    b = ReadADC();
    doC = (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
    a = doC;
    convert((int)a);
    Delay10TCY();
    while(1)
    {
    b = ReadADC();
    doC = (b-558.558)/2.048;
    convert((int)a);
    hienthi();
    }
    }
    và phần ra LCD
    Code:
    #include "p18f4620.h"
    #include "delays.h"
    #include "adc.h"
    #pragma config OSC=HS, WDT=OFF
    
    char b,doC;
    long s;
    unsigned char i,li,lj,s1[10];
    
    #define rs LATDbits.LATD0
    #define rw LATDbits.LATD1
    #define en LATDbits.LATD2
    
    void delay (unsigned char time )             // ham co tac dung delay thoi gian lon
    	{
    	    for ( li=0 ; li<80; li++ )
    		for ( lj=0 ; lj<time; lj++)
    		{}
    	}
    
    
    	void lenh_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
    	{
    		LATC=s;
    		rs=0;			                        // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
    		rw=0;
    		en=1;
    		delay(1);
    		en=0;
    		delay(1); 
    	} 
    
    
    	void data_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
    	{
    		LATC=s;
    		TRISD=0xF8 ;		   					// cho 3 bit thap nhat duoc lam cong ra
    		rs=1;			            // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
    		rw=0;
    		en=1;
    		delay(1);
    		en=0;
    	}
    void main(void)
    {
    INTCON=0x00;
    TRISAbits.TRISA0=1;                      //cong A0 lam dau vao tu cam bien
    TRISC=0x00;                              //cong C lam cong ra du lieu
    TRISD=0xF8;                              //3 bit thap nhat lam cong ra dieu khien
    		lenh_LCD(0x38);					 // dua ra LCD gia tri hang cot la 5*7
    		lenh_LCD(0x0E);		    		 // hien con tro
    	//	lenh_LCD(0x01);					 // xoa man hinh LCD
    ADCON0=0x03;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
    ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
    ADCON2bits.ACQT2=1;         //
    ADCON2bits.ACQT1=0;         //
    ADCON2bits.ACQT0=0;         //3 bits lua chon thoi gian thu thap du lieu TAD
    ADCON2bits.ADCS2=1;         //
    ADCON2bits.ADCS1=0;         //
    ADCON2bits.ADCS0=1;         //3 bits lua chon tan so chuyen doi
    Delay10TCY();
    
    
    b = ReadADC();
    doC == (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
    s1[i]==doC;
    while(1)
    {  lenh_LCD(0x01);
       delay(500);
       data_LCD(s1[i]);
       data_LCD('d');
       data_LCD('o');
       data_LCD('C');
       delay(500);
    }
    }
    mạch mô phỏng ở file đính kèm
    Trước hết mới học PIC18F thì cần giải quyết các vấn đề sau :
    - Hiển thị ra led7D hoặc LCD 1 con số nào đó bất kỳ , vd 1234 . Nếu ok thì có nghĩa hàm display_LCD() hoặc hàm hienthi() k sai . Còn nếu k hiển thị đc thì
    1) Nếu LCD , chỉnh biến trở chỗ chân Vo để hiện thấy 1 dòng đen (Có khi chỉnh xong thấy đc số 1234 hiển thị mừng hết lớn ấy nhẩy) .
    2) Ktra đc mạch các chân RS , RW , E , các đường mạch chân d0-d7 có dính chỗ nào k ?
    3) Viết chương trình nhấp nháy 0-1 các chân RS , E ,RW , các chân d0-d7 xem VDK đã xuất dữ liệu đc k , đúng k ? Nếu k đúng thì xem lại khai báo set_tris_port hoặc khả năng lập trình HT_PIC có vấn đề
    4) Nếu Led7d , kiểm tra việc dùng hàm quét led vậy đúng k ? tốt nhất dùng delay để kiểm tra , trước khi dùng timer để quét để đảm bảo việc bật tắt các chân và xuất dữ liệu là đồng bộ .

    Sau khi khắc phục lỗi hàm hiển thị , thì chuyển sang kiểm tra hàm read_adc() , hoặc các khai báo khởi tạo ADC trứoc khi read_adc()

    Làm như rứa còn chưa ăn tiền đc ai , quất đống code rầm rầm vô đó , biết sai chỗ nào mà lần . đúng là điếc k sợ súng

    Leave a comment:


  • eethn
    replied
    bác nói rõ hơn đc k,e mới học nên chưa biết nhiều
    mô phỏng thành công chút xíu thì mới làm mạch thật chứ!

    Leave a comment:


  • bqviet
    replied
    Nó không chạy được bởi vì tống cả một đống mã nguồn vào, thay vì thử từng mô-đun nhỏ một, lại cộng thêm việc chạy mô phỏng chứ không phải mạch thật. Kiểu làm như vậy thì không bao giờ (trừ trường hợp cực kỳ may mắn) thành công được.

    Leave a comment:


  • eethn
    replied
    mọi người giúp phần adc hiển thị nhiệt độ ra led 7 seg hoặc lcd

    e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ là dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.(E lập trình bằng C18)

    phần code hiển thị ra led 7 thanh:
    Code:
    #include "p18f4620.h"
    #include "delays.h"
    #include "adc.h"
    #pragma config OSC=HS, WDT=OFF
    
    const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int a,b,n,doC,dvi,chuc,tram;
    void convert(int a)
    {
    tram=a/100;
    a=a%100;
    chuc=a/10;
    dvi=a%10;
    }
    void hienthi() // quet led
    {
    for(n=0;n<10;n++)
    {
    PORTB=dig[dvi];
    PORTD=0x01;       //bat led 1
    Delay100TCYx(20);  // tre 100us
    PORTB=dig[chuc];
    PORTD=0x02;        // bat led 2
    Delay100TCYx(20);
    PORTB=dig[tram];
    PORTD=0x04;         // bat led 3
    Delay100TCYx(20);
    }
    }
     void main(void)
    {
    TRISB=0;  // chon cong B la cong ra
    TRISD=0;   // chon cong D la cong ra
    TRISAbits.TRISA0=1;  // chon cong A la cong vao
    ADCON0=0x03;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
    ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
    ADCON2bits.ACQT2=1;         //
    ADCON2bits.ACQT1=0;         //
    ADCON2bits.ACQT0=0;         //3 bits lua chon thoi gian thu thap du lieu TAD
    ADCON2bits.ADCS2=1;         //
    ADCON2bits.ADCS1=0;         //
    ADCON2bits.ADCS0=1;         //3 bits lua chon tan so chuyen doi
    Delay10TCY();
    
    
    b = ReadADC();
    doC = (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
    a = doC;
    convert((int)a);
    Delay10TCY();
    while(1)
    {
    b = ReadADC();
    doC = (b-558.558)/2.048;
    convert((int)a);
    hienthi();
    }
    }
    và phần ra LCD
    Code:
    #include "p18f4620.h"
    #include "delays.h"
    #include "adc.h"
    #pragma config OSC=HS, WDT=OFF
    
    char b,doC;
    long s;
    unsigned char i,li,lj,s1[10];
    
    #define rs LATDbits.LATD0
    #define rw LATDbits.LATD1
    #define en LATDbits.LATD2
    
    void delay (unsigned char time )             // ham co tac dung delay thoi gian lon
    	{
    	    for ( li=0 ; li<80; li++ )
    		for ( lj=0 ; lj<time; lj++)
    		{}
    	}
    
    
    	void lenh_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
    	{
    		LATC=s;
    		rs=0;			                        // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
    		rw=0;
    		en=1;
    		delay(1);
    		en=0;
    		delay(1); 
    	} 
    
    
    	void data_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
    	{
    		LATC=s;
    		TRISD=0xF8 ;		   					// cho 3 bit thap nhat duoc lam cong ra
    		rs=1;			            // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
    		rw=0;
    		en=1;
    		delay(1);
    		en=0;
    	}
    void main(void)
    {
    INTCON=0x00;
    TRISAbits.TRISA0=1;                      //cong A0 lam dau vao tu cam bien
    TRISC=0x00;                              //cong C lam cong ra du lieu
    TRISD=0xF8;                              //3 bit thap nhat lam cong ra dieu khien
    		lenh_LCD(0x38);					 // dua ra LCD gia tri hang cot la 5*7
    		lenh_LCD(0x0E);		    		 // hien con tro
    	//	lenh_LCD(0x01);					 // xoa man hinh LCD
    ADCON0=0x03;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
    ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
    ADCON2bits.ACQT2=1;         //
    ADCON2bits.ACQT1=0;         //
    ADCON2bits.ACQT0=0;         //3 bits lua chon thoi gian thu thap du lieu TAD
    ADCON2bits.ADCS2=1;         //
    ADCON2bits.ADCS1=0;         //
    ADCON2bits.ADCS0=1;         //3 bits lua chon tan so chuyen doi
    Delay10TCY();
    
    
    b = ReadADC();
    doC == (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
    s1[i]==doC;
    while(1)
    {  lenh_LCD(0x01);
       delay(500);
       data_LCD(s1[i]);
       data_LCD('d');
       data_LCD('o');
       data_LCD('C');
       delay(500);
    }
    }
    mạch mô phỏng ở file đính kèm
    Attached Files

    Leave a comment:


  • shindo216
    replied
    các bạn cho mình hỏi mình có thể dùng MCP4922 để tạo mạch DAC ngõ ra 0-10V ko?

    Leave a comment:


  • bachphuong
    replied
    sử dụng pic để điều rộng xung pwm
    1, khởi tạo chân xuất pwm
    set_pwm_1(pwm)
    2, setting chu kỳ xung
    setup_timer1(a,b,c) // chuky = (4/f)*(a)(b+1)
    3, phat xung pwm
    set_pwm_duty(value) // độ rộng xung = (1/f)*value*a , suy ra độ rộng xung (max) khi chu kỳ = độ rộng xung , suy ra value = 4*(b+1)
    OK ---> VẬY LÀ BẠN ĐÃ TÌM ĐƯỢC VALUEMIN = 0 , VALUEMAX = 4*(B+1) NHÉ !!
    TỪ ĐÓ ĐƯA VÀO VÒNG LẶP FOR(J = 0 ; J < VALUEMAX ; J++)
    {
    SET_PWM_DUTY(J) ;
    DELAY_MS(10) ;
    }
    CHÚC THÀNH CÔNG ,

    Leave a comment:


  • vaa_dtvn
    replied
    Mọi người xem giúp em code ADC trên 12F683

    Em viết code này cho con 12F683 nhưng hình như là nó ko đọc được giá trị ADC! Em đã thử mô phỏng trên máy tính nhưng nó vẫn vậy, kể cả nạp vào mạch chạy thử!
    Code:
    #include <12F683.h>
    #device  *=16 ADC = 10
    #fuses NOMCLR, INTRC_IO,NOWDT,NOPROTECT, NOPUT, NOPROTECT, NOBROWNOUT, NOCPD
    #use delay (clock=8000000)
    int16  var1;
    
    
    void main()
    {
       setup_oscillator(OSC_8MHZ);
       SETUP_ADC(ADC_CLOCK_DIV_2);
       SETUP_ADC_PORTS(sAN1|VSS_VDD );
       delay_us(10);
       var1 = 0;
       while (true)
       {
             SET_ADC_CHANNEL(sAN1);
             delay_us(10);
             var1 = READ_ADC(ADC_START_AND_READ);
             delay_us(10);
             if (var1 >= 500)
             {
                output_high(pin_a4);
                delay_ms(100);
                output_low(pin_a4);
             }
             else
             {
                output_high(pin_a2);
                delay_ms(200);
                output_low(pin_a2);
             }
       }
    }

    Leave a comment:


  • caovanhuong
    replied
    Nguyên văn bởi luckystart Xem bài viết
    mấy bác cho em hỏi con pic của em cứ nạp là nó đơ,nghĩa là nó vẫn chạy chương trình cũ,vậy ko xóa được hả các bác?
    kiểm tra lại kết nối mạch nạp coi, phần mêm có nhận được PIC không.

    Leave a comment:


  • luckystart
    replied
    mấy bác cho em hỏi con pic của em cứ nạp là nó đơ,nghĩa là nó vẫn chạy chương trình cũ,vậy ko xóa được hả các bác?

    Leave a comment:


  • quangpci
    replied
    ai có gửi giúp em vào mail nhé!
    doquangdtvt@gmail.com

    Leave a comment:


  • quangpci
    replied
    cac bac ai co tai lieu noi ve con pic 18f4520 ko? cho e voi . e dang lam bao cao tot ngiep.ma khong co tai lieu ve no. tim mai chang dc. bac nao co cho em voi nha! tai lieu noi ve chac nang cac chan cua no ay.e dang can gap wa sap fai nop mat roi.

    Leave a comment:


  • letanminh
    replied
    chào các Anh!Nhờ mấy Anh chỉ dùm : khi đẩy dữ liệu từ pic8f4550 thông qua việc đọc ADC lên mấy tính để vể đò thị bầng C#.Em xin hỏi mấy Anh là dữ liệu đó sau khi đẩy vào máy tính thì nằm ở đâu và lấy như thế nào để vẻ ?Anh nào có tài liệu xin gửi cho Em với qua gmail : letanminhqn@gmail.com Em cảm ơn các Anh nhiều.

    Leave a comment:


  • rongconn2t
    replied
    không biết dòng dsPIC33 có DAC không nhỉ các bác. em muốn dùng DAC để làm cái MP3 mà .hì

    Leave a comment:

Về tác giả

Collapse

lick Tìm hiểu thêm về lick

Bài viết mới nhất

Collapse

Đang tải...