历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | MSP430G2253 产生占空比可调的PWM
2020-02-12 来源:eefocus
最近刚刚做了一个用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 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; } }
史海拾趣
|
此是一款兼容ASK/OOK接收單芯片模块,可直接至标准编码器或CPU编码,频率有315M、390M、433.92MHz等选择,外部电路非常简捷。不但具有接收灵敏度高,温度特性好,抗干扰能力强,通信距离远,且可通过欧美规范认证,应用到您的无线设备中,为您的产 ...… 查看全部问答> |
|
今天在看一个datasheet of DCDC BUCK过程中,看到反馈端到Vout有一个Cfwd,不知道是做什么用的?请教各位 是不常么?… 查看全部问答> |
|
PC机与单片机通过RS232串口通信,请各位哥哥姐姐帮忙修改下错误,小弟确实不知道从哪修改 下面是一个PC机与单片机通过RS232串口通信,PC机上C程序(对8250的初始化,PC机发送接受程序) 请各位哥哥姐姐帮忙修改下错误,小弟确实不知道从哪修改 //////////////////////////////////////////////////////////////////// //函数名:RS23 ...… 查看全部问答> |
|
高手帮忙看一下,MPlayer在s3c2410上移植的问题.急!! 在移植MPlayer到s3c2410上时遇到一个问题,就是在配置事遇到不能配置成功,所以现在还不能make 我的./configure是这样的: ./configure --host-cc=gcc --cc=arm-linux-gcc --target=arm-armv41-linux --enable-static --prefix=/tmp/mplayer --disab ...… 查看全部问答> |
|
请问各位,TLC5615怎么用,怎样通过单片机控制其输出电压?比如说我的基准电压为7.5V,怎样让它的输出变成8V\\9V\\10V等等… 查看全部问答> |




