2023年12月24日发(作者:)

PWM Timer

概述

S3C2410A有5个16位定时器。其中定时器0、1、2、3有脉宽调制(PWM)功能。定时器4有只有一个内部定时器而没有输出管脚。定时器0有一个死区发生器,用于大电流器件。

定时器0和1共享一个8位预定标器,定时器2、3和4共享另一个8位预定标器。每一个定时器有一个有5种不同值的时钟分割器(1/2,1/4,1/8,1/16和TCLK)。其中每一个定时器块从时钟分割器接收时钟信号,而时钟分割器从响应的预定标器接收时钟信号。8位预定标器是可编程的,它根据TCFG0和TCFG1中的数值分割PCLK。

在定时器计数缓冲寄存器(TCNTBn)中有一个初始值,当定时器使能后,这个值就被装载到递减计数器中。而在定时器比较缓冲寄存器(TCMPBn)中也有一个初始值,这一值被装载到比较寄存器中,用来与递减计数器值进行比较。这两个缓冲器使得在频率和占空比发生改变时仍能产生一个稳定的输出。

每一个定时器有一个16位的递减计数器,由定时器时钟驱动。当计数器的值到0,定时器就会产生一个中断请求来通知CPU定时器的操作已经完成。当定时器计数器到0时,TCNTn的值自动的加载到递减计数器中以继续下一操作。但是,当定时器因某种原因停止,如在定时器运行模式中清除定时器使能位(TCONn中)时,TCNTBn中的值将不再加载到计数器中。

TCMPBn中的数据是用来脉宽调制的。当递减计数器的值与比较寄存器的值相同时,定时器控制逻辑将改变输出电平。因此,比较寄存器决定一个PWM输出的接通时间。

特性

5个16位定时器;

2个8位预定标器和2个4位分割器;

可编程的占空比;

自动再装入模式或一次脉冲模式;

死区发生器。

图1、16位PWM定时器模块框图

预定标器和分割器

一个8位预定标器和一个4位分割器作用下的输出频率:

4位分割器的设置

1/2(PCLK=66.5MHz)

1/4(PCLK=66.5MHz)

1/8(PCLK=66.5MHz)

1/16(PCLK=66.5MHz)

最低分解力

(预定标器=0)

0.0300us(33.2500MHz)

0.0601us(16.6250MHz)

0.1203us(8.3125MHz)

0.2406us(4.1562MHz)

最高分解力

(预定标器=255)

7.6992us(129.8828KHz)

15.3984us(64.9414KHz)

30.7968us(32.4707KHz)

61.5936us(16.2353KHz)

最大间隔时间(TCNTBn=65535)

0.5045sec

1.0091sec

2.0182sec

4.0365sec

定时器基本操作

图2、定时器运行时序

一个定时器(定时器4除外)都包含TCNTBn、TCNTn、TCMPBn和TCMPn几个寄存器。(TCNTn和TCMPn是内部寄存器的名称。TCNTn的值可以通过读TCNTOn得到)当定时器达到0时,TCNTBn和TCMPBn的值将自动加载到TCNTn和TCMPn中。当TCNTn到0且中断使能时,定时器将产生一个中断请求。

自动加载和双缓冲模式

脉宽调制定时器有一个双缓冲功能,在这种情况下,改变下次加载值的同时不影响当前定时周期。因此,尽管设置一个新的定时器值,当前定时器的操作将会继续完成而不受影响。

定时器的值可以写入定时器计数值缓冲寄存器(TCNTBn)中,而当前计数器的值可以通过读定时器计数值观测寄存器(TCNTOn)得到。

当TCNTn的值到0时,自动加载操作复制TCNTBn的值到TCNTn中。但是如果自动加载模式没有使能,TCNT0将不进行任何操作。

图3、双缓冲功能时序图

用手动更新位和逆变器位对定时器进行初始化

当递减计数器的值到0时,自动加载操作才能进行。所以,用户必须预先对TCNTn定义一个起始值。因此,起始值必须由手动更新位载入。以下步骤描述了怎么起始一个定时器:

将初始值写入到TCNTBn和TCMPBn中;

设置相应定时器的手动更新位。推荐配置逆变器位开或关(不管逆变器用与否);

