arms32410东莞理工钟国斌资料S3C2410中文手册第10章PWM定时器.docx
《arms32410东莞理工钟国斌资料S3C2410中文手册第10章PWM定时器.docx》由会员分享,可在线阅读,更多相关《arms32410东莞理工钟国斌资料S3C2410中文手册第10章PWM定时器.docx(23页珍藏版)》请在冰豆网上搜索。
arms32410东莞理工钟国斌资料S3C2410中文手册第10章PWM定时器
脉宽调制定时器PWMTimer
S3C2410A有5个16位定时器。
其中定时器0、1、2、3有脉宽调制(PWM)功能。
定时器4有只有一个内部定时器而没有输出管脚。
定时器0有一个死区发生器,用于大电流器件。
分频顺序
定时器0和1共享一个8位预定标器(预分频器),定时器2、3和4共享另一个8位预定标器。
每一个定时器有一个有5种不同值的4位时钟分割器(时钟分频器)(1/2,1/4,1/8,1/16和外部时钟TCLK)。
8位预定标器(预分频器)是可编程的,它根据定时器配置寄存器0(TCFG0)和定时器配置寄存器1(TCFG1)中的数值分割PCLK。
定时器配置寄存器0(TCFG0)
定时器输入时钟频率(1s的数值即次/s)=PCLK/{预定标器的值+1}/分割器值
外部时钟TCLK
预定标器值=0~255;
分割器=2,4,8,16。
寄存器名称
地址
R/W
描述
初始值
TCFG0
0X51000000
R/W
配置2个8位预定标器
0x0
TCFG0
位
描述
初始值
保留
31:
24
0x0
死区长度
23:
16
这8位决定死区长度,一个死区长度的单位时间等于定时器0的单位时间长度
0x0
预定标器1
15:
8
决定定时器2,3,4的预定标器值
0x0
预定标器0
7:
0
决定定时器0和1的预定标器值
0x0
定时器配置寄存器1(TCFG1)
寄存器名称
地址
R/W
描述
初始值
TCFG1
0X51000004
R/W
分割器和DMA模式选择寄存器
0x0
TCFG1
位
描述
初始值
保留
31:
24
00000000
DMA模式
23:
20
选择DMA模式通道:
0000=Noselect;0001=Timer0;0010=Timer1;0011=Timer2;0100=Timer3;0101=Timer4;0110=保留
0000
MUX4
19:
16
选择PWM定时器4的MUX输入
0000=1/20001=1/40010=1/80011=1/1601xx=TCLK1(分割器=2,4,8,16)
0000
MUX3
15:
12
选择PWM定时器3的MUX输入
0000=1/20001=1/40010=1/80011=1/1601xx=TCLK1
0000
MUX2
11:
8
选择PWM定时器2的MUX输入
0000=1/20001=1/40010=1/80011=1/1601xx=TCLK1
0000
MUX1
7:
4
选择PWM定时器1的MUX输入
0000=1/20001=1/40010=1/80011=1/1601xx=TCLK0
0000
MUX0
3:
0
选择PWM定时器0的MUX输入
0000=1/20001=1/40010=1/80011=1/1601xx=TCLK0(分割器=2,4,8,16)
0000
在定时器计数缓冲寄存器(TCNTBn)中有一个初始值,当定时器使能后,这个值就被装载到递减计数器(TCNTn)中。
而在定时器比较缓冲寄存器(TCMPBn)中也有一个初始值,这一值被装载到比较寄存器(TCMPn)中,用来与递减计数器值进行比较。
这两个缓冲器使得在频率和占空比发生改变时仍能产生一个稳定的输出。
(这两个缓冲器使定时器产生稳定的输出且占空比可变)。
TCMPBn中的数据是用来脉宽调制的。
核心过程:
通过设置TCFG0和TCFG1来设置定时器输入时钟频率(1s的数值即次/s),然后由定时时间确定TCNTBn的值,如果要产生占空比为50%的脉冲,则设置TCMPBn为0#00,设置自动重载功能允许,设置手动更新允许(初始化时必用,优先于自动重载),可改变TCNTBn和TCMPBn的值,在加载到TCNTn和TCMPn中,然后设置倒相位,倒相位为0(一般)时输出端TOUTn初始化为0,否则相反,然后可设置自动加载。
设置定时器启动且手动更新关闭,当递减计数器的值与比较寄存器的值相同时,定时器控制逻辑将改变输出电平(TOUTn反转)。
因此,比较寄存器决定一个PWM输出的接通时间(开关时间)。
当TCNTn到0且中断使能时,定时器控制逻辑将改变输出电平(TOUTn再次反转),定时器就会产生一个中断请求来通知CPU定时器的操作已经完成,当自动重载允许时TCNTBn和TCMPBn的值将自动加载到TCNTn和TCMPn中。
►S3C2440定时器初始化
以定时器0为例,启动定时器操作步骤大致如下:
1、设置TCMPB0和TCNTB0寄存器;
2、设置TCON寄存器,计数值进行装载;
3、启动定时器;
4、计数器重新被装载。
1voidTimer0_init()
2{
3TCFG0=119;//配置定时器0,1的预分频值
4TCFG1=0x03;//配置定时器0分频值
5TCNTB0=3125;//计数缓存寄存器
6TCMPB0=0;//比较缓存寄存器
7TCON|=(1<<1);//手动更新位且配置反相器位
8TCON=0x09;//定时器使能并自动重载
9}
►定时器报警实验
源代码:
10
11voidDelayMS(U32dly)
12{
13U32time_val;
14
15rTCFG0=3;//配置定时器0,1的预分频值
16rTCFG1=0<<4;//配置定时器1分频值
17
18time_val=PCLK/(3+1)/2/1000-1;//1ms=PCLK/prescaler/divider/1000
19
20rTCNTB1=time_val;//计数缓存寄存器
21rTCMPB1=time_val>>1;//50%
22
23rTCON&=~(0xf<<8);//手动更新位且配置反相器位(开/关)
24rTCON|=0xb<<8;//定时器使能并自动重载
25rTCON&=~(2<<8);//clearmanualupdatebit
26
27while(dly--)
28{
29while(rTCNTO1>=time_val>>1);
30while(rTCNTO1>1);
31}
32}
33
34voidMain(void)
35{
36//----------------添加自己的代码-------------------
37rGPACON&=~(1<<16);
38
39while
(1)
40{
41rGPADAT|=(1<<16);
42DelayMS(1000);
43rGPADAT&=~(1<<16);
44DelayMS(500);
45}
46}
编程改变输出频率
rRTCFG0=0xff;//设置预分频器分频值,TIME0/1=255,TIME2/3/4=0
rRTCFG1=0x1;//S设置定时器中断工作模式
for(freq=4000;freq<14000;freq+=1000)//频率从4000~14000HZ变化
div=(PCLK/256/4)/freq;
rTCON=0x0;
rTCNTB0=div;
rTCMPB0=(2*div)/3;
rTCON=0xa;//手动装定时器的计数值
rTCON=0x9;//启动定时器
for(index=0;index<10000;index++);
rTCON=0x0;//停止定时器
编程改变输出占空比
div=(PCLK/256/4)/8000;//输出频率8000HZ,使用1%~95%的占空比
for(freq=1;freq<50;freq+=5)/
rTCNTB0=div;
rTCMPB0=(rate*div)/50;//修改占空比
rTCON=0xa;//手动装定时器的计数值
rTCON=0x9;//启动定时器
for(index=0;index<10000;index++);
rTCON=0x0;//停止定时器
for(index=0;index<10000;index++);
定时器控制寄存器(TCON)
寄存器名称
地址
R/W
描述
初始值
TCON
0X51000008
R/W
定时器控制寄存器
0x0
TCON
位
描述
初始值
定时器4自动加载开关
22
决定定时器4的自动加载开关
0=一次;1=自动加载
0
定时器4手动更新位
21
决定定时器4的手动更新
0=无操作;1=更新TCNTB4
0
定时器4开关
20
决定定时器4的开与关
0=停止;1=启动定时器4
0
定时器3自动加载开关
19
决定定时器3的自动加载开关
0=一次;1=自动加载
0
定时器3输出逆变器开关
18
决定定时器3的输出逆变器开关
0=逆变器关;1=逆变器开,改变TOUT3
0
定时器3手动更新位
17
决定定时器3的手动更新
0=无操作;1=更新TCNTB3&TCMPB3
0
定时器3开关
16
决定定时器3的开与关
0=停止;1=启动定时器3
0
定时器2自动加载开关
15
决定定时器2的自动加载开关
0=一次;1=自动加载
0
定时器2输出逆变器开关
14
决定定时器2的输出逆变器开关
0=逆变器关;1=逆变器开,改变TOUT2
0
定时器2手动更新位
13
决定定时器2的手动更新
0=无操作;1=更新TCNTB2&TCMPB2
0
定时器2开关
12
决定定时器2的开与关
0=停止;1=启动定时器2
0
定时器1自动加载开关
11
决定定时器1的自动加载开关
0=一次;1=自动加载
0
定时器1输出逆变器开关
10
决定定时器1的输出逆变器开关
0=逆变器关;1=逆变器开,改变TOUT1
0
定时器1手动更新位
9
决定定时器1的手动更新
0=无操作;1=更新TCNTB1&TCMPB1
0
定时器1开关
8
决定定时器1的开与关
0=停止;1=启动定时器1
0
保留
7:
5
死区使能
4
决定死区操作
0=不使能;1=使能
0
定时器0自动加载开关
3
决定定时器0的自动加载开关
0=一次;1=自动加载
0
定时器0输出逆变器开关
2
决定定时器0的输出逆变器开关
0=逆变器关,输出为TOUT0;
1=逆变器开,输出为nTOUT0
TOUT0是一个PWM输出。
nTOUT0是TOUT0的反相
0
定时器0手动更新位
1
决定定时器0的手动更新
0=无操作;1=更新TCNTB0&TCMPB0
0
定时器0开关
0
决定定时器0的开与关
0=停止;1=启动定时器1
0
注:
手动更新位需要在下一次写时清除
定时器0计数缓冲寄存器&比较缓冲寄存器(TCNTB0/TCMPB0)
寄存器名称
地址
R/W
描述
初始值
TCNTB0
0X5100000C
R/W
定时器0的计数缓冲寄存器
0x0
TCMPB0
0X51000010
R/W
定时器0的比较缓冲寄存器
0x0
TCMPB0
位
描述
初始值
定时器0比较缓冲寄存器
15:
0
设置定时器0的比较缓冲寄存器值
0x0
TCNTB0
位
描述
初始值
定时器0的计数缓冲寄存器
15:
0
设置定时器0的计数缓冲寄存器值
0x0
定时器0计数观测寄存器(TCNTO0)
寄存器名称
地址
R/W
描述
初始值
TCNTO0
0X51000014
R
定时器0的计数值观测寄存器
0X0
TCNTO0
位
描述
初始值
定时器0观测寄存器
15:
0
设置定时器0计数观测值
0x0
定时器1计数缓冲寄存器&比较缓冲寄存器(TCNTB1/TCMPB1)
寄存器名称
地址
R/W
描述
初始值
TCNTB1
0X51000018
R/W
定时器1的计数缓冲寄存器
0x0
TCMPB1
0X5100001C
R/W
定时器1的比较缓冲寄存器
0x0
TCMPB1
位
描述
初始值
定时器1比较缓冲寄存器
15:
0
设置定时器1的比较缓冲寄存器值
0x0
TCNTB1
位
描述
初始值
定时器1的计数缓冲寄存器
15:
0
设置定时器1的计数缓冲寄存器值
0x0
定时器1计数观测寄存器(TCNTO1)
寄存器名称
地址
R/W
描述
初始值
TCNTO1
0X51000020
R
定时器1的计数值观测寄存器
0X0
TCNTO1
位
描述
初始值
定时器1观测寄存器
15:
0
设置定时器1计数观测值
0x0
定时器2计数缓冲寄存器&比较缓冲寄存器(TCNTB2/TCMPB2)
寄存器名称
地址
R/W
描述
初始值
TCNTB2
0X51000024
R/W
定时器2的计数缓冲寄存器
0x0
TCMPB2
0X51000028
R/W
定时器2的比较缓冲寄存器
0x0
TCMPB2
位
描述
初始值
定时器2比较缓冲寄存器
15:
0
设置定时器2的比较缓冲寄存器值
0x0
TCNTB2
位
描述
初始值
定时器2的计数缓冲寄存器
15:
0
设置定时器2的计数缓冲寄存器值
0x0
定时器2计数观测寄存器(TCNTO2)
寄存器名称
地址
R/W
描述
初始值
TCNTO2
0X5100002C
R
定时器2的计数值观测寄存器
0X0
TCNTO2
位
描述
初始值
定时器2观测寄存器
15:
0
设置定时器2计数观测值
0x0
定时器3计数缓冲寄存器&比较缓冲寄存器(TCNTB3/TCMPB3)
寄存器名称
地址
R/W
描述
初始值
TCNTB3
0X51000030
R/W
定时器3的计数缓冲寄存器
0x0
TCMPB3
0X51000034
R/W
定时器3的比较缓冲寄存器
0x0
TCMPB3
位
描述
初始值
定时器3比较缓冲寄存器
15:
0
设置定时器3的比较缓冲寄存器值
0x0
TCNTB3
位
描述
初始值
定时器3的计数缓冲寄存器
15:
0
设置定时器3的计数缓冲寄存器值
0x0
定时器3计数观测寄存器(TCNTO3)
寄存器名称
地址
R/W
描述
初始值
TCNTO3
0X51000038
R
定时器3的计数值观测寄存器
0X0
TCNTO3
位
描述
初始值
定时器3观测寄存器
15:
0
设置定时器3计数观测值
0x0
定时器4计数缓冲寄存器(TCNTB4)
寄存器名称
地址
R/W
描述
初始值
TCNTB4
0X5100003C
R/W
定时器4的计数缓冲寄存器
0x0
TCNTB4
位
描述
初始值
定时器4的计数缓冲寄存器
15:
0
设置定时器4的计数缓冲寄存器值
0x0
定时器4计数观测寄存器(TCNTO4)
寄存器名称
地址
R/W
描述
初始值
TCNTO4
0X51000040
R
定时器4的计数值观测寄存器
0X0
TCNTO4
位
描述
初始值
定时器4观测寄存器
15:
0
设置定时器4计数观测值
0x0
图1、16位PWM定时器模块框图
特性*5个16位定时器;2个8位预定标器和2个4位分割器;
*可编程的占空比;自动再装入模式或一次脉冲模式;死区发生器。
预定标器和分割器
一个8位预定标器和一个4位分割器作用下的输出频率:
4位分割器的设置
最低分解力
(预定标器=0)
最高分解力
(预定标器=255)
最大间隔时间(TCNTBn=65535)
1/2(PCLK=66.5MHz)
0.0300us(33.2500MHz)
7.6992us(129.8828KHz)
0.5045sec
1/4(PCLK=66.5MHz)
0.0601us(16.6250MHz)
15.3984us(64.9414KHz)
1.0091sec
1/8(PCLK=66.5MHz)
0.1203us(8.3125MHz)
30.7968us(32.4707KHz)
2.0182sec
1/16(PCLK=66.5MHz)
0.2406us(4.1562MHz)
61.5936us(16.2353KHz)
4.0365sec
定时器基本操作
手动更新
自动更新
定时器停止
开始位=1定时器开始
状态
命令
图2、定时器运行时序
自动加载和双缓冲模式
脉宽调制定时器有一个双缓冲功能,在这种情况下,改变下次加载值的同时不影响当前定时周期。
因此,尽管设置一个新的定时器值,当前定时器的操作将会继续完成而不受影响。
读出的TCNTBn值并不是当前计数器的值,而是下次重载的计数器值。
当前计数器的值可以通过读定时器计数值观测寄存器(TCNTOn)得到。
只有当自动重载允许(自动加载模式使能)并且TCNTn的值等于0时才会自动重载。
如果TCNTn=0,自动重载禁止(自动加载模式没有使能),.则定时器停止运行
图3、双缓冲功能时序图
用手动更新位和逆变器位对定时器进行初始化
当递减计数器的值到0时,自动加载操作才能进行。
所以,用户必须预先对TCNTn定义一个起始值。
因此,起始值必须由手动更新位载入。
以下步骤描述了怎么起始一个定时器:
将初始值写入到TCNTBn和TCMPBn中;
设置相应定时器的手动更新位。
推荐配置逆变器位开或关(不管逆变器用与否);
设置相应定时器的起始位从而启动一个定时器(同时清除手动更新位)。
如果定时器被迫停止,TCNTn将保留计数器的值且不重载TCNTBn。
如果用户需要设置一个新值,必须执行手动更新。
注:
无论何时TOUT逆变器开关位的值改变,TOUTn的逻辑值将随之改变。
因此,推荐逆变器开关位的配置与手动更新位同时进行。
定时器操作步骤:
以下操作步骤地结果如图4所示。
[1]设置TCNTBn为160,TCMPBn为110。
设置手动更新位并配置逆变器位。
手动更新位设置TCNTn和TCMPn的值与TCNTBn和TCMPBn相同。
然后设置TCNTBn和TCMPBn的值分别为80和40,确定下一个周期的值。
[2]设置手动更新位为0、逆变器关且自动加载开,则设置起始位(启动位)。
则在定时器的延迟时间后定时器开始递减计数。
[3]当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
[4]当TCNTn的值到0时,TOUTn的逻辑电平将发生改变,,产生一个中断并且将TCNTBn的值加载到一个临时寄存器。
在下一个时钟周期,TCNTn由临时寄存器加载到TCNTn中。
[5]在中断服务程序中,TCNTBn和TCMPBn分别设置成80和60;
[6]当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
[7]当TCNTn到0时,TOUTn的逻辑电平将发生改变,TCNTn自动重新加载,并出发一个中断请求;
[8]在中断服务子程序,自动加载和中断请求都被禁止,从而将停止定时器;
[9]当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
[10]当TCNTn的值为0时,TOUTn的逻辑电平将发生改变,TCNTn将不再重新加载新的值,从而定时器停止;
[11]由于中断请求被禁止,不再产生中断请求。
图4、定时器操作示意图
脉宽调制
图5、脉宽调制示意
脉宽调制功能可以通过改变TCMPBn的值实现。
PWM的频率由TCNTBn决定。
图5是一个通过改变TCMPBn的值实现PWM的例子。
如果想得到一个高的PWM值,则要减小TCMPBn的值。
相反,如果想要得到一个低的PWM值,则要增加TCMPBn的值。
如果逆变器使能的话,则情况正好相反。
由于定时器具有双缓冲功能,则在当前周期的任何时间都可以通过ISR和其它程序改变TCMPBn的值。
输出电平控制
逆变器关闭的情况下,减法器启动,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模式操作