如何精準產生pwm訊號

2019-07-26 14:25发布

想請問  如何精準控制pwm 訊號頻率   147~150khz
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
wayne770403
2019-07-27 00:07
以下是我的程式 我修改 CCR0 =55-1; // PWM Period  頻率 148k跳到145k   但 我需要147k   想詢問 如何正確修改

#include <msp430x16x.h>
#define  uchar unsigned char
#define  uint  unsigned int

#define  CPU_F ((double)8000000)
#define  delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define  delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

void init_cpu_clk( void );
void LED_Display(void);
void init_pwm(void);

uchar temp1,temp2,keysym;

void main (void)
{

     init_cpu_clk();                              //设置系统时钟
     init_pwm();                                  //初始化pwm

     P1DIR|=0XF0;
     P1OUT|=0XFF;

     P5DIR |=0XFF;
     P5OUT |=0XFF;                                //关闭数码管

     while(1)
     {
         temp1=P1IN & 0X01;                        //读取按键IO口电平
         if(temp1 !=0X01)                          //判断是否有按键被按下
         {
             delay_ms(100);                        //按键延时防抖动
             temp2=P1IN&0X01;
             if(temp2==temp1)
             {
             while(temp2!=0X01)                   //等待松开按键
             temp2=P1IN&0X01;
             {
                switch(temp1)
                {
                   case 0x00: P5OUT=0XF1;
                              CCTL1 = OUTMOD_7;          // CCR1 reset/set
                              CCR1 = 27;                // CCR1 PWM duty cycle
                   break;
                }
             }
         }
         }
     }

}

//设置系统时
void init_cpu_clk( void )
{

     volatile unsigned int i;
     WDTCTL = WDTPW + WDTHOLD;                   // 关闭看门狗
     BCSCTL1 &= ~XT2OFF;                         // 打开XT2时钟
     do
     {
         IFG1 &= ~OFIFG;                         // Clear OSCFault flag
         for (i = 0xFF; i > 0; i--);             // Time for flag to set
     }while ((IFG1 & OFIFG));                    // OSCFault flag still set?

     BCSCTL2 |= SELM_2 + SELS;                   // MCLK= SMCLK= XT2 (safe)
}

void init_pwm(void)
{
  P1DIR |= BIT2;             // P1.2 to output
  P1SEL |= BIT2;             // P1.2 to TA0.1

  CCR0 =55-1;             // PWM Period
  TACTL = TASSEL_2 + MC_1;   // SMCLK, up mode

//  _BIS_SR(LPM0_bits);        // Enter LPM0
}

一周热门 更多>