PWM定时器是最常用的定时器,包括51单片机里面的简单定时器也是PWM定时器。
PWM定时器主要作用是产生PWM波形,原理就是一个定时器(计数器)。
以三星公司的S5PV210为例,现在阐述一下ARM的PWM定时器。
这个CPU有五个PWM定时器,0,1,2,3各自对应一个外部GPIO,输出PWM信号,timer4没有对应的GPIO,
这个主要用来作为产生内部中断来使用。它们的时钟来源是PCLK_PSYS.
至于分频器,timer0、1共用一个预分频器,timer2、3、4共用一个预分频器,每个定时器又独自有一个分频器,构成两级分频。
打开S5PV210数据手册,在PWM定时器工作原理框图中我们可以看到,里面有很多寄存器以及外设:
时钟源,预分频器,分频器,TCMPB,TCNTB,dead zone(死区)等,接下来通过手册介绍来详细解读一下。
两级分频,分频的倍数是两级相乘。它们在TCFG0以及TCFG1寄存器中配置。
TCFG0是预分频的,timer0、1共用一个预分频器prescaler0,timer2、3、4共用一个预分频器prescaler1。
在TCFG0中,prescaler0、1都是八位,分频系数在1~256。分频器是一个MUX开关,决定了分频线路(分频值)。
分频系数最小1/2,最大是1/4096.
PCLK_PSYS为66MHz(默认时钟),此时两级分频后的时钟范围就是0.03us到62.061us,TCNTB的值范围是1~到2的32次方,里面设置的值可以非常大。最长设置的时间甚至可以达到好几天。
TCNTB的作用是程序员把需要减的数值放入TCNTB中,然后有个寄存器负责把TCNTB里面的数值写入TCNT中(不能人为操作,硬件自动完成),TCNT负责减数,
如果想读取TCNT中的数,直接读TCNTO(定时值捕获器)中的值。(即TCNT不能读写,它里面的初值在TCNTB中设置,减的过程中数在TCNTO中读)。
定时器工作时,代码经常需要循环来做,你可以用循环来不断写入初值(早期51单片机需要每次重装初值)
S5PV210有自动装载机制,每个周期以后会自动装载初值。
PWM既然是脉冲波形调制,就是与输出脉冲有关。PWM是周期函数,重要参数占空比:一个周期内高电平的时间除以低电平的时间。
TCMPB决定了占空比,最终形成的占空比就是TCMPB/TCNTB,比如TCNTB写入200,TCMPB写入100,占空比就是1/2
TCNT减的时候会和TCMPB相互比较,如果比TCMPB大,则为高电平,比TCMPB小,则输出低电平。
电平翻转器的作用是负责把电平翻转过来,高的时候翻转输出低,低的时候翻转输出高。
死区生成器是针对整流等使用的,这里直接关掉就行了。
原理和各个寄存器已经说明完成,接下来就是编程了。