设置相应定时器的起始位从而启动一个定时器(同时清除手动更新位)。

如果定时器被迫停止,TCNTn将保留计数器的值且不重载TCNTBn。如果用户需要设置一个新值,必须执行手动更新。

注:无论何时TOUT逆变器开关位的值改变,TOUTn的逻辑值将随之改变。因此,推荐逆变器开关位的配置与手动更新位同时进行。

定时器操作步骤:

以下操作步骤地结果如图4所示。

[1] 使能自动加载功能。设置TCNTBn为160,TCMPBn为110。设置手动更新位并配置逆变器位。手动更新位设置TCNTn和TCMPn的值与TCNTBn和TCMPBn相同。

[2]

[3]

[4]

[5]

然后设置TCNTBn和TCMPBn的值分别为80和40,确定下一个周期的值。

如果手动更新位为0、逆变器关且自动加载开,则设置起始位。则在定时器的延迟时间后定时器开始递减计数。

当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。

当TCNTn的值到0时,产生一个中断并且将TCNTBn的值加载到一个临时寄存器。在下一个时钟周期,TCNTn由临时寄存器加载到TCNTn中。

在中断服务程序中,TCNTBn和TCMPBn分别设置成80和60;

[6] 当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。

[7] 当TCNTn到0时,TCNTn自动重新加载,并出发一个中断请求;

[8] 在中断服务子程序,自动加载和中断请求都被禁止,从而将停止定时器;

[9] 当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。

[10] 当TCNTn的值为0时,TCNTn将不再重新加载新的值,从而定时器停止;

[11] 由于中断请求被禁止,不再产生中断请求。

图4、定时器操作示意图

脉宽调制

图5、脉宽调制示意

脉宽调制功能可以通过改变TCMPBn的值实现。PWM的频率由TCNTBn决定。图5是一个通过改变TCMPBn的值实现PWM的例子。

如果想得到一个高的PWM值,则要减小TCMPBn的值。相反,如果想要得到一个低的PWM值,则要增加TCMPBn的值。如果逆变器使能的话,则情况正好相反。

由于定时器具有双缓冲功能,则在当前周期的任何时间都可以通过ISR和其

它程序改变TCMPBn的值。

输出电平控制

以下步骤描述了如何在逆变器关闭的情况下,控制TOUT的值为高或低:

关闭自动加载位。然后,TOUT变高且在TCNTn为0后定时器停止运行;

通过定时器开始位清零来停止定时器运行。如果TCNTn<=TCMPn,则输出为高,如果TCNTn>TCMPn,输出为低;

通过改变TCON中的逆变器开关位来使TOUTn为高或为低。

图6、逆变器开与关时的输出

死区发生器

死区是为了功率器件中的PWM控制。这一功能使能在一个开关器件关闭和另一个开关器件开启的间隔时间。这一时间间隔禁止了两个开关器件同时出于开启状态,即使是一段非常短的时间内。

TOUT0是一个PWM输出。nTOUT0是TOUT0的反相。如果死区使能,则TOUT0和nTOUT0的输出波形将是TOUT0_DZ和nTOUT0_DZ。nTOUT0_DZ由TOUT1脚输出。

在死区间隔,TOUT0_DZ和nTOUT0_DZ将不会同时开启。

图7、死区使能后的输出波形

DMA请求模式

PWM定时器能在任何时间产生一个DMA请求。定时器保持DMA请求信号(nDMA_REQ)为低直到定时器接收到ACK信号。当定时器接收到ACK信号时,定时器将使请求信号无效。产生DMA请求的定时器由设置DMA模式位(TCFG1)决定。如果一个定时器配置成DMA请求模式,则此定时器将不能产生中断请求,而其它定时器将正常产生中断请求。

DMA模式配置和DMA/中断操作

图8、定时器4的DMA模式操作

PWM定时器专用寄存器

定时器配置寄存器0(TCFG0)

定时器输入时钟频率=PCLK/{预定标器的值+1}/分割器值

预定标器值=0~255;

分割器=2,4,8,16。

寄存器名称

TCFG0

TCFG0

保留

死区长度

预定标器1

预定标器0

31:24

23:16

15:8

7:0

这8位决定死区长度,一个死区长度的单位时间等于定时器0的单位时间长度

