MSPM0开发学习笔记:TIMER-PWM

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
Edge-aligned Down Counting对齐
Center-aligned中心对齐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的占空比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值