定时器输出比较所谓输出比较就是通过单片机的定时器向外输出精确的方波信号而由上图可以看出定时器总共有四个通道这些通道既可以作为输入也可以作为输出。PWM信号比如说想通过定时器来产生PWM信号那么什么是PWM信号呢PWM就是脉冲宽度调制信号他是一种周期信号如下图所示划分出了PWM的一个周期我们将一个周期内高电压所占的比例称之为占空比所以PWM的特点就是周期恒定占空比可调。如下图中列出了占空比分别为20%、50%、80%的信号。可以通过调节占空比来等效地表示信号的大小如下图所示上边的曲线所表示的就可以对应为的下边的PWM信号。可以看出信号强度越强的地方PWM的占空比就越高信号强度越低的地方对应的占空比就越小。接下来我们以产生一个周期为1ms占空比为50%的PWM信号为例来解释PWM输出比较的工作原理。如下图假设时钟源的频率为8MHz预分频器的PSC设置为799分频系数为7991800经过分频器之后的频率为10KHz之后将自动重装寄存器ARR设置为9重复技术器RCR设置为0那么每个周期就是1ms触发一次update事件。如下图所示使用一根红色的线来表示自动重装寄存器ARR的值可以看到计数器CNT的值从0开始递增一直递增到和ARR相等。注意观察在最上面的图中每个输入捕获和输出比较通道之间都有一个CCR捕获/比较寄存器。如下图所示向CCR1写入4当CNT小于CCR时输出高电平当CNT的值大于CCR时输出低电平这样子就得到了周期为1ms占空比为50%的PWM信号。时基单元决定了信号的周期CCR决定了信号的占空比。输出比较运行流程下图是输出比较的运行流程注意虚线表示的互补输出的功能并不是所有的定时器都有的只有高级定时器才有这个互补输出的功能输出比较首先需要对CNT和CCR进行比较分三种情况1.CCRCNT、2.CCRCNT、3.CCRCNTPWM八种模式还需要选择一种模式这里总共有八种模式如下图所示其中比较常用的就是PWM1互补输出之后将产生的信号分为两路其中上面的一路是正常输出下面的一路为互补输出那么为什么需要互补输出呢是因为有些情况下需要使用PWM信号来驱动MOS管比如下图中是一个H桥电路由四个MOS管组成只看左边的两个这两个MOS是交替工作的上面的导通下面的就断开下面的导通上面的就断开但是两个MOS管不能同时导通因为同时导通的话这个电路就短路了。因此对于这两个MOS管来说需要一对互补的PWM进行输出比如上面的是正常的PWM而下面需要输出一个对上面取反的PWM波。极性选择在节点2和3之间有两个极性选择有两种极性分别是Positive正极性和Negitive负极性如下图所示两路信号正常形况下都取正极性即节点2的波形CH1输出的是正常的PWM波而下边的一路经过反向器输出的是和CH1互补的输出如下图所示下面一路信号负极性而在负极性中还有一个反相器下边一路有两个反相器所以负负得正下边一路和上边一路的输出相同。呼吸灯PWM输出实验时基单元的设置设置如下图所示为了防止计数器的值跑飞此处还要选择设置ARR的预加载模式当设置完这些参数时计数器的值就会从0开始递增到999就会发生一次溢出。周期是1ms这里选择CHx CHxN两种输出都使能方便输出两路互补交替闪烁的呼吸灯。下图是接线图可知两个LED都是推挽输出的接法PWM八个参数接下来设置CH1的PWM的八个参数1.设置PWM的模式这里设置为PWM1模式2.设置CCR寄存器的初始值这里设置为03.用来设置CCR的预加载这里设置为Enable使能预加载4.用来设置是否为快速模式一般用于高频PWM场景这里设置为Disable关闭5.用来设置正常输出的极性这里选择high正极性6.用来设置互补输出的极性这里选择high正极性7.用来设置正常输出的空闲状态时的电平状况这里设置为空闲输出低电平8.用来设置互补输出的空闲状态时的电平状况这里设置为空闲输出低电平输出PWM需要使用下面两个编程接口第一个用于启动PWM的正常输出 第二个用于启动PWM的互补输出这两个编程接口都有两个参数第一个参数是定时器的句柄第二个数相应的定时器通道之后还有另外一组编程接口定时器是由许多寄存器组成的比如下图中编程接口就是用来读写这些寄存器的比如下面第一对预分频器的编程接口第一个是SET用来写预分频器PSC的值第二个GET是用来读预分频器PSC的值。同理第二组SET是用来写计数器CNT的值GET是用来读计数器CNT的值。剩下的编程接口作用同上面两个一样。要想达到我们想要的呼吸灯的效果让LED的亮度即占空比按照下图中的公式去变化就行了代码编写实现如下图所示有上面的分析可知占空比duty高电平占的时间CCR/周期CCR/ARR1之后将公式变化一下就是下图中的样子所以代码编写如下需要先获取当前的时间以ms为单位计算占空比之后获取ARR寄存器的值之后计算CCR的值将计算出来的CCR的值写入CCR寄存器中之后就可以看到呼吸灯的效果了。