Hỏi về ADC 10 bit

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • 000007
    Nhập môn đệ tử
    • Dec 2008
    • 3

    #1

    Hỏi về ADC 10 bit

    Em mới tìm hiểu PIC, em muốn viết một chương trình sử dụng ADC để hiển thị các mức điện áp 0-5v với nhiều đường vào từ AN0-AN4 (tất cả các đầu vào đều được cấp 1 nguồn điện áp riêng rẽ) của pic6F876a lên 1 LCD 16x2. Mọi người có thể giúp em thuật toán quét ADC để có thể nhận kết quả từ tất cả các đầu vào AN0-AN4 lên LCD được không ạ?
  • ketxanh
    Đệ tử 3 túi
    • Aug 2008
    • 53

    #2
    bạn muốn đo đường nào thì settup đường đó, đo nhieeuf đường thì cứ settup lần lượt.set đường này đo lấy két quả xong lưu lại, set và đo đường tiếp theo....
    Hãy cho trước khi nhận

    Comment

    • LeDuc
      Đệ tử 6 túi
      • Mar 2007
      • 150

      #3
      Nguyên văn bởi 000007 View Post
      Em mới tìm hiểu PIC, em muốn viết một chương trình sử dụng ADC để hiển thị các mức điện áp 0-5v với nhiều đường vào từ AN0-AN4 (tất cả các đầu vào đều được cấp 1 nguồn điện áp riêng rẽ) của pic6F876a lên 1 LCD 16x2. Mọi người có thể giúp em thuật toán quét ADC để có thể nhận kết quả từ tất cả các đầu vào AN0-AN4 lên LCD được không ạ?
      Theo tôi thì bạn nên viết một hàm con đọc AD cùa 1 kênh , khi nào cần đọc kênh nào chỉ cần gọi tên tên hàm ứng với kênh Ad đó . Nếu bạn muốn quét hết thì chỉ cần 1 vòng lặp đọc tất cả các kênh thôi .
      vi du : với phần mềm CCS
      Code:
      unsigned int doc_ad(unsigned int x)
      {
         unsigned int AD=0;
         set_adc_channel(x);
         delay_us(10);
         AD=read_adc();
         return AD;
      }
      void main()
      {
         ......// khởi động AD 
         while(true)
      {
          unsigned int i,j;
          ....                           // khi có yêu cầu 
          for(i=0;i<5;i++)         // đọc 5 kênh AD từ kênh 0 đến kênh 4 
          {
               j=doc_ad(i);
               .......               // hiển thị giá trị AD j ra LCD 
          }
      }
      }
      _________________________________________________
      Le Trung Duc
      Industry Research & Application Center
      NTT Institute of Hi_technolog
      ltduc@ntt.edu.vn
      leduc_cktd@yahoo.com.vn
      http://www.nttc.edu.vn
      CNC DIY : http://quangcaosanpham.com/shop/driverservo
      0909300332

      Comment

      • letrongdtk4
        Nhập môn đệ tử
        • Jun 2008
        • 10

        #4
        Hix . Em mới tìm hiểu về 18f4431 và cũng đang mắc đoạn này nè !
        Bài toán của em cũng là chuyển đổi ADC từ AN0 - AN5 và hiển thị trên LCD
        Em sử dụng ADC 10 bit trong 18f4431
        Nếu là chuyển đổi 1 kênh thì em được rùi nhưng khi chuyển đổi nhiều kênh thì ......
        Em viết chương trình con khi chuyển đổi ADC là như thế này :
        // CHUYEN DOI ADC ------------------------------------------------------------
        //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

        VOID CHUYEN_DOI_ADC(VOID)
        {
        INT8 I;
        FOR(I=0;I<=5;++I)
        {

        SET_ADC_CHANNEL(I);
        DELAY_US(20);
        VALUE[I] = READ_ADC();

        }

        }

        Nó cứ bắt kênh chuyển đổi trong SET_ADC_CHANNEL(); của e phải là 1 hắng số :
        http://www.mediafire.com/imageview.p...2hzno4&thumb=4
        Nhưng e tưởng như vậy vẫn được chứ ?

        Comment

        • namqn
          Trưởng lão PIC bang
          • Feb 2006
          • 3020

          #5
          Nguyên văn bởi letrongdtk4 View Post
          Hix . Em mới tìm hiểu về 18f4431 và cũng đang mắc đoạn này nè !
          Bài toán của em cũng là chuyển đổi ADC từ AN0 - AN5 và hiển thị trên LCD
          Em sử dụng ADC 10 bit trong 18f4431
          Nếu là chuyển đổi 1 kênh thì em được rùi nhưng khi chuyển đổi nhiều kênh thì ......
          Em viết chương trình con khi chuyển đổi ADC là như thế này :
          // CHUYEN DOI ADC ------------------------------------------------------------
          //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

          VOID CHUYEN_DOI_ADC(VOID)
          {
          INT8 I;
          FOR(I=0;I<=5;++I)
          {

          SET_ADC_CHANNEL(I);
          DELAY_US(20);
          VALUE[I] = READ_ADC();

          }

          }

          Nó cứ bắt kênh chuyển đổi trong SET_ADC_CHANNEL(); của e phải là 1 hắng số :
          http://www.mediafire.com/imageview.p...2hzno4&thumb=4
          Nhưng e tưởng như vậy vẫn được chứ ?
          Bạn đang dùng hàm của CCS C, do đó phải tuân theo quy định của CCS C. Hàm set_adc_channel() có đối số là một hằng số, do đó bạn gặp thông báo lỗi như vậy là đúng rồi. Bây giờ thay vì viết một vòng lặp như vậy, bạn có thể viết tường minh 6 cụm lệnh như vậy cho 6 ngõ vào (AN0 đến AN5), chẳng có vấn đề gì là nghiêm trọng cả.

          Thân,
          Biển học mênh mông, sức người có hạn.

          Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
          http://www.picvietnam.com/forum/showthread.php?t=1263

          Comment

          • letrongdtk4
            Nhập môn đệ tử
            • Jun 2008
            • 10

            #6
            Anh àh !
            Em viết lại như vậy và được rồi
            Nhưng tại sao ngày trước viết em như vậy cho 16F887 lại được anh ạh ????

            Comment

            • phuong_dtk4s
              Nhập môn đệ tử
              • Apr 2009
              • 2

              #7
              adc cua 18f4431

              các anh cho em hỏi một chút,đoan code cua em viet như sau:
              #include <18f4431.h>
              #device *=16 adc=8
              #use delay(clock=20000000)
              #fuses hs,nowdt
              #include <lcd.c>
              #use fast_io(b)
              #use fast_io(d)
              #byte portd=0xf83
              int8 x;
              void main()
              {//set_tris_a(0xff);
              //set_tris_b(0x00);
              set_tris_d(0x00);
              setup_adc(ADC_CLOCK_INTERNAL );
              setup_adc(san1|vss_vdd);
              set_adc_channel(1);
              delay_ms(10);
              while(1)
              {
              x=read_adc();
              if (x>=100)
              { portd=1;
              delay_ms(200);
              portd=0;
              delay_ms(200);
              }
              }
              }
              ////////////////////////////////////////////////////////////////////
              sao trong protuers của em mô phỏng toan báo lỗi sau:
              porta <1> is not configured as a analog input
              em không hieu sao lại bị lối vậy nữa, các anh có thể giải thich giúp em được không ạ

              Comment

              • dtvtb
                Đệ tử 2 túi
                • Sep 2008
                • 27

                #8
                Was rõ,chưa setup nó analog,nó đã chỉ rõ như thế rồi mà còn hỏi nữa à

                Comment

                Working...