Cần giúp – Vấn đề về PWM

Em có làm một ví dụ nhỏ, dùng pwm để điều khiển độ sáng của đèn 220v. Mạch 220v thì em dùng opto + triac hoạt động tốt.
Em muốn là pwm sẽ xuất ra ở chân P1.6 của msp430g2553 là 50%, đèn sẽ sáng là 50%. 
nhưng em có tham khảo code dưới đây thì nó sáng dần rùi lại sáng dần, 
chương trình này sữa ntn để có thể xuất ra pwm P1.6 là 50% và nó sẽ không sáng dần nữa mà ở cố định 50% anh chị?
code em tham khảo:

Mã:

/****************************************************************
* IMPORT
****************************************************************/
#include  <msp430g2553.h>
/****************************************************************
* EXTERN
****************************************************************/
/*none...*/
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
/*none*/
/*****************************************************************
* ROUTINES
******************************************************************/
void ConfigClocks(void)
{
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                    // Set DCO step + modulation
  BCSCTL3 |= LFXT1S_2;                            // LFXT1 = VLO
  IFG1 &= ~OFIFG;                                  // Clear OSCFault flag
  BCSCTL2 |= SELM_0 + DIVM_3;              //MCLK = DCO/8, SMCLK = DCO/8
}
void ConfigLed(void)
{
  P1DIR |=  BIT6;                            // P1.2 output
  P1SEL |=  BIT6;                            // P1.2 TA0.1
}
void ConfigTimer(void)
{
  CCTL0=CCIE;                              //CCR0 interrupt enabled
  TACTL = TASSEL_2 + MC_1;                // SMCLK, up mode
}
void ConfigPWM(void)
{
  CCR0=2500;                                  // PWM Period=50HZ
  CCTL1 = OUTMOD_7;                        // CCR1 reset/set
  CCR1=0;                                  // PWM duty cycle
}
/* -- void interrupt isr()    -----------------------------------------
*
* Description    : Interrupt Service Routine
* Parameters    : none
* Return        : don't care
* Notes        :
*/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  CCR1=CCR1 + 1;                    // Increace Duty Cycle
  if(CCR1==2501) CCR1=0;        // If Duty Cycle =100%, reset it  
}
/****************************************************************
* MAIN
****************************************************************/  
/* -- void main (void)    -----------------------------------------
*
* Description    : Config peripheral, then goto forever loop.
* Parameters    : none
* Return        : don't care
* Notes        :
*/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                // Stop WDT
  ConfigClocks();
  ConfigLed();
  ConfigTimer();
  ConfigPWM();
  _BIS_SR(GIE);                            // Turn on interrupts
  while(1);
}
/****************************************************************
* END OF mainPWM.c

PWM chỉ xử lý điện DC,220V AC của bạn bị sáng dần rồi lại sáng dần là đúng rồi. mình cũng từng làm thế và cũng bị như bạn. Có cách nào khắc phục không bạn??? Có cách lập trình nào không cần dùng tới bắt điểm 0 không huunho. Bạn chuyển 220v về điện áp DC 310v là chạy thôi.

Đèn sáng dần là do trong hàm Timer, có lệnh tăng dần duty, đến max lại quay về 0 :
CCR1=CCR1 + 1; // Increace Duty Cycle
if(CCR1==2501) CCR1=0; // If Duty Cycle =100%, reset it. Nhưng mình để CCR1=250( chẳng hạn,) thì đèn vẫn chớp tắt nhẹ.

Hiện tượng đó là do bị “trôi” pha, do 50Hz pwm bị trôi lệch dần so với 50Hz của điện lưới.
Thông thường phải lấy mốc điểm 0 của điện lưới, sau đó dịch đi 1 khoảng thời gian để mở Thy-Triac (gọi là góc mở anpha).
PWM chỉ hay dùng để điều khiển điện áp DC.

Bài viết liên quan

Thông tin tác giả

Thêm bình luận