Chia sẻ Vấn Đề Bắt Điểm 0 220Vac Điều Khiển Tải AC.

Thảo luận trong 'Họ MSP430'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. suriken0911

    suriken0911 Kỹ sư

    Chào anh chị.!
    Hổm rài có nhiều bạn hỏi mình về vấn đề làm sao bắt điểm o của lưới điện 220VAC để có thể thay đổi độ sáng của bóng đèn dây tóc.
    Hôm nay em sẽ chia sẽ những gì em biết về vấn đề này, ai biết rồi góp ý thêm vào nhá, ai chưa biết thì có tài liệu làm.

    Mạch phần cứng:
    Đối với những mạch AC chúng ta nên ráp thử mạch thật bên ngoài để test nhá. Mạch bắt điểm 0 thì các bạn có thể gắn mạch vào test board để kiểm tra nha, mạch dưới đây mình đã làm :
    1.

    Đầu ra của mạch này các bạn cho vào một chân của MSP430 ( mình giả sử bạn dùng MSP430G2452 nhé).
    Gỉa sử chân vào mạch bắt điểm 0 là P1.4.

    Hoạt động của mạch trên:
    - PC817 là một Opto cách ly quang, nó sẽ hoạt động khi chân số 1 được cấp nguồn khoảng 5vdc, khi đó led phát quang sẽ hoạt động, và kích con transistor trong PC817 Hoạt động và transistor sẽ thông.
    - Mục đích dùng PC817 là để an toàn so với mạch công suất phía trước và để tạo ngắt( giải thích sau nhé).

    bạn có thể sử dụng những mạch bắt điểm o nào các bạn thấy tốt cho bạn, an toàn và hoạt động ổn định, nữa chu kì hay toàn chu kì thì các bạn sử dụng. Mạch này mình chỉ đưa ra cho bạn tham khảo thôi nha.
    Mạch này cho xung ra khá nhọn, các bạn có thể nắn cho xung nó chuẩn , để MSP430G2452 bắt tốt điểm 0 và mạch hoạt động ổn định hơn.

    Phần mềm lập trình:
    Hướng đi:
    điểm 0 của điện 220vac tần số 50Hz là gì? các bạn xem hình dưới:

    [codientu.org]_dimmertheory.
    điện xoay chiều 220vac thì f = 50Hz, ta suy ra T = 20ms. vậy tại các điểm 0, pi, 2pi,...npi sẽ xuất hiện điểm o.
    Mục đích của ta là khi đồ thị hàm số điện xoay chiều này đi ngang điểm 0 ta sẽ phát hiện nó, để cho msp430g2452 nó hiểu: à , điểm 0, mày đây rồi, tao đã phát hiện được mày...!

    Khi các bạn phát hiện được điểm 0 rồi thì ta sẽ tạo trễ một khoảng thời gian t <=T/2 = 10ms.
    nói cách khác ta sẽ bật tắt đèn từng chu kì.

    Giải Thuật lập trình:
    Ta sẽ sử dụng ngắt để phát hiện điểm o này. về ngắt các bạn có thể tìm hiểu trên mạng nhé.
    đầu tiên các bạn kiểm tra xem mạch bắt điểm 0 nó có hoạt động không? và làm thế nào ta biết nó có hoạt động hay không?

    Đầu tiên các bạn tạo project bằng IAR nhé, dùng kit launpad MSP430G2452 để kiểm tra. các bạn ráp thử ngoài test board mạch trên, rồi sau nó nối ngõ ra cũa mạch này vào chân P1.4 của MSP430G2452 nhé, ta sẽ test trên kit launpad lun.
    sau đó bạn add đoạn code này vào:

    Mã:
    #include "msp430g2452.h"
    void main(void)
    {
                WDTCTL = WDTPW | WDTHOLD;           //Stop Watchdog
                BCSCTL1 = CALBC1_1MHZ;                    //2 thanh ghi cài đặt tần số hoạt động
                DCOCTL = CALDCO_1MHZ;                    //Ở đây là 1 Mhz
                P1DIR &= ~(BIT4);          //Chọn nhập
                P1REN |= BIT4;   //Cho phép trở treo
                P1OUT |= BIT4;  //Trở treo lên nguồn
                //Cài đặt ngắt
                P1IE  |= BIT4;     //Cho phép ngắt ở P1.3
                P1IES &=  ~BIT4;   //Ngắt cạnh lên,
                //tức là khi điện áp P1.4 từ 0 ->1 thì xảy ra ngắt
                P1IFG &= ~BIT4;           //Xóa cờ ngắt
                __bis_SR_register(GIE);
    
                //Cài đặt đèn
                P1DIR |= BIT0+BIT6;
                P1OUT &= ~(BIT0+BIT6);
                while(1)
                {
                            P1OUT ^= BIT0;
                            __delay_cycles(1000000);
                }
    }
    
    #pragma vector = PORT1_VECTOR
    __interrupt void test(void)
    {
                //Kiểm tra ngắt có phải là ở P1.3 không
                if(P1IFG&BIT4)
                {
                            //cho led P1.6 chop tat lien tuc
                     for(int i=0;i<6;i++){
                            P1OUT ^=  BIT6;
                            __delay_cycles(500000);
                      }
                            P1IFG &=  ~BIT4;
               
    }
    ở đây ta dùng ngắt cạnh lên nha các bạn. tại vì khi không ở tại điểm o thì PC817 sẽ hoạt động, transistor trong Opto này sẽ thông vào sẽ kéo chân P1.4 xuống mass( trạng thái thường trực). sau đó khi tại điểm 0 thì PC817 sẽ không hoạt động và chân P1.4 sẽ được trở 1k kéo lên nguồn.

    Các bạn chú ý là chân số 2 là mass của cầu diode trong mạch nhé, còn chân số 3 thì đó là mass của nguồn 5vdc cấp vào chân 4.

    đoạn code trên có ngĩa là: khi mà có ngắt cạnh lên từ chân P1.4( nghĩa là điểm 0 đã được phát hiện) thì led P1.6 sẽ chớp tắt liên tục không ngừng, nếu không có ngắt tại P1.4 thì Led P1.0 sẽ chớp tắt và bạn đã test được mạch này rồi.

    update...
     
    trongpdl, hieuspk, sgesvn2 others thích bài này.
  2. tdm

    tdm Kỹ sư

    diễn đàn rất cần những bài viết đã được test thực tế như thế này.
     
    trongpdlsuriken0911 thích bài này.
  3. suriken0911

    suriken0911 Kỹ sư

    Tiếp tục phần trên nhé các bạn!

    Khi bạn đã test mạch bắt điểm 0 thành công thì mọi chuyện sẽ rất dễ dàng với chúng ta.( các bạn ai ráp mạch trên của mình mà k test thành công điểm 0 thì replay lại cho mình nha).

    Mình sẽ lấy lại hình trên nhé:

    [codientu.org]_dimmertheory.

    Như hình trên, giả sử ta xét một nữa chu kì đầu là 0 tới pi ( Tức là 0ms đến 10ms).
    khoảng thời gian này ta có hai điểm o. giả sử ta xét điểm o tại góc 0(radian) nhé.( các điểm khác tương tự vì nó tuần hoàn với chu kì 2pi mà).

    Tại góc 0(radian), ta có một điểm 0 ( như trên hình).
    kí hiệu alpha trên hình là thời gian trễ để ta có thể điều khiển đèn sáng bao nhiêu %.
    Tại góc 0(radian) đó, sẽ sinh ra ngắt cạnh lên trên chân P1.4 ( Phần trên có nói đó các bạn đọc kĩ nhé).
    ngay sau khi msp430g2452 phát hiện ngắt cạnh lên từ chân P1.4 nó sẽ thực hiện phần công việc trong ngắt, ở đây mình sử dụng ngắt PORT1 của MSP430G2452.

    Sau khi ta phát hiện ngắt xảy ra trên P1.4, ta sẽ tắt đèn đi, sau đó cho nó delay khoảng thời gian bao nhiêu ms tùy vào thời gian bạn muốn đèn tắt.
    mình ví dụ: giả sử trong 10ms của nữa chu kì
    - đèn sáng 5ms, delay 5ms.
    - đèn sáng 4ms, delay 6ms.
    - đèn sáng 7ms, delau 3ms.
    .....
    vậy gom lại toàn chu kì ta được khoảng thời gian đèn :
    - đèn sáng 50%, delay 10ms.
    - đèn sáng 40% , delay 12ms....
    vân vân và vân vân.....
    như vậy giải thuật là thế này:

    2.

    Chúng ta sẽ đi vào phần code để hiểu rõ hơn nhé.
    giả sử các bạn đã biết cách thiết lập ngắt port1 trên chân MSP430G2452 rồi nhé, hoặc các bạn có thể tham khảo code này:
    Mã:
    P1DIR &= ~BIT4;                          //NGAT PORT 1 P1.5
      P1REN|=BIT4;                        //TRO TREO
      P1OUT|=BIT4;                       //TRO TREO LEN NGUON
      P1IE |=BIT4;                       //CHO PHEP NGAT P1.4
      P1IES &= ~BIT4;                    //NGAT CANH LEN
      P1IFG &=~BIT4;                     //XOA CO NGAT
    Code trên dùng ngắt cạnh lên.

    ta có đoạn code dùng ngắt port 1 Trên MSP430G2452:

    Mã:
    //=========================================================================================================================
    //------------------------------------------------------------------------------
    //CHUONG TRINH XU LY TIN HIEU DE DIEU KHIEN DO SANG BONG DEN
    //BAT DIEM 0 TAO NGAT. DUNG TIMER DE SET DO SANG TOI CUA BONG DEN
    //------------------------------------------------------------------------------
    //CHUONG TRINH NGAT, DEM SO LAN DIEM O CUA TIN HIEU VSIN.
    //CHUONG TRINH NGAT TAI P1.4.
    //NGAT THEO XUNG SUON LEN P1.4 = 0 =>> 1  =>>NGAT XAY RA
    #pragma vector=PORT1_VECTOR
    __interrupt void Port_1 (void)
    {    
    
      if(P1IFG & BIT4){
         
          P1OUT  &= ~BIT7;                  //tat den di
          if(doC <= 310){                 //<25 DO C
            __delay_cycles(4000);
            P1OUT |= BIT7;
          }
          else if(doC >310){            //25 < DO C < 32
            P1OUT &= ~BIT7;
            __delay_cycles(7000);
            P1OUT |= BIT7;
          }
      }
      P1IFG &= ~BIT4;                  //reset co ngat.
    }
    //------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------------------------
    //=========================================================================================================================
    ở đây mình dùng P1,7 làm ngõ vào cho mạch điều khiển đèn 220VAC( mỉnh sẽ đưa lên sau nhé).
    bạn xem code có dòng:
    Mã:
    if(P1IFG & BIT4){
        
          P1OUT  &= ~BIT7;                  //tat den di
          if(doC <= 310){                 //<25 DO C
            __delay_cycles(4000);
            P1OUT |= BIT7;
          }
    đoạn này là ta điều khiển đèn đây.
    Hoạt động:
    Nếu xảy ra ngắt tại P1.4( Điểm 0 đã bắt thành công), thì ta sẽ tắt đèn( P1OUT &= ~BIT7), Và delay một khoảng ms ta muốn.
    ở đây mình delay 4ms, như vậy tại điểm 0, một chu kì mới được sinh ra, ta sẽ delay từ 0ms đến 4ms, khoảng thời gian này đáng lẽ ra đèn đang sáng, nhưng ta lại bắt nó tắt. và sau khi ta delay 4ms thì ta bật đèn lên, như vậy thì trong 10ms của đèn sáng 100% thì bậy giờ đèn chỉ còn sáng được khoảng 6ms tức 60%. như vậy đèn sẽ giảm xuống chỉ còn 60% so với công suất tối đá 100%.
    tới điểm 0 tiếp doạn code trên lại lập lại như cũ, và cứ thế cứ thế,....
    vì chỉ có 20ms cho một chu kì nên ta không nhìn thấy được, mà đèn sẽ giảm xuống rõ rệt cho bạn( mình đã làm thành công').

    như vây thì đèn đã thay đổi công suất từ 100% xuống bao nhiệu % là do bạn delay bao nhiệu ms..
    còn dòng if...else đó là mình dùng nhiệt độ để điều khiển đèn( mình dùng lm35, bạn nào muốn dùng thì replay mình nhé có code + mạch lun).
     
    phunghehieuspk thích bài này.
  4. suriken0911

    suriken0911 Kỹ sư

    Tiếp nhé các bạn!

    Về mạch điều khiển tải ac( Cụ thể là bóng đèn ) thì các bạn ráp theo mạch này:
    opto Moc3020 with triac.
    Mạch này dùng Opto Triac MOC3021, Triac BTA12.
    Mạch này các bạn cũng nên ráp mạch thật, chú ý chân của BTA12 nhé, để khỏi bị hư ic.
    Mạch này các bạn nối chân OUTVDK vào P1.7( như code phần trên mình nói), các bạn có thể config theo yêu cầu đề tài của mình nhé. Mạch này mình ráp chạy ổn định, chú ý gắn keo vào những chỗ có điện ac đi ngang hay bạn đóng hộp lại cho an toàn nhé, lỡ đụng vào cái banh xác.

    mach này dơn giản, chĩ cần on hay off chân OUTVDK là mạch sẽ ngưng hoặc hoạt động, bạn ráp mạch này xong bạn cấp nguồn 5vdc vào và ghim tải vào đèn sẽ sáng.

    Mình sẽ gửi mạch in cho các bạn phía dưới, bạn nào cần thì xài, không thì có thể tự vẽ và thiết kế nhé.
    Chúc thành công!
    anh em xem có gì thiếu xót bổ sung cho em nhé!
     

    Các file đính kèm:

  5. ga_cong

    ga_cong Kỹ sư

    mạch trên mà bắt được điểm 0
    nói thật nhé mạch này không dùng để bắt điểm không được đâu.
    mạch này không bắt được điểm 0 đâu. Nên dùng mạch so sánh Opam nó sẽ chuẩn hơn. vì đèn led sáng ở 2-3V thì làm gì còn 0 nữa. mà ở 2 - 3v phần hạ áp thì phần cao áp nó tầm 48V rồi.
     
    suriken0911 thích bài này.
  6. suriken0911

    suriken0911 Kỹ sư

    Cảm ơn bạn đã góp ý nhé, mình đã làm trong đề tài của mình và chạy tốt bạn à, còn bắt điểm o thì nhiều cách,nhiều mạch, tùy vào mỗi người mà sữ dụng. mình chỉ chia sẽ những gì thực nghiệm mình làm được..
    Mình đã ráp và test thử trên kit launpad xong, rồi mình làm trên mạch thật với mạch công suất, ổn định và chạy tốt...
     
  7. ga_cong

    ga_cong Kỹ sư

    tùy bạn. còn trong các mạch điều khiển thyristor mà tôi từng nghiêm cứu nó không quá đơn giản như vậy đâu. vì mạch của bạn nó sai số gốc 0 đến cả chục vôn.
     
  8. suriken0911

    suriken0911 Kỹ sư

    Mình dùng PC817 bạn nha, opto cách ly không phải dùng Thyristor
     
  9. lavissia

    lavissia Sinh viên đại học

    thật ra bắt điểm 0 lệch 1 chút không sao, điều khiển đèn chạy tốt. hồi đó chơi 2 con op-am, 1 cái bắt lên, 1 cái bắt lúc nó xuống. kết quả hệ chạy lung tung, sau này mới biết dùng 1 cổng and cho 2 đầu ra của op-amp vào 2 đầu vào cổng and. lấy osciloscope đo đầu ra mới biết, có thời điểm, cả 2 con đều lên mức cao.
     
    suriken0911 thích bài này.
  10. mhl167

    mhl167 Kỹ sư

    Nay thành thạo zero crossing rồi ha suriken0911
    Trông mấy hình thấy quen quen :):)
     
    suriken0911 thích bài này.

Chia sẻ trang này