决定定时器2,3,4的预定标器值

决定定时器0和1的预定标器值

描述 初始值

0x0

0x0

0x0

0x0

地址

0X51000000

R/W

R/W

描述

配置2个8位预定标器

初始值

0x0

定时器配置寄存器1(TCFG1)

寄存器名称

TCFG1

TCFG1

保留

DMA模式

31:24

23:20

选择DMA模式通道:

0000=No select; 0001=Timer0; 0010=Timer1;

0011=Timer2; 0100=Timer3; 0101=Timer4;0110=保描述 初始值

00000000

0000

地址

0X51000004

R/W

R/W

描述

分割器和DMA模式选择寄存器

初始值

0x0

MUX4 19:16

选择PWM定时器4的MUX输入

0000=1/2 0001=1/4 0010=1/8

01xx=TCLK1

选择PWM定时器3的MUX输入

0000=1/2 0001=1/4 0010=1/8

01xx=TCLK1

选择PWM定时器2的MUX输入

0000=1/2 0001=1/4 0010=1/8

01xx=TCLK1

选择PWM定时器1的MUX输入

0000=1/2 0001=1/4 0010=1/8

01xx=TCLK0

选择PWM定时器0的MUX输入

0000=1/2 0001=1/4 0010=1/8

01xx=TCLK0

0011=1/16 0000

MUX3 15:12 0011=1/16 0000

MUX2 11:8 0011=1/16 0000

MUX1 7:4 0011=1/16 0000

MUX0 3:0 0011=1/16 0000

定时器控制寄存器(TCON)

寄存器名称

TCON

TCON

定时器4自动加载开关

定时器4手动更新位

定时器4开关

定时器3自动加载开关

定时器3输出逆变器开关

定时器3手动更新位

定时器3开关

定时器2自动加载开关

定时器2输出逆变器开关

定时器2手动更新位

22

21

20

19

描述

决定定时器4的自动加载开关

0=一次;1=自动加载

决定定时器4的手动更新

0=无操作;1=更新TCNTB4

决定定时器4的开与关

0=停止;1=启动定时器4

决定定时器3的自动加载开关

0=一次;1=自动加载

决定定时器3的输出逆变器开关

0=逆变器关;1=逆变器开,改变TOUT3

决定定时器3的手动更新

0=无操作;1=更新TCNTB3&TCMPB3

决定定时器3的开与关

0=停止;1=启动定时器3

决定定时器2的自动加载开关

0=一次;1=自动加载

决定定时器2的输出逆变器开关

0=逆变器关;1=逆变器开,改变TOUT2

决定定时器2的手动更新

0=无操作;1=更新TCNTB2&TCMPB2

初始值

0

0

0

0

地址

0X51000008

R/W

R/W

描述

定时器控制寄存器

初始值

0x0

18 0

17

16

15

0

0

0

14 0

13 0

定时器2开关

定时器1自动加载开关

定时器1输出逆变器开关

定时器1手动更新位

定时器1开关

保留

死区使能

定时器0自动加载开关

定时器0输出逆变器开关

定时器0手动更新位

定时器0开关

12

11

决定定时器2的开与关

0=停止;1=启动定时器2

决定定时器1的自动加载开关

0=一次;1=自动加载

决定定时器1的输出逆变器开关

0=逆变器关;1=逆变器开,改变TOUT1

决定定时器1的手动更新

0=无操作;1=更新TCNTB1&TCMPB1

决定定时器1的开与关

0=停止;1=启动定时器1

决定死区操作

0=不使能;1=使能

决定定时器0的自动加载开关

0=一次;1=自动加载

决定定时器0的输出逆变器开关

0=逆变器关;1=逆变器开,改变TOUT0

决定定时器0的手动更新

0=无操作;1=更新TCNTB0&TCMPB0

决定定时器0的开与关

0=停止;1=启动定时器1

0

0

10 0

9

8

7:5

4

3

0

0

0

0

2 0

1

0

0

0

注:手动更新位需要在下一次写时清除

定时器0计数缓冲寄存器&比较缓冲寄存器(TCNTB0/TCMPB0)

寄存器名称

TCNTB0

TCMPB0

TCMPB0

