[smart210] 定时器与PWM

平台:smart210

CPU:s5pv210

目标:学习如何配置定时器timer,实现PWM输出功能以及利用定时器产生中断

知识储备:s5pv210有5个定时器,其中定时器0,1,2,3具有PWM输出功能,均有专门的引脚作为输出。而定时器4是内部定时器,不具备输出引脚。

该CPU的定时器,所需要配置的寄存器并不多,主要有TCON(Timer Control),TCFG0(Timer Configuration 0),TCFG1(Timer Configuration 1),TCNTBn(Timer n Counter Buffer),TCMPB(Timer n Compare Buffer),TCNTOn(Timer n Counter Observation)。其中n代表定时器编号,有0~3共4个PWM定时器

image

我们可以先通过TCFG0和TCFG1来配置定时器的输入时钟。

image

image

由此可知,每个定时器都能通过两个关键的分频因子prescaler和divider来配置输入时钟的频率,而原始输入时钟是PCLK_PSYS,这样一来根据公式:TCLKn=PCLK_PSYS/(prescaler+1)/(divider mux n)就能得到具体需要的时钟频率了。

接下来就是定时器控制寄存器TCON的设置了。

image

可见,每个定时器都有  开始/停止  、手动刷新 、输出同相/反相  、单次载入/自动重载  的功能。

以定时器0为例,我们能够通过TCMPB0和TCNTB0来初始化比较值和起始值(起始值>比较值),通过TCON做定时器控制,在定时器开始工作前,设置TCON中的Timer 0 Manual Update的值为1,就能“手动”把TCMPB0和TCNTB0这两个缓冲寄存器的值预先放入内部寄存器TCMP0和TCNT0中,然后Start Timer 0(把这个称作状态0),TCNT0按照时钟频率做减一计数,当TCNT0=TCMP0时(这个称作状态1),定时器0的输出管脚TOUT0反转,TCNT0继续减一计数直到为0的时候(这时称作状态2),输出管脚再次反转,触发定时器0的中断(如果之前有使能该中断源),如果设置了Timer 0 Auto Reload = 1,则TCMPB0与TCNTB0的值就会自动重新载入TCMP0与TCNT0,开启新一轮计数,回到状态0。已知TOUT0引脚默认初始是高电平

简化上面的流程,我们能发现TOUT0的变化过程,状态0时是高电平,状态1时是低电平,状态2时回到高电平,自动重载后又回到状态0。从状态0到状态2称作一个小周期,那么,此时的【占空比】=【状态0到状态1的持续时间】/【状态0到状态2的持续时间】。假设我们得到的TCLK0=10Mhz(100ns),假设设置的TCNTB0=100,TCMPB0=20,则状态0到状态1(高电平持续时间)=(TCNTB0-TCMPB0)*100ns=8us,状态1到状态2(低电平持续时间)=TCMPB0*100ns=2us,整个TOUT0的周期为10us,占空比=80%

由上可知,在当TOUT0默认高电平时,先设置好TCNTB0的值,固定好TOUT0输出脉冲的周期,通过不断设置TCMPB0值,就能不断调制输出脉冲的脉宽,这就是PWM脉宽调制技术的原理,输出周期为TCNTB0*TCLK0,输出占空比=(TCNTB0-TCMPB0)/TCNTB0 。

如果我们设置了Timer 0 Output Inverter on/off=1,则TOUT输出会反相,输出占空比=TCMPB0/TCNTB0,输出周期仍为TCNTB0*TCLK0。

posted @ 2013-08-15 17:35  轻羽  阅读(1078)  评论(0编辑  收藏  举报