细致看了下手上2440的BSP里的PWM驱动,和GPIO驱动一样,需要知道PWM寄存器的作用才好办事。总结下觉得有用的资料。
对于一个定时器来说,其时钟源输入频率一般不变,即TCFG0(定时器预分频值)和TCFG1(定时器分割值)的值设定后就不需要改变,这样对于PWM提供了一个稳定的时钟源。电机的转速与电机两端的电压成比例,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成比例,占空比越大,电机转得越快。系统中PWM脉冲频率就由TCNTBn决定,PWM脉冲宽度值则由TCMPBn的值来决定,而占空比即为TCMPn/TCNTn。如果要使电机转速下降,即得到一个比较低的PWM脉宽输出值,可以减少TCMPBn的值;要使电机转速增加,即得到一个更高的PWM的输出值,可以增加TCMPBn的值。由于双缓冲器的特性,下一个PWM周期的TCMPBn值可以通过ISR(中断服务程序)或其他手段在当前PWM周期中低电平时的任何一点写入,即在程序中可以通过中断重新设定TCMPBn的值来改变电机的转速。缓冲区TCMPBn、TCNTBn的值不一定等于这个周期的TCMPn、TCNTn的值,但一定是TCMPn、TCNTn的下一个周期的值。
定时器的工作原理
1、设定TCMPBn、TCNTBn两个寄存器,它们表示定时器n的比较值,初始计数值;
2、启动定时器n,通过设置TCON,TCMPBn、TCNTBn的值被装入TCMPn、TCNTn中,在定时器n的工作频率下,TCNTn开始减1计数,其值可以通过TCNTOn寄存器读取;
3、当TCNTn的值等于TCMPn的值时,定时器n的输出管脚TOUTn反转;TCNTn继续减1计数;
4、当TCNTn的值到达0时,其输出管脚TOUTn再次反转,并触发定时器n的中断(如果中断使能);
5、如果在TCON寄存器中将定时器n设为“自动加载”,则TCMPB0和TCNTB0寄存器的值被自动装入TCMP0和TCNT0中,开始下一个计数流程。
定时器n的输出管脚TOUTn初始状态为高电平,当TCNTn的值等于TCMPn的值、TCNTn的值等于0时都会发生反转,
也可以通过TCON寄存器设置其初始电平,这样TOUTn的输出就完全反相了,
通过设置TCMPBn与TCNTBn的值可以设置管脚TOUT输出信号的占空比,这就是所谓的可调制脉冲(PWM),所以这些定时器又被称为PWM定时器。
TCON
TCON有4个作用:
(1)第一次启动定时器时,将TCNTBn、TCMPBn的值装入TCNTn、TCMPn中;
(2)启动、停止定时器;
(3)设置自动重载;
(4)设置TOUTn是否反转;
【3:0】用于定时器0
【11:8】用于定时器1
【15:12】用于定时器2
【19:16】用于定时器3
【22:20】用于定时器4,没有输出引脚反转位
位0: 0——停止定时器, 1——开启定时器;
位1: 1——将TCNTBn、TCMPBn的值装入TCNTn、TCMPn中;
位2: 0——TOUTn不反转, 1——TOUTn反转;
位3: 0——不自动加载, 1——自动加载;
在第一次使用定时器时,需要设置“位1”,使TCNTBn/TCMPBn的值装入TCNTn、TCMPn中。