最近刚刚做了一个用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; } }
上一篇:msp430TIME_B PWM输出
下一篇:基于msp430G2553的低频方波频率、占空比、峰峰值测量函数
推荐阅读最新更新时间:2024-11-11 09:32
设计资源 培训 开发板 精华推荐
- 使用 Infineon Technologies AG 的 IRU1260 的参考设计
- (已验证) ESP8266-12s mini
- LTC3633AIUFD-2 6A 1MHz 2 相降压稳压器的典型应用电路
- ADR291ERZ-REEL 2.5V便携式设备稳压器典型应用电路
- EVAL-ADG2188EB,用于 PBX 数字基站线路模块的模拟开关评估板
- HV823,用于个人数字助理的 1 灯通用灯驱动器
- LT1086CM 1.2V 至 15V 可调稳压器的典型应用
- LTC3649EFE 24V 至 5Vout 突发模式降压稳压器的典型应用电路
- 【涂鸦智能】物联网温湿度机
- #第四届立创大赛#动态电流检测设备