S3C44B0X PWM定时器 功能及应用 第23组 SC06011045 袁 悦 SC06011046 常俊强
内容提要 脉宽调制PWM基本原理 S3C44B0X中PWM定时器的结构及特性 PWM控制的编程应用
第一部分 PWM的基本原理
PWM控制的引入 模拟电压和电流虽然可以对模拟信号进行直接控制,但是由于模拟电路容易随时间漂移,且精密模拟电路的实现很庞大,功耗也很严重
什么是PWM? 脉宽调制(PWM)一种是利用微处理器的数字输出对模拟电路进行控制的非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
PWM的基本原理 PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体的模拟信号的电平进行编码。 PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电或者完全有(ON),或者完全无(OFF)。 电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列倍加到模拟负载上去的
脉宽调制PWM的优点 从处理器到被控系统信号都是数字式的,无须进行数/模转换。 抗干扰能力强。噪声只有在强到足以将逻辑1改变为逻辑0,或将逻辑0改变为逻辑1时,才能对数字信号产生影响。
PWM中的重要参数 占空比 占空比是指在一个周期内,接通信号与周期的比值 调制频率 周期的倒数
例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。 10% 50% 70% 上图显示了三种不同的PWM信号。 一个占空比为10%的PWM输出,即在信号周期中,10%的时间通(高电平),其余90%的时间断。另外两个显示的分别是占空比为50%和70%的PWM输出。这三种PWM输出的编码分别是强度为满度值的10%及50%和70%的3种不同模拟信号值。 例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。
上图显示了一可以使用PWM进行驱动的简单电路。 开关 灯 上图显示了一可以使用PWM进行驱动的简单电路。 图中使用9V电池给一个白炽灯泡供电。如果将连接电池和灯泡的开关闭合50ms,则灯泡在这段时间中将得到9V供电,如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。如果在1s内将此过程重复10次,灯泡将会点亮,并像连接到了一个4.5V电池(9V的50%)上一样。 此时占空比是50%,调制频率为10Hz。
第二部分 S3C44B0X微处理器 PWM定时器
S3C44B0X简介 S3C44B0X是一款低功耗、高集成度的微处理器,为了降低系统总成本和减少外围器件,S3C44B0X芯片中集成了包括片内Cache,外部存储控制器,LCD控制器,4通道DMA,2通道UART,各种总线控制器等等,一个5通道的PW定时器就集成于S3C44B0X中 S3C44B0X整体结构图
PWM定时器概述 PWM定时器具有6个16位定时器,每个定时器可以按照中断模式或DMA模式工作。
PWM定时器特性 6个16 位定时器可以工作在中断模式或 DMA模式; 3个8 位预分频器和2个5位分割器和1个4位分割器; 自动加载模式或单触发脉冲模式; 死区产生器;
预分频器和分割器 定时器0和定时器1分享同一个8位的预分频器定时器2和3分享一个8位预分频器,定时器4和5分享一个8位预分频器。 除了定时器4和5,其它每个定时器还拥有一个具有5个不同的分频信号输出(1/2, 1/4, 1/8, 1/16, 1/32)的时钟分割器。 定时器4和5 则具有4个分频信号输出(1/2, 1/4, 1/8,1/16)的时钟分割器和一个输入信号线 TCLK/EXTCLK。
PWM定时器的输入 每个定时器从时钟分割器的输出得到它们自己的时钟源,时钟分割器则从对应的8位预分频器得到时钟源。 8位预分频器是可编程的,它的频率通过MCLK除以保存在TCFG0和 TCFG1寄存器中除数的结果设定。 8位预分频器和一个独立的4位分割器组合起来可以产生不同的频率定时器时钟源输出。
定时器配置寄存器0(TCFG0) 定时器输入时钟频率 =MCLK/{预分频值+1}/{分割值} 其中预分频值为0~255 分割值为2,4, 8,16,32。 定时器配置寄存器TCFG0主要是配置3个8位预分频器值和死区长度值。
定时器配置寄存器 1(TCFG1) 如TCFG1表所示TCFG1主要是配置6-MUX 和DMA模式。
基本定时器操作 TCNTBn,TCNTn,TCMPBn和TCMPn存在于除定时器5的定时器中。当定时器为0时,TCNTBn和TCMPBn被装载到TCNTn和TCMPn。如果中断使能,则产生中断请求。 TCNTn和TCMPn是内部寄存器, TCNTn可从TCNTOn寄存器中读出。
定时器n计数缓冲区寄存器和比较缓冲区寄存器(TCNTBn,TCMPBn) TCMPBn是16位定时器Timer0~Timer4比较缓冲器寄存器; TCNTBn是16位定时器Timer0~Timer5计数缓冲寄存器; TCNTOn是16位定时器Timer0~Timer5观察寄存器. 在以上的寄存器中,定时器n计数/比较缓冲寄存器可读写寄存器,定时器n计数观察寄存器为只读寄存器。
注:定时器5不具有比较缓冲区寄存器 定时器n计数观察寄存器(TCNTOn) TCMPBn Bit Description Initial State 定时器比较缓冲区寄存器 [15:0] Setting compare buffer value for Timer(0..4) 0x00000000 注:定时器5不具有比较缓冲区寄存器 TCNTBn Bit Description Initial State 定时器计数缓冲区寄存器 [15:0] Setting compare buffer value for Timer(0..5) 0x00000000 定时器n计数观察寄存器(TCNTOn) TCMPBn Bit Description Initial State 定时器观察寄存器 [15:0] Setting count observation value for Timer 0x00000000
自动装载 自动装载操作是当TCNTn为0时,复制TCNTBn到TCNTn中。写到TCNTBn中的值只有在TCNTn为0且自动装载使能的时候装载到TCNTn中。 如果TCNTn为0,自动装载位为0,则TCNTn不再工作。
双缓冲 PWM的双缓冲特性可以在不停止当前定时器操作的前提下,为下一次定时器操作改变其预装载值。此时,虽重新设定了定时期的装载值,但当前的定时器的操作仍能完成。 定时器计数值可以写入TCNTBn,而当前计数器的计数值可以通过TCNTOn(定时计数观察寄存器)读取。 如果读取TCNTBn,那么读出的数值不一定是当前定时器的计数值,但肯定是下一个定时周期的计数值。
定时器的启动 定时器初始化时,必须使用手动更新位和转换位来装载初值。 定时器的启动步骤 1>将初始值写入TCNTBn和TCMPBn 2>设置对应定时器的手动更新位 3>设置对应定时器的启动位来启动定时器(同时清除手动更新位) 如果定时器被强制关闭,TCNTn就保持计数值而不从TCNTBn重新装载计数值。新的计数值必须被手动更新
PWM脉宽调制 PWM特性可通过使用TCMPBn来实现,PWM频率由TCNTBn决定 降低PWM的输出值,需减少TCMPBn的值;获得更高的PWM输出值,需要增加TCMPBn的值。若输出转换器使能,增减是相反的 TCMPBn中的值应小于TCNTBn中的值,当TCNT中的值小于等于TCMP中的值时,输出高电平
输出电平控制 以下的办法用来保持TOUT为高或低(假设反转器为OFF) 关闭自动载入位。然后TOUTn变为高电平,定时器在TCNTn倒数到0时停止。推荐采用这个模式。 通过将定时器的启动/停止位清0来停止定时器。如果TCNTn<=TCMPn,输出电平为高。如果TCNTn>TCMPn,输出电平为低。 在TCMPBn中写入比TCNTBn大的值,这样就禁止TOUTn变高。因为TCMPBn不能与TCNTn有相同的值。 TOUTn可以通过设置寄存器TCON中的反转器的ON/OFF位来反转。
死区发生器 死区发生器用于对大功率设备进行PWM控制。 该特性用于在开关设备的断开和另一个开关设备的闭合之间插入一个时间缺口。这个时间缺口阻止两个开关设备处于同时闭合的状态,即使是非常短的时间。
? TOUT0是一个PWM输出。NTOUT0是TOUT0的一个反转输出。 如果死区能被使能, TOUT0和nTOUT0的输出波形将会是TOUT0_DZ和nTOUT0_DZ。在死区间隔中, TOUT0_DZ和nTOUT0_DZ肯定不会同时闭合的。
DMA请求模式 PWM在任何时间都可以产生一个DMA请求 定时器接收到应答信号AC前,保持DMA请求信号为0,收到ACK时,产生已停止请求信号 6个定时器中同时只能有一个产生DMA请求,通过设置得DMA模式位决定。 若定时器配置位DMA请求方式,则其不能产生中断请求,其他的可以产生中断请求。 DMA模式和DMA请求的配置表
第三部分 PWM应用编程
PWM硬件控制器 许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。 PWM控制器可以选择接通时间和周期: 占空比=接通时间/周期 调制频率=1/周期
具体的PWM控制器在编程细节上会有所不同,但其基本思想通常是相同的。执行PWM操作之前,微处理器要求在软件中完成以下工作: 设置提供调制方波的片上定时器/计数器的周期; 在 PWM控制寄存器中设置接通时间; 设置PWM输出的方向,这个输出是一个通用I/O管脚 启动定时器。 使能PWM控制器
PWM控制蜂鸣器 本实验通过PWM控制器控制器蜂鸣器的发生。系统的蜂鸣器脉冲输入端口连接到S3C44B0X的TOUT0端口,即定时器0的脉冲输出端口。通过修改Rtcntb0和Rtcmpb0来设置输出的频率freq和占空比rate。Rtcntb0用于设置输出频率,Rtcntb0寄存器值div的计算公式如下: div=MCLK/(预分频值+1)/ 时频驱动器取值/freq 其中: 预分频值=0~255,由Rtcfg0设定; 时频驱动器取值=2、4、8、16、32,由Rtcfg1设定。 通过设定Rtcmpb0寄存器调整占空比(rate),该寄存器取值value的计算公式如下: value=div*占空比 其中:占空比<1。
实验参考代码及说明 #include “44b.h” /*包含文件*/ Void test_pwm(); /*函数*/ //函数名称:Main,功能描述:测试程序主函数 //返回类型:int 参 数:void Void main() { test_pwm(); while(1); }
/************************************************* //函数名称:test_pwm //功能描述:测试pwm,通过蜂鸣器输出脉冲 //返回类型:int //参 数:void ***********************************************/ void test_pwm() { int index,rate; unsigned short div; int freq; /*设置定时器的预分频值:TIME0/1=255,TIME2/3=0,TIME4/5=0*/ rTCFG0=0Xff;//参考TCFG0表 /*设置定时器的工作模式;中断模式,设置时频驱动器取值:TIME0为1/4,其他为1/2*/ rTCFG1=0x1;//参考TCFG1表
/*输出脉冲:频率从4000~14000Hz,使用2/3的占空比*/ for( freq=5000;freq<14000;freq+=500) { div = (MCLK/256/4)/freq; rTCON=0x0; rTCNTB0=div; rTCMPB0= (2*div)/3;//设置占空比 rTCON=0xa; /*手工装载定时器的计数值*/ rTCON=0x9; /*启动定时器,并周期触发*/ For( index=0,index<800000;index++);/*延时*/ rTCON=0x0; /*停止定时器*/ }
/*输出脉冲:频率1000Hz,使用1%~95%的占空比*/ div=(MCLK/256/4)/1000; for(rate=1;rate<100;rate+=5){ rTCNTB0=div; rTCMPB0=(rate*div)/100; /*修改占空比*/ rTCON =0xA; /*手工装载定时器的计数值*/ rTCON =0x9; /*启动定时器,并周期触发*/ For( index=0;index<800000;indes++); rTCON=0x0; }}
编程改变输出的频率 rTCFG0=0xFF; /*设置定时器的预分频值;TIME0/1=255,TIME2/3=0,TIME4/5=0*/ /*输出脉冲;频率从4000~14000Hz;使用2/3的占空比*/ for( freq=4000;freq<14000;freq+=1000) { div=(MCLK/256/4)/freq; rTCON=0x0; rTCNTB0=div; rTCMPB0=(2*div)/3; rTCON=0xA; /*手工装载定时器的计数值*/ rTCON=0x9; /*启动定时器*/ For(index=0;index<100000;index++); rTCON=0x0; /*延时并停止定时器*/ }
编程改变输出的占空比 div=(MCLK/256/4)/8000; /*输出频率8000Hz,使用1%~95%的占空比*/ for(rate=1;rate<50;rate+=5) { rTCNTB0=div; rTCMPB0=(rate*div)/50; /*修改占空比*/ rTCON=0xA; /*手工装载定时器的计数值*/ rTCON =0x9; /*启动定时器*/ For (index=0;index<100000;index++); rTCON =0x0; /*延时并关闭定时器*/ For(index=0;index<10000;index++); }
THANK YOU!!!
定时器控制寄存器(TCON) TCON 位 描述 初始值 Timer5自动重载开/关 [26] 这位确定定时器5的自动加载的开/关 0=不自动加载 1=自动加载 Timer5手动更新(注意) [25] 这位确定定时器5的手动更新 0=无操作 1=更新TCNTB5 Timer5启动/停止 [24] 这位确定定时器5的启动/停止 0=停止 1=启动 Timer4自动重载开/关 [23] 这位确定定时器4的自动加载的开/关 Timer4输出反转开/关 [22] 这位确定定时器4输出反转器的开/关 0=不反转 1=反转TOUT4 Timer4手动更新(注意) [21] 这位确定定时器4的手动更新 0=无操作 1=更新TCNTB4,TCMPB4 Timer4启动/停止 [20] 这位确定定时器4的启动/停止
TCON 位 描述 初始值 Timer3自动重载开/关 [19] 这位确定定时器3的自动加载的开/关 0=不自动加载 1=自动加载 Timer3输出反转开/关 [18] 这位确定定时器3输出反转器的开/关 0=不反转 1=反转TOUT3 Timer3手动更新(注意) [17] 这位确定定时器3的手动更新 0=无操作 1=更新TCNTB3,TCMPB3 Timer3启动/停止 [16] 这位确定定时器3的启动/停止 0=停止 1=启动 Timer2自动重载开/关 [15] 这位确定定时器2的自动加载的开/关 Timer2输出反转开/关 [14] 这位确定定时器2输出反转器的开/关 0=不反转 1=反转TOUT2 Timer2手动更新(注意) [13] 这位确定定时器2的手动更新 0=无操作 1=更新TCNTB2,TCMPB2 Timer2启动/停止 [12] 这位确定定时器2的启动/停止
注意:手动更新位都必须在下一次写入时清零 返回程序 返回正文 TCON 位 描述 初始值 Timer1自动重载开/关 [11] 这位确定定时器1的自动加载的开/关 0=不自动加载 1=自动加载 Timer1输出反转开/关 [10] 这位确定定时器1输出反转器的开/关 0=不反转 1=反转TOUT1 Timer1手动更新(注意) [9] 这位确定定时器1的手动更新 0=无操作 1=更新TCNTB1,TCMPB1 Timer1启动/停止 [8] 这位确定定时器1的启动/停止 0=停止 1=启动 死区使能 [4] 这位确定死区使能操作 0=否 1=是 Timer0自动重载开/关 [3] 这位确定定时器0的自动加载的开/关 Timer0输出反转开/关 [2] 这位确定定时器0输出反转器的开/关 0=不反转 1=反转TOUT0 Timer0手动更新(注意) [1] 这位确定定时器0的手动更新 0=无操作 1=更新TCNTB0,TCMPB0 Timer0启动/停止 [0] 这位确定定时器0的启动/停止 注意:手动更新位都必须在下一次写入时清零 返回程序 返回正文
定时器配置寄存器0 返回程序 返回正文 TCFG0 Bit 描述 Initial State 死区长度 [31:24] 这8位确定死区时间长度。死区单元时间长度等于定时器0的单元时间长度。 0x00 预分频器2 [23:16] 该8位确定定时器4、5的预分频器的值。 预分频器1 [15:8] 该8位确定定时器2、3的预分频器的值。 预分频器0 [7:0] 该8位确定定时器0、1的预分频器的值。 返回程序 返回正文
返回程序 返回正文 TCFG1 位 描述 初始值 DMA模式 [27:24] 选择DMA请求通道 0000=不选 0001=Timer0 0010=Timerl 0011=Timer2 000 MUX5 [23:20] 选择定时器5的MUX输入 0000=1/2 0001=1/4 0010=1/8 0011=1/16 01xx=EXTCLK MUX4 [19:16] 选择定时器4的MUX输入 0000=1/2 0001=1/4 0010=1/8 0011=1/16 01xx=TCLK MUX3 [15:12] 选择定时器3的MUX输入 0000=1/2 0001=1/4 0010=1/8 0011=1/16 01xx=1/32 MUX2 [11:8] 选择定时器2的MUX输入 MUX1 [7:4] 选择定时器1的MUX输入 MUX0 [3:0] 选择定时器0的MUX输入 返回程序 返回正文
PWM定时器
返回
定时器配置寄存器 寄存器 名称 地 址 读/写 状态 描述 复位值 TCFG0 0x01D50000 R/W 配置3个8位预分频器 0x0 地 址 读/写 状态 描述 复位值 TCFG0 0x01D50000 R/W 配置3个8位预分频器 0x0 TCFG1 0x01D50004 6-MUX和DMA模式寄存器 返回
TCLK/EXTCLK功能定义 返回 信号名称 含义 状态 说明 外时钟 输入 外部时钟信号的输入端 外时钟控制 当信号OM[3:2]=01b时,为外部时钟源;如果没有使用必须为高电平。 返回
定时器时钟源输出 ? 返回 4-bit分割器设置 最小时间 (prescalar=1) 最大时间 (prescalar=255) 最大间隔时间 (TCNTBn=65535) 1/2(MCLK=66MHz) 0.030μs(33.0MHz) 7.75μs(58.6KHz) 0.50sec 1/4(MCLK=66MHz) 0.060μs(16.5MHz) 15.5μs(58.6KHz) 1.02sec 1/8(MCLK=66MHz) 0.121μs(8.25MHz) 31.0μs(29.3KHz) 2.03sec 1/16(MCLK=66MHz) 0.242μs(4.13MHz) 62.1μs(14.6KHz) 4.07sec 1/32(MCLK=66MHz) 0.485μs(2.06MHz) 125μs (7.32KHz) 8.13sec 返回
DMA模式和DMA请求的配置表 DMA模式 DMA请求 0000 No select 0001 Timer0 0010 Timer1 0011 Timer2 0100 Timer3 0101 Timer4 0110 Timer5 0111 (在TCFG1中配置) 返回