MSPM0开发学习笔记
第一章 初步安装与配置
第二章 GPIO
第三章 TIMER
第四章 TIMER-PWM
一、Timer-Pwm原理与作用介绍
PWM通过定时器(TIMER)实现周期性脉冲信号的精确控制,其本质是利用计数器与比较寄存器协同工作生成可调占空比的方波。定时器以系统时钟为基准,通过分频器调整计数频率后驱动计数器循环累加(或递减),当计数值达到预设的自动重载值(ARR)时复位并触发周期更新。在此过程中,比较寄存器(CCRx)设定阈值,当计数值低于阈值时输出高电平,高于阈值时输出低电平,从而通过调节CCRx与ARR的比值动态控制高电平持续时间(占空比)。PWM的核心功能在于将数字信号转化为模拟控制量,通过调节占空比实现电压、功率或机械位置的连续控制,例如驱动电机调速、LED亮度调节、舵机角度控制等场景。多路PWM通道可共享同一定时器,在统一频率下独立调节各通道占空比
二、syscfg配置
1、TIMER-PWM
在TIMER-PWM中进行配置
1、可以看到,黄色的部分都是上节课TIMER中配置过的,这边就不赘述了,不了解的朋友可以在文章顶部访问上篇文章进行学习。
2、接下来看绿色部分,可以看到这边可以通过设置PWM Period Count 的值来调整生成PWM波的频率,他们的乘积是上面的Calculated Clock Frequency (Hz)
3、再看下面一个绿色的部分 PWM Mode 这个地方是对于波的相位的控制,因为是一下控制多个波输出的(下面白色部分选择了Channel0和Channel2),如果不同波的占空比不同,他们的初始相位就需要我们进行设置,这边选择的Edge-aligned Down Counting边缘对齐,初次之外还有Center-aligned(中心对齐)等方式。可以通过文档中的图来看一下二者的区别
Edge-aligned Down Counting对齐
Center-aligned中心对齐
但是除非我们使用的涉及到无刷电机,否则这个其实并没有什么影响,所以我们这边先选择默认的Edge-aligned Down Counting就好
4、再往下看,灰色部分的就是可以对其中的一个波形进行单独调整的地方,值得注意的是,在同一个TIMER控制的PWM输出不同波中,频率是一定相同的,能改变的只有占空比之类的数据
5、再继续看一下这边的红色部分,可以配置pwm波的具体输出引脚
配置完之后就可以开始程序的设计了
三、程序设计
具体代码如下:
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
//__WFI();
}
}
这个的代码还是比较简单的
SYSCFG_DL_init()进行初始化
DL_TimerG_startCounter(PWM_0_INST)开始计时
值得一提的是为什么我要将例程中的__WFI()给注释掉,原因是这个实际上是让板子进入一个低功耗的状态,是好事但是我们在电赛的控制题中是不注重这个低功耗的,并且如果经常在状态转换中出现意想不到的错误,为了避免不必要的麻烦,我们就直接选择不考虑低功耗相关问题了。
四、进阶:按钮控制PWM占空比
我们可以基于这个改一个比较难一点的项目
1、syscfg配置
首先肯定要添加一个按钮的GPIO,这个具体内容在第二章GPIO里面已经讲过了,这边也再过一下,只需要设置下图中圈起来的几个地方就可以了。我们就把GPIO连接到这个PB21上面去了
2、程序设计
我们要如何在程序中设置/修改PWM波的占空比呢,这个是之前没有涉及到的内容,我们在syscfg中配置之后,我们可以按以下步骤在Debug/ti_msp_dl_config.c中找到我们需要的函数:
可以看到这边的DL_TimerG_setCaptureCompareValue就是我们需要的函数
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
if(DL_GPIO_readPins(GPIO_GRP_0_PORT, GPIO_GRP_0_PIN_0_PIN))
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 22400, DL_TIMER_CC_0_INDEX);
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 9599, DL_TIMER_CC_1_INDEX);
}
else
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 9599, DL_TIMER_CC_0_INDEX);
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 22400, DL_TIMER_CC_1_INDEX);
}
}
}
DL_TimerG_setCaptureCompareValue的传入参数不会写得话,可以直接在syscfg里面配置完然后按刚才的方法去Debug/ti_msp_dl_config.c里面复制一份就可以,在syscfg里面配置成30% 70%这样然后过去复制 就得到9599 22400这样的Value数据
GPIO按钮那边的传入参数不知道名称的话可以在Debug/ti_msp_dl_config.h里面进行查找(配置完需要编译下才可以)
这个代码的逻辑还是比较清晰的,按下按钮和松开按钮来调节Channel1和Channel0的占空比。