MSP430G2253 产生占空比可调的PWM

MSP430G2253 产生占空比可调的PWM
最近刚刚做了一个用430驱动白光LED的代码   其中用到了以前用到的ADC和PWA这些常用的外设  发现对片子掌握的还是太基础 现在复习一下  以后用到的时候也算有个参考 今天就只学习一点最基本的功能 用430产生一个占空比可调的PWM  
先说一下步骤:
1:首先我们要知道那个引脚可以作为定时PWM的输出引脚 如果不太熟悉引脚 就去查阅册  
2:配置这个IO  这种情况下 无论那个系列的片子 基本作为PWM输出的时候 IO配置为输    出 选择其端口复用功能 详细配置  看手册

3:设置PWM的周期  TACCR0 或者CCR0  貌似是一个冬冬吧  这里面的数值决定了你PWM的   周期 举个简单的例子 比如你使用1MHZ的时钟频率  CCR0=100 则PWM的周期为100us     那么相应的频率就是10Khz
4:设置寄存器TACTL  设置输出模式 这里输出模式有7种  这里我贴一个图片 可以很好的理解这几种模式:

大家可以仔细观察一下  七种输出模式的2和6两种模式  他们输出的PWM恰好是互补的  其实这为我们需要互补的两个PWM提供了一个很好的生成方法  特别使我们在驱动全桥的让对角线交互导通的时候需要用到这种互补的PWM并且 他还可以生成死区区间  这点在英文手册中有讲到 有需要的可以去看一下  死区时间=时钟周期*(TACCR1-TACCR2)
5:设置相应的占空比 就是定时器捕获比较寄存器  其实就是CCR1和CCR2的赋值问题 
6:操作TACTL 也就是定时器A控制寄存器 选择时钟源和计数模式 至于分频和中断什么这里暂时不考虑了 寄存器里面的计数模式决定你是否开启了定时器 以及你的计数模式
如图:

 配置完成这些自然就能产生相应的PWM了  但是我们如何改变占空比呢  其实比较简单  只需要我们按键改变一下CCR1或者CCR2里面的值皆就可以了
下面附上一段代码 仅供参考  按键接P1.3和P1.4  P1.2产生PWM  在示波器上可以明显看到用按键控制波形的变化 
代码如下:
 
#include <msp430.h>
long int flag=10;//决定PWM占空比的变量
/****************************************************************************
函数名称 :delay
函数功能:延时   延时的长短由tmp的数值决定
函数参数:无
函数返回值:无
*****************************************************************************/
void delay(void)
{
    unsigned int tmp;
    for(tmp = 120;tmp > 0;tmp--);
}

/*****************************************************************************
函数名称 :Key
函数功能 :检测按键  用来改变flag的值 进而改变PWM的占空比  目前PWM的精确度为1%
函数参数:无
函数返回值:无
*****************************************************************************/
void Key()
{ 
  P1DIR&=~(BIT3+BIT3);//设置IO为输入模式
  P1REN|=BIT3+BIT4;//启用上拉/下拉模式
  P1OUT|=BIT3+BIT4;//设置为上拉模式               
  {         
    if((P1IN&BIT3)==0)//按键按下
    {
      delay();                  //延时用来消除按键的抖动
      while(!(P1IN&BIT3));      //等待按键松手
      flag+=1;                  //flag+1   用来改变占空比
      if(flag>100)              //占空比到100  清零
        flag=0;
    }
    if((P1IN&BIT4)==0)//同上注释
    {
      delay();
      while(!(P1IN&BIT4));
      flag-=1;
      if(flag>100)
        flag=0;
    }
  }
}

/**************************************************************************
函数名称: PWM_Init
函数功能:初始化PWM
函数参数:无
函数返回值:无
***************************************************************************/
void  PWM_Init()
{
  P1DIR |= BIT2;                            // 设置P1.2为输出
  P1SEL |= BIT2;                            // 选择P1.2的PWM功能
  P1SEL2 = 0;				    //选择默认引脚功能 
  CCR0 = 100;                              // 设定PWM  周期  
  CCTL1 = OUTMOD_7;                         
  TACTL = TASSEL_2 + MC_1;                  // SMCLK时钟  增计数模式 
}

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
  PWM_Init();
  for (;;)
  {
    Key();
    CCR1 = flag;
  }
}


对于MSP430F5529单片机,可以使用Timer模块来实现可调PWM信号输出。具体步骤如下: 1. 配置Timer模块的工作模式计数器周期。选择合适的钟源和分频系数,以确定信号的输出周期。 2. 配置Timer模块的比较输出通道,使其输出PWM信号。设置比较值来控制PWM信号的占空比。 3. 编写中断服务程序,根据需要在比较事件发生时进行相关操作。 下面是一个简单的示例代码,演示如何配置MSP430F5529单片机的PWM信号输出: ```c #include <msp430.h> #define PWM_PERIOD 1000 // PWM信号周期,根据实际需求调整 #define PWM_DUTY_CYCLE 500 // PWM信号占空比,根据实际需求调整 void main(void) { WDTCTL = WDTPW | WDTHOLD; // 停用看门狗定时器 P1DIR |= BIT2; // 配置P1.2为输出引脚 P1SEL |= BIT2; // 配置P1.2为TA0.1比较输出功能 TA0CCR0 = PWM_PERIOD - 1; // 设置计数器周期 TA0CCR1 = PWM_DUTY_CYCLE - 1; // 设置比较值,控制占空比 TA0CCTL1 = OUTMOD_7; // 设置比较输出模式为PWM模式 TA0CTL = TASSEL_2 + MC_1; // 选择SMCLK作为时钟源,启动计数器 __bis_SR_register(LPM0_bits); // 进入低功耗模式0 } #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A(void) { // 中断服务程序 TA0CCTL1 &= ~CCIFG; // 清除比较中断标志位 } ``` 在上述代码中,我们使用TimerA模块(TA0)的通道1来输出PWM信号。通过调整`PWM_PERIOD`和`PWM_DUTY_CYCLE`的值,可以调节PWM信号的周期和占空比
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值