定时器0比较缓冲寄存器

TCNTB0

定时器0的计数缓冲寄存器

15:0

描述

设置定时器0的计数缓冲寄存器值

初始值

0x0

15:0

描述

设置定时器0的比较缓冲寄存器值

初始值

0x0

地址

0X5100000C

0X51000010

R/W

R/W

R/W

描述

定时器0的计数缓冲寄存器

定时器0的比较缓冲寄存器

初始值

0x0

0x0

定时器0计数观测寄存器(TCNTO0)

寄存器名称

TCNTO0

地址

0X51000014

R/W

R

描述

定时器0的计数值观测寄存器

初始值

0X0

TCNTO0

定时器0观测寄存器

15:0

描述

设置定时器0计数观测值

初始值

0x0

定时器1计数缓冲寄存器&比较缓冲寄存器(TCNTB1/TCMPB1)

寄存器名称

TCNTB1

TCMPB1

TCMPB1

定时器1比较缓冲寄存器

TCNTB1

定时器1的计数缓冲寄存器

15:0

描述

设置定时器1的计数缓冲寄存器值

初始值

0x0

15:0

描述

设置定时器1的比较缓冲寄存器值

初始值

0x0

地址

0X51000018

0X5100001C

R/W

R/W

R/W

描述

定时器1的计数缓冲寄存器

定时器1的比较缓冲寄存器

初始值

0x0

0x0

定时器1计数观测寄存器(TCNTO1)

寄存器名称

TCNTO1

TCNTO1

定时器1观测寄存器

15:0

描述

设置定时器1计数观测值

初始值

0x0

地址

0X51000020

R/W

R

描述

定时器1的计数值观测寄存器

初始值

0X0

定时器2计数缓冲寄存器&比较缓冲寄存器(TCNTB2/TCMPB2)

寄存器名称

TCNTB2

TCMPB2

TCMPB2

定时器2比较缓冲寄存器

TCNTB2

定时器2的计数缓冲寄存器

15:0

描述

设置定时器2的计数缓冲寄存器值

初始值

0x0

15:0

描述

设置定时器2的比较缓冲寄存器值

初始值

0x0

地址

0X51000024

0X51000028

R/W

R/W

R/W

描述

定时器2的计数缓冲寄存器

定时器2的比较缓冲寄存器

初始值

0x0

0x0

定时器2计数观测寄存器(TCNTO2)

寄存器名称

TCNTO2

TCNTO2

定时器2观测寄存器

15:0

地址

0X5100002C

R/W

R

描述

定时器2的计数值观测寄存器

描述

初始值

0X0

初始值

0x0

设置定时器2计数观测值

定时器3计数缓冲寄存器&比较缓冲寄存器(TCNTB3/TCMPB3)

寄存器名称

TCNTB3

TCMPB3

TCMPB3

定时器3比较缓冲寄存器

TCNTB3

定时器3的计数缓冲寄存器

15:0

描述

设置定时器3的计数缓冲寄存器值

初始值

0x0

15:0

描述

设置定时器3的比较缓冲寄存器值

初始值

0x0

地址

0X51000030

0X51000034

R/W

R/W

R/W

描述

定时器3的计数缓冲寄存器

定时器3的比较缓冲寄存器

初始值

0x0

0x0

定时器3计数观测寄存器(TCNTO3)

寄存器名称

TCNTO3

TCNTO3

定时器3观测寄存器

15:0

描述

设置定时器3计数观测值

初始值

0x0

地址

0X51000038

R/W

R

描述

定时器3的计数值观测寄存器

初始值

0X0

定时器4计数缓冲寄存器(TCNTB4)

寄存器名称

TCNTB4

TCNTB4

定时器4的计数缓冲寄存器

15:0

描述

设置定时器4的计数缓冲寄存器值

初始值

0x0

地址

0X5100003C

R/W

R/W

描述

定时器4的计数缓冲寄存器

初始值

0x0

定时器4计数观测寄存器(TCNTO4)

寄存器名称

TCNTO4

地址

0X51000040

R/W

R

描述

定时器4的计数值观测寄存器

初始值

0X0

TCNTO4

定时器4观测寄存器

15:0

描述

设置定时器4计数观测值

初始值

0x0