Thông báo

Collapse
No announcement yet.

Các tính năng cơ bản của PIC: ADC, PWM...

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

  • Các tính năng cơ bản của PIC: ADC, PWM...

    Một ví dụ đơn giản qua đó bạn có thể hiểu được các chức năng ADC và PWM được sử dụng rất nhiều. Mình dùng 16F876A và code viết bằng Hi-Tech PIC.

    Đặt vấn đề: Ổn định cường độ sáng của LED khi ngưồn ngoài bị sụt thế. Khi nguồn cung cấp cho đèn của bạn là 10V hay 12V thì LED vẫn sáng với cùng cường độ.
    Giải quyết vấn đề: Tôi dùng ADC để đo điện áp của nguồn đương nhiên là phải dùng trở để chia thế đưa vào ADC khoảng 3->5 V. Sau đó dùng chức năng điều chế độ rộng xung để điều chỉnh độ mở của trasistor. Giả sử có một chuỗi xung có chu kì T biên độ A và thời gian ở mức cao là t thì khi biến đổi fourier ta thu được thành phần 1 chiều là At/T. Khi sụt thế thì ta sẽ tăng dòng qua LED sao cho P = UI là không đổi. -> phải tăng t (Duty Cycle) bạn có thể dễ dàng thực hiện bằng cách điều chế độ rộng xung PWM. Chú ý đôi khi chỉ cần dùng timer trong khoảng thời gian t (duty cycle) đặt ở mức cao và (T-t) thì đặt ở mức thấp.
    Đây là một ví dụ đơn giản về điều khiển phản hồi vòng kín. Dùng ADC để kiểm tra nguồn một cách đều đặn, sau đó hiệu chính lại các thông số PWM.
    Attached Files

  • #2
    Đây là code viết bằng Hi-Tech PIC tôi viết:

    //Chuong trinh dieu khien LED
    //So den LED : 2
    //Vi dieu khien: 16F876A
    //Sau cac' khoang thoi gian 10ms, PIC doc tu ADC, sau do' chinh lai cac' thong so' PWM
    //================================================== ===================================
    #include<pic.h>
    __CONFIG(UNPROTECT & WDTEN & HS & PWRTEN & BOREN & LVPDIS & DUNPROT & DEBUGDIS);
    #define VAQ RA0 //VAQ dieu chinh do sang cua LED
    #define LAMP_1 RC1 //Chan noi voi LED 1
    #define LAMP_2 RC2 //Chan noi voi LED 2

    //-------------------Nguyen mau ham
    void init(void); //Ham khoi tao(Cac cong, imer, ADC,...)
    void interrupt MyInt(void) //Ngat
    {
    #define Load_timer1 50000 //Dinh nghia gia tri nap cho Timer1
    #define Delay_timer1 10 //Dinh nghia tre cua Timer1
    static unsigned char clk1,lckkeyboard; //khai bao bien clk1,lckkeyboard
    static unsigned int x;
    static bit new_key; //khai bao bien new_key de chong rung
    if (TMR1IF) //Kiem tra xem co ngat hay khong ?
    {
    TMR1ON=0; //Cho phep timer1
    TMR1H=-(Load_timer1/256); //Nhap byte cao
    TMR1L=-(Load_timer1%256); //Nhap byte thap
    TMR1ON=1; //Khong cho phep timer1
    ADGO = 1;
    while(ADGO);
    xADRESH << 8)|ADRESL)/4;
    //PWM Duty Cycle =(CCPR1L:CCP1CON<5:4>) •TOSC • (TMR2 Prescale Value)
    x=(24000)/x; //93-255:0.4->1.0
    if(x>255)
    {
    x=255;
    }
    if(x==0)
    {
    x=1;
    }
    TRISC2=1;
    CCPR1L=x;
    TRISC2=0;
    TMR1IF=0; //xoa bit TMR1IF de cho thanh ghi TMR1
    } //khong bi tran(Bat buoc trong chuong trinh)


    }
    //-------------------ham main
    void main()
    {
    init(); //goi ham khoi tao
    while(1)
    {
    CLRWDT(); //xoa watchdog
    NOP();

    }
    }

    //-------------------Dinh nghia cac ham
    void init(void) //ham khoi tao chinh
    {
    //khoi tao cho cac cong cua PIC 16F876A
    TRISA = 0b11111111; //Dinh nghia cong A la INPUT
    TRISC = 0b11111101; //Dinh nghia cong C co: RC1, RC2 la OUTPUT, con lai la INPUT
    PORTC = 0b11111111; //Dat cac chan cua cong C len muc cao

    //khoi tao cho timer 1
    T1CON = 0b00010001; //He so chia truoc la 1:2(T1CKPS1=0,T1CKPS0=1), Cho phep bo tao dao dong (T1OSCEN=1)
    //TMR1CS=0 (xung CLOCK trong(Fosc/4)) bo qua bit T1SYNC, Cho phep timer 1
    //Xung clock cua timer1 =(18.432/4)/2=2.304Mhz;(dung thanh anh 18.432Mhz)
    TMR1IE = 1; //Cho phep ngat khi thanh ghi TMR1 tran
    TMR1IF = 1; //Thanh ghi TMR1 tran

    //khoi tao cho ADC
    ADCON0 = 0b10000001; //Channel 0, (RA0,AN0),A/D converter module is operating
    ADCON1 = 0b10000000; //Right justified

    //khoi tao PWM
    PR2=255; //PWM Period = [(PR2) + 1] • 4 • TOSC •(TMR2 Prescale Value)
    //=256*4*(1/18.432)*16/1000ms=0.222ms=1.25Khz
    CCP1CON=0b00001100;
    CCPR1L=PR2/2; //PWM Duty Cycle =(CCPR1L:CCP1CON<5:4>) •TOSC • (TMR2 Prescale Value)
    T2CON=0b00000110;

    PEIE=1;
    GIE = 1; //Cho phep ngat toan cuc
    }
    //----------------------------------
    unsigned int read_ad(void) //Ham doc ADC
    {
    ADGO = 1;
    while(ADGO);
    return((ADRESH << 8)|ADRESL);
    }
    //====================================THE END===============================================

    Comment


    • #3
      Đã hảo tâm thì hảo tâm cho trót đê bác 4MD

      Nguyên văn bởi 4MD
      Một ví dụ đơn giản qua đó bạn có thể hiểu được các chức năng ADC và PWM được sử dụng rất nhiều. Mình dùng 16F876A và code viết bằng Hi-Tech PIC.

      Đặt vấn đề: Ổn định cường độ sáng của LED khi ngưồn ngoài bị sụt thế. Khi nguồn cung cấp cho đèn của bạn là 10V hay 12V thì LED vẫn sáng với cùng cường độ.
      Giải quyết vấn đề: Tôi dùng ADC để đo điện áp của nguồn đương nhiên là phải dùng trở để chia thế đưa vào ADC khoảng 3->5 V. Sau đó dùng chức năng điều chế độ rộng xung để điều chỉnh độ mở của trasistor. Giả sử có một chuỗi xung có chu kì T biên độ A và thời gian ở mức cao là t thì khi biến đổi fourier ta thu được thành phần 1 chiều là At/T. Khi sụt thế thì ta sẽ tăng dòng qua LED sao cho P = UI là không đổi. -> phải tăng t (Duty Cycle) bạn có thể dễ dàng thực hiện bằng cách điều chế độ rộng xung PWM. Chú ý đôi khi chỉ cần dùng timer trong khoảng thời gian t (duty cycle) đặt ở mức cao và (T-t) thì đặt ở mức thấp.
      Đây là một ví dụ đơn giản về điều khiển phản hồi vòng kín. Dùng ADC để kiểm tra nguồn một cách đều đặn, sau đó hiệu chính lại các thông số PWM.
      Mấy cái này khá hay, nếu dùng để điều chỉnh các hệ thống chiếu sáng, các hệ đk nhiệt độ, điêu chỉnh công suất... thì có thể áp dụng được.
      Nên chăng, bạn đã hảo tâm thì hảo tâm cho trót...
      Post luôn cái schematics hoặc sơ đồ khối.... để có cái trực quan hơn. Ko cần thật chi tiết lắm cũng được ... he he...
      -------------------

      Comment


      • #4
        Sorry bác, phải đăng nhập mới thấy được hình ảnh...kha kha... nó ở phía trên mà tui hổng biết
        -------------------

        Comment


        • #5
          Có phải đại hiệp 4MD đo điện áp tại VAQ, rồi căn cứ vào đó để điều khiển công suất = PWM ko? VAQ lớn thì giảm độ rộng xung dương PWM, VAQ bé thì tăng dộ rộng PWM. Nói cách khác để công suất luôn là 1 số ko đổi cho dù điều kiện ngoại cảnh tác động?
          Vậy VAQ là đại lượng đo phản hồi, còn điều khiển là điều khiển để sao cho công suất lối ra luôn là một hằng số đặt sẵn.
          Nếu thay mạch sáng Led = một mạch đk thysristor, IGBT...để đôt nóng, quay động cơ...., rồi lối vào phản hồi là sensor thì áp dụng được những úng dụng khác.
          -------------------

          Comment


          • #6
            Cach giai cua ban chi dung khi tai la thuan tro.
            Voi bong den thi ban dung PWM phai thoa man dieu kien hieu suat phat sang la tuyen tinh trong tat ca dai dien ap. Nhung thuc te khong phai nhu vay. Do vay cong suat cung cap cho bong den la khong doi nhung cuong do sang tao ra se thay doi.
            Gia su khi dien ap 6V ban se mo hoan toan.
            khi 12V se la 50%
            Do do can phai co dong den ma hieu suat phat sang tai 12V = 2 lan tai 6V. Thuc te thi khong the lam nhu vay duoc.
            ( Vi du don gian 1 bong den 220V se sang trang khi du 220V nhung khi xuong 110V thi khong phai se sang bang 50% ma chi bang 5%)
            Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

            Biến tần
            Máy giặt
            Lò vi sóng
            Bếp từ.
            Tủ lạnh.
            Điều hòa

            Comment


            • #7
              Bác MH nói rất chí lý, bởi vì cường độ sáng của một bóng đèn, không tỉ lệ thuận với điện áp, cho nên bộ điều khiển mà bạn áp vào, chính là bộ điều khiển P. Mà trong đó, bạn cho rằng độ sáng của bóng đèn tỉ lệ với điện áp.

              vd: bạn dùng đèn cao áp, thì sẽ không có cái tỉ lệ đó. Còn với đền 220V thường thì mình chưa thử nên không biết rõ. Kể cả đèn LED. Đúng ra, bạn nên cho ai ngõ vào ADC giữa hai chân đèn, thay vì cho đóng mở với ground. Bởi vì khi thay đổi điện áp đỉnh, thì bạn sẽ thấy nó có sự khác biệt rất rõ. Bạn cho 6V vào, và mở ở 50% sẽ khác với bạn mở 50% nhưng ở 5V. Nhưng nếu bạn xác định hiệu điện thế giữa hai điểm đầu bóng LED, thì bạn luôn có hiệu điện thế đúng với yêu cầu của bạn. Và như vậy, bạn đảm bảo duy trì hiệu điện thế giữa hai đầu bóng chính xác. Khi đó, ánh sáng đèn sẽ ổn định.
              Falleaf
              Công ty TNHH Thương mại và Giao nhận R&P
              58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
              mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

              Comment


              • #8
                Các bác nói chí lý: thực tế sẽ có sự khác biệt chút ít, song đây là ý tưởng, chắc đại hiệp 4MD chỉ đưa ra một ví dụ đơn giản, chứ thực tế chắc bác ko công bố kết quả thực của mình?
                Thực tế bài toán thì muôn hình muôn vẻ, khi đo được điện áp Vaq, ta nội suy ra công suất. Vì giữa Vaq và Uđk thường có sự phụ thuộc phi tuyến. Ngoài ra cần đưa ra các thông số tới hạn nữa. Thực tế thì sự phụ thuộc này khảo sát bằng biểu thức toán học tính toán = lý thuyết hơi phức tạp. Có lẽ vậy mà thực tế, người ta dùng phương pháp thực nghiệm đo tại 1 số điểm rồi nội suy các điểm còn lại?
                -------------------

                Comment


                • #9
                  Nguyên văn bởi CHIBANG
                  Các bác nói chí lý: thực tế sẽ có sự khác biệt chút ít, song đây là ý tưởng, chắc đại hiệp 4MD chỉ đưa ra một ví dụ đơn giản, chứ thực tế chắc bác ko công bố kết quả thực của mình?
                  Thực tế bài toán thì muôn hình muôn vẻ, khi đo được điện áp Vaq, ta nội suy ra công suất. Vì giữa Vaq và Uđk thường có sự phụ thuộc phi tuyến. Ngoài ra cần đưa ra các thông số tới hạn nữa. Thực tế thì sự phụ thuộc này khảo sát bằng biểu thức toán học tính toán = lý thuyết hơi phức tạp. Có lẽ vậy mà thực tế, người ta dùng phương pháp thực nghiệm đo tại 1 số điểm rồi nội suy các điểm còn lại?
                  Không cần quá phức tạp như vậy, nếu chỉ là ổn định cường độ sáng, có nghĩa là mình chỉnh biến trở đến một đoạn mình thấy oki, và duy trì cường độ sáng đó, thì làm như tôi, đo điện áp hai đầu là được.

                  Còn nếu mà muốn tính đơn giản, công suất bóng, xem như không hao hụt nhiều, thì công suất đèn ti lệ với bình phương dòng, hoặc điện áp. Đây là bài toán gần đúng đơn giản nhất. Và mình có thể áp dụng gần đúng theo bình phương này để giải quyết.
                  Falleaf
                  Công ty TNHH Thương mại và Giao nhận R&P
                  58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                  mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                  Comment


                  • #10
                    Nguyên văn bởi falleaf
                    Còn nếu mà muốn tính đơn giản, công suất bóng, xem như không hao hụt nhiều, thì công suất đèn ti lệ với bình phương dòng, hoặc điện áp. Đây là bài toán gần đúng đơn giản nhất. Và mình có thể áp dụng gần đúng theo bình phương này để giải quyết.
                    Bài toán đơn giản đó bác 4md đã nói ở trên rùi, P=UI=(U bình fương/R) ko đổi rùi.

                    Comment


                    • #11
                      Các chức năng hay dùng nhất của PIC

                      -Output Ports để điều khiển động cơ, relay, triac,....
                      -Input để đọc mức logic
                      -Bộ đếm và bộ định thời Timer/Counter
                      -ADC để đọc tín hiệu tương tự
                      -Capture để đo khoảng thời gian chính xác giữa các sự kiện
                      -PWM để điều chỉnh tốc độ động cơ,...
                      -Ngắt ngoài thông thường sườn lên hoặc sườn xuống lập trình được
                      -Ngắt Onchange.
                      -Ngắt trong (Internal Interrupt) là thủ tục ngắt khi timer bị tràn.
                      -COMPARATOR MODULE bộ so sánh tương tự
                      -SLEEP mode để tiết kiệm năng lượng
                      -Watchdog timer để giám sát chương trình, khác phục lỗ hổng khi lập trình và tăng độ tin cậy của chương trình.
                      Anh BinhAnh bổ xung tiếp nhé...

                      Comment


                      • #12
                        Làm thế nào để làm chủ được các tính năng mới của PIC.
                        Tài liều tốt nhất là datasheet, phải đọc kĩ để đừng bỏ xót vì đó là những thông tin rất cần thiết của nhà sản suất. Từng bước từng bước đọc và lập trình ngay với từng chức năng một để từ đó rút ra được cái cần thiết cho công việc lập trình sau này. Như thế sẽ không bị bỏ xót và cảm thấy dễ dàng tiếp cận...

                        Comment


                        • #13
                          Các bác giúp em nói rõ hơn về Prescale/Postcale trong module Timer , em đọc rồi nhưng chẳng hiểu gì mấy ,các bác có thể post cho em vài ví dụ về Timer được không ? Thanks !
                          Và anh biết là khi bên em, anh sẽ vượt qua tất cả

                          Comment


                          • #14
                            Nguyên văn bởi hio2
                            Các bác giúp em nói rõ hơn về Prescale/Postcale trong module Timer , em đọc rồi nhưng chẳng hiểu gì mấy ,các bác có thể post cho em vài ví dụ về Timer được không ? Thanks !
                            prescaler/postscaler mình dịch là bộ chia trước và chia sau.
                            Ví dụ: trong TIMER2 MODULE bạn chọn giá trị cho thanh ghi T2CON sao cho prescaler là 1:16 chẳng hạn. Nếu bạn dùng thạch anh 18.432 Mhz thì xung clock cho TIMER2 là: (18.432/4):16 có nghĩa là sau khoảng thời gian 16*(4/18.432) uS thì TMR2 tăng lên một.
                            note: 18.432Mhz/4 = input clock sau khi qua prescaler 1:16 sẽ được xung clock 18.432Mhz/4/16

                            Comment


                            • #15
                              Cảm ơn 4MD
                              Em đã viết được hàm delay dùng timer với thời gian rất chính xác , ngoài việc dùng timer để tạo hàm delay ,còn có ứng dụng nào nữa không ?
                              Mong sự chỉ bảo của các bác !
                              Và anh biết là khi bên em, anh sẽ vượt qua tất cả

                              Comment

                              Về tác giả

                              Collapse

                              4MD Tìm hiểu thêm về 4MD

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

                              Collapse

                              Đang tải...
                              X