打印

如何精準產生pwm訊號

[复制链接]
801|13
手机看帖
扫描二维码
随时随地手机跟帖
沙发
小葱521| | 2015-8-10 16:56 | 只看该作者
你这个这么大的范围,还叫做精准的PWM信号吗?

使用特权

评论回复
板凳
dirtwillfly| | 2015-8-10 19:50 | 只看该作者
只要主频稳定了,定时器自然就稳定,pwm就会稳定

使用特权

评论回复
地板
wayne770403|  楼主 | 2015-8-11 10:38 | 只看该作者
以下是我的程式 我修改 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
}

使用特权

评论回复
5
wayne770403|  楼主 | 2015-8-11 10:39 | 只看该作者
dirtwillfly 发表于 2015-8-10 19:50
只要主频稳定了,定时器自然就稳定,pwm就会稳定

是否能夠加我QQ  2801722390

使用特权

评论回复
6
shenmu2012| | 2015-8-11 19:50 | 只看该作者
这个第一步的是需要注意时钟信号的选择的,必须很精确的。

使用特权

评论回复
7
wayne770403|  楼主 | 2015-8-12 08:52 | 只看该作者
shenmu2012 发表于 2015-8-11 19:50
这个第一步的是需要注意时钟信号的选择的,必须很精确的。

你好   我採用的是 外部震盪器 8Mhz

使用特权

评论回复
8
dirtwillfly| | 2015-8-12 09:29 | 只看该作者
wayne770403 发表于 2015-8-11 10:38
以下是我的程式 我修改 CCR0 =55-1; // PWM Period  頻率 148k跳到145k   但 我需要147k   想詢問 如何正確 ...

:funk:
你顶楼说要 147~150khz的频率,148khz不正好满足么?

使用特权

评论回复
9
wayne770403|  楼主 | 2015-8-12 10:26 | 只看该作者
dirtwillfly 发表于 2015-8-12 09:29
你顶楼说要 147~150khz的频率,148khz不正好满足么?

調整CCRO  55 更改為54或56  皆無法達到147k   求協助

使用特权

评论回复
10
comeon201208| | 2015-8-15 15:21 | 只看该作者
这个是直接的跟定时器相关联使用的。

使用特权

评论回复
11
小葱521| | 2015-8-15 20:32 | 只看该作者
是用PWM做,还是用CLKO?

使用特权

评论回复
12
vivilzb1985| | 2015-8-16 22:30 | 只看该作者
这个需要主频率先稳定的呗。

使用特权

评论回复
13
songchenping| | 2015-8-17 08:05 | 只看该作者
说的太笼统了。如何个精准法。

使用特权

评论回复
14
子风天域| | 2015-8-17 18:22 | 只看该作者
怎么个精确法?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