Thông báo

Collapse
No announcement yet.

PIC_ADC_Visualbasic: nhờ mọi người giúp đỡ.

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • PIC_ADC_Visualbasic: nhờ mọi người giúp đỡ.

    Chào tất cả các bác ghé qua luồng của em. Nhờ mọi người chỉ giúp em mấy vấn đề sau:
    1. Em dùng con PIC 16F876 để đọc giá trị analog (analog: chân AN0, Vref: chân AN3): Khi chạy mạch thực thì em đã viết code lấy giá trị trung bình của 30 lần đo rồi mới hiển thị kết quả lên led 7 thanh mà sao kết quả nó cứ bị nhảy linh tinh với sai số là khoảng 5% - em dùng ADC 8 bit của PIC. Hỏi các bác hướng khắc phục để đạt được kết quả ổn định hơn.(Em lấy khoảng cách thời gian của mỗi lần lấy mẫu là 10ms có hợp lý ko vậy? theo kinh nghiệm của các bác thì khoảng thời gian lấy mẫu là bao nhiêu là hợp lý nhất, lấy giá trị trung bình bao nhiêu lần là được) và có thuật toán nào để lấy giá trị trung bình ổn định hơn ko ah?
    2. Kết quả đó em gửi lên Hyper teminal thì ko vấn đề, tuy nhiên khi gửi lên VB thì nó bị sai ký tự. Ví dụ: kết quả trên led 7 thanh là 1234 thì trên màn hình VB nó lại là các ký tự khác, cho dù e đã thiết lập tốc độ truyền trên VB là đúng rồi. trên VB em cho hiện thị trên một Text. Với lệnh là Text1.Text=MSComm.Input
    Code của em rút gọn (bỏ phần hiện thị lên led 7 thanh đây). Mong các bác chỉ giúp:
    #include "16F876.h"
    #define <16f876.h>
    #device adc=8
    #use delay(clock=16000000)
    #fuses HS, NOWDT, NOPROTECT,NOLVP, NOPUT,NODEBUG,NOCPD
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)

    unsigned char ketqua[30];
    float trung_binh;
    unsigned int16 lam_tron,dien_ap;

    main()
    {
    int8 x;
    set_tris_b(0b00000000);
    set_tris_c(0b00000000);

    setup_adc_ports(RA0_RA1_ANALOG_RA3_REF); // Cho RA0: analog, RA3:Vref
    setup_adc(ADC_CLOCK_INTERNAL); // Dung xung noi cho ADC
    set_adc_channel(0); // Set ket AN0
    enable_interrupts(GLOBAL); // Thiet lap ngat toan cuc
    enable_interrupts(INT_RDA); // Thiet lap ngat truyen thong

    while(true)
    {
    for(x=0;x<30;x++)
    {
    ketqua[x]=read_adc();
    delay_ms(10);
    }
    trung_binh = ((ketqua[0]+ketqua[1]+ketqua[2]+ketqua[3]+ketqua[4]+ketqua[5]+ketqua[6]+ketqua[7]+ketqua[8]+ketqua[9]+ketqua[10]+ketqua[11]+ketqua[12]+ketqua[13]+ketqua[14]+ketqua[15]+ketqua[16]+ketqua[17]+ketqua[18]+ketqua[19]+ketqua[20]+ketqua[21]+ketqua[22]+ketqua[23]+ketqua[24]+ketqua[25]+ketqua[26]+ketqua[27]+ketqua[28]+ketqua[29])/30); // Tinh trung binh cua 30 lan do.
    lam_tron=trung_binh*10;
    dien_ap=(lam_tron*1000)/2550; // 0V tuong ung voi gia tri 0, 5V tuong ung voi gia tri 1000;
    printf("%lu",dien_ap);
    }
    }


    Mong các bác chỉ giúp.!!!
    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
    http://diencongnghiep360.com/
    http://tudienhathe.vn/


  • #2
    -Vấn đề sai số: bạn thử lấy mẫu 10us xem sao(10 micro sec)
    - Vấn đề nhận sai ký tự trên Vb:
    + bạn set Mscomm.inputlen=0 thì sẽ dùng Text1.Text=MSComm.Input để hiển thị
    + nếu set Mscomm.inputlen=1 thì sẽ dùng Text1.Text=Text1.Text & MSComm.Input (MSComm1.RThreshold = 1)
    Cả thế giới đều nằm trong cuốn "Tự điển" do đó tôi rất thích điện tử

    Comment


    • #3
      Mình vừa nghĩ rằng ko biết có phải mình truyền giá trị điện áp bằng lệnh printf là truyền theo dạng chuỗi nên bị lỗi hay ko, hay là phải tách ra thành từng ký tự (nghìn, tram, chục, don vi) rồi dùng lệnh putc() để truyền từng số một ko. Mình đang ở quê nên ko mang theo mạch thật về để test thử ngay, bức xúc quá. Nhưng truyền bằng hyper terminal thì lại được.
      Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
      http://diencongnghiep360.com/
      http://tudienhathe.vn/

      Comment


      • #4
        Nguyên văn bởi vietthanh123 Xem bài viết
        Mình vừa nghĩ rằng ko biết có phải mình truyền giá trị điện áp bằng lệnh printf là truyền theo dạng chuỗi nên bị lỗi hay ko, hay là phải tách ra thành từng ký tự (nghìn, tram, chục, don vi) rồi dùng lệnh putc() để truyền từng số một ko. Mình đang ở quê nên ko mang theo mạch thật về để test thử ngay, bức xúc quá. Nhưng truyền bằng hyper terminal thì lại được.
        Hyper mà nhận được chứng tỏ kết nối phần cứng ok
        lỗi ở đây do phần mềm vb bạn thiết kế giao thức bắt tay chưa đúng vd như bạn kiểm tra tốc độ kết nối, handshaking, flowcontrol.vvv
        tiện đây tui gửi file vd giao tiếp cổng com = vb6 giao tiếp tốt cổng rs232
        congcom.rar
        Cả thế giới đều nằm trong cuốn "Tự điển" do đó tôi rất thích điện tử

        Comment


        • #5
          Phần chương trình của VĐK thì như mình đã up ở trên, và mình đã gửi lên được ở màn hình Hyper terminal. Còn đây là chương trình VB của mình. Bạn kiểm tra giúp mình với. Máy tính của mình ở nhà hiện ko cài đặt VB nên chưa thể tham khảo bài của bạn được.
          MOng bạn giúp đỡ.
          Visual basic - do dien ap.rar
          Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
          http://diencongnghiep360.com/
          http://tudienhathe.vn/

          Comment


          • #6
            Nguyên văn bởi vietthanh123 Xem bài viết
            Phần chương trình của VĐK thì như mình đã up ở trên, và mình đã gửi lên được ở màn hình Hyper terminal. Còn đây là chương trình VB của mình. Bạn kiểm tra giúp mình với. Máy tính của mình ở nhà hiện ko cài đặt VB nên chưa thể tham khảo bài của bạn được.
            MOng bạn giúp đỡ.
            Visual basic - do dien ap.rar
            code của bạn có chổ này:MSComm1.InputMode=1(binary mode)
            bạn phải đổi thành MSComm1.InputMode=0(text mode)
            Cả thế giới đều nằm trong cuốn "Tự điển" do đó tôi rất thích điện tử

            Comment


            • #7
              Nguyên văn bởi dtbinhtomay2 Xem bài viết
              code của bạn có chổ này:MSComm1.InputMode=1(binary mode)
              bạn phải đổi thành MSComm1.InputMode=0(text mode)
              uhm. Vậy mà mình ko nhìn ra. Mai mình sẽ test thử ngay, có vấn đề gì thì lại nhờ bạn và mọi người giúp đỡ.
              Cảm ơn bạn rất nhiều.
              Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
              http://diencongnghiep360.com/
              http://tudienhathe.vn/

              Comment


              • #8
                Mình đã sửa lại lỗi trên VB và tăng số lần lấy mẫu lên trước khi hiện thị. Kết quả đã rất thành công, sai số (độ nhảy của kết quả) nhỏ hơn 0.5%. Một lần nữa cảm ơn tất cả mọi người và đặc biệt là bạn dtbinhtomay2 rất nhiều.
                Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                http://diencongnghiep360.com/
                http://tudienhathe.vn/

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X