【MSPM0L1306 LaunchPad™ 开发套件】4-2 定时器的多种模式体验之PWM输出
[复制链接]
上一章咱们对通用定时器的定时功能有了初步的了解与测试,本次将体验定时器的PWM输出能力
首先在syscfg配置文件添加一个PWM,如下图:
这个时候发现了一个小问题:
定时器默认是TIMG0且无法修改,不要担忧,更改使用的定时器是在下方的PinMux配置:
先择不同的定时器自动会切换到不同的IO口输出,继续进行定时器的PWM配置。
首先进行定时器的基础配置,这个主要涉及到的就是PWM输出的周期,主要做的工作就是配置时钟源和分频系数以及PWM的周期,这一部分其实和定时功能的基础配置相同,只是最终的指示效果不同,配置完成之后可知直观的看到PWN的频率,例如上图最终配置的PWM的频率为500Hz;
接下来进行PWM配置:
选择模式:模式包括边对其向下计数、边对齐向上计数,中心对齐上下计数,边沿对齐可以产生更高频率的,中心对齐产生的是对称的PWM,此处测试选择边对其向下计数模式;
选择通道:TIMG定时器都有两个通道,此处测试选择通道0;
通道配置:包括初始状态、比较值等,可以通过设置占空比自动挡计算;
更新模式:选择立即生效。
基本配置完成,使用小锤子编译一下,然后DL_TimerG_startCounter(PWM_1_INST);启用定时器就可以了,这里需要注意,定时器1的PWM输出通道0对应的是PA0,这个和LED1的控制引脚重复,请关闭此前对于LED1的IO口初始化以及控制程序,上电下载后测试如下:
PWM频率与占空比与设定一致。
应用实现:
根据开发板的现有配置结合定时器的PWM输出,可以使用LED1实现呼吸灯的作用,呼吸灯的实现主要是通过TIMG0的定时功能控制TIMG PWM输出的占空比,由于定时需要将TIMG0定时通过syscfg配置文件修改为10ms,然后修改定时中断如下:
void TIMER_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(TIMG0)) {
case DL_TIMER_IIDX_ZERO:
if(LED.UpFlag == 0)
{
LED.Upcnt++;
if(LED.Upcnt%100 == 0)
{
LED.UpFlag = 1;
LED.state++;
LED.Upcnt = 0;
}
}
LED.PWMcnt++;
if(LED.PWMcnt >= 10 && LED.PWMcnt <= 90)
{
DL_TimerG_setCaptureCompareValue(PWM_1_INST, 20*(100-LED.PWMcnt), DL_TIMER_CC_0_INDEX);
}
else if(LED.PWMcnt > 110 && LED.PWMcnt <= 190)
{
DL_TimerG_setCaptureCompareValue(PWM_1_INST, 20*(LED.PWMcnt-100), DL_TIMER_CC_0_INDEX);
}
if(LED.PWMcnt >= 200)
LED.PWMcnt = 0;
break;
default:
break;
}
}
效果如下:
呼吸灯
|