前言
在蓝桥杯嵌入式第十一届省赛题里,出现这样一个问题,一个定时器同时完成多路不同频率不同占空比的波形输出。
这个问题应该难倒了不少小伙伴吧。可能会遇到正负占空比跳动,波形频率跳动的问题。
笔者也是查阅了各种资料,进了很多坑,总结出来了一个比较完善的定时器配置和比较稳定的程序。
当然第十一届省赛这个问题对于G431也可以使用不同的定时器来完成PA6,PA7的波形输出。
闲话不多说,开始步入正题。
一、输出比较模式
笔者只是简单的进行一下讲解,有不懂的小伙伴,可以自行查阅相关资料。
我们需要输出比较模式是做什么的,首先需要明白TIMx_CCRx寄存器的作用,在输出比较模式下,TIMx_CNT里的数会周期性自动递增,当递增至TIMx_CNT寄存器的值与TIMx_CCRx的值相同时,根据TIMx_CCMRx寄存器和TIMx_CCER寄存器的设置,来决定此时是通道对应的GPIO口电平状态:
1,翻转,2,置成有效电平,3,置成无效电平。
在自动重载下,当TIMx_CNT的值与TIMx_ARR的值相同时,就会置零,继续周期性递增.
由此可以明白输出比较模式的下TIMx_CCRx的值的作用。即设置电平改变的时间点(说法有点不准确)。
注意:TIMx_ARR寄存器,TIMx_CCMRx寄存器和TIMx_CCER寄存器,的内容在CUBUMX初始化的时候进行设置,无需我们在程序里设置。
但是需要明白TIMx_CCRx寄存器作用。
不懂也没关系,看程序,配置,注释。
二、CubeMx配置
(上图)配置说明:
设置主频为170Mhz。可以输入170按回车,也可以按照图中进行配置。
(上图)配置说明:1,选择TIM3定时器,通道一,通道二,输出比较模式,内部时钟。
2,分频169。这样定时器频率=170000000(主频)/(169+1)=1000000。
即TIM3->CNT每秒递增1000000次,即每1us加1。
3,TIM3->ARR设置为0xfffff,即TIM3->CNT递增至0xffff时置0。然后继续从0递增。
4,自动装载
(上图)配置说明:模式选择Active level on match。
笔者选择的这个模式下,当TIM3->CTN的值与TIM3->CCRX的相同时,电平会置成有效电平。
注意:笔者没有选择翻转模式Toggle on match
,因为翻转模式下电平可以从低到高,也可以从高到低,处理不当很容易出现正负占空比会出现颠倒问题。Toggle on match模式主要用于输出占空比%50的方波。
三、程序
结构体变量
注意:笔者建议变量最后都写在结构体里
1,代码简洁
2,易于查找和管理变量,鉴于keil5的代码自动补全功能。
3,不用为变量名的取名字而烦恼,不同的结构体变量的成员变量名可以使一样的哦。