S3C44B0XPWM定时器功能及应用第23组SC06011045袁悦SC06011046常俊强SC06011047田军锋内容提要•脉宽调制PWM基本原理•S3C44B0X中PWM定时器的结构及特性•PWM控制的编程应用PWM的基本原理第一部分PWM控制的引入•模拟电压和电流虽然可以对模拟信号进行直接控制,但是由于模拟电路容易随时间漂移,且精密模拟电路的实现很庞大,功耗也很严重•PWM的引入可以有效的解决上边所述的问题什么是PWM?•脉宽调制(PWM)一种是利用微处理器的数字输出对模拟电路进行控制的非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM的基本原理•PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体的模拟信号的电平进行编码。•PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电或者完全有(ON),或者完全无(OFF)。•电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列倍加到模拟负载上去的脉宽调制PWM的优点•从处理器到被控系统信号都是数字式的,无须进行数/模转换。•抗干扰能力强。噪声只有在强到足以将逻辑1改变为逻辑0,或将逻辑0改变为逻辑1时,才能对数字信号产生影响。PWM中的重要参数•占空比占空比是指在一个周期内,接通信号与周期的比值•调制频率周期的倒数•上图显示了三种不同的PWM信号。•一个占空比为10%的PWM输出,即在信号周期中,10%的时间通(高电平),其余90%的时间断。另外两个显示的分别是占空比为50%和70%的PWM输出。这三种PWM输出的编码分别是强度为满度值的10%及50%和70%的3种不同模拟信号值。•例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。10%50%70%•上图显示了一可以使用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模式工作。•定时器0,1,2,3和4具有PWM输出功能。定时器5是一个内部定时器不具有对外输出口线。定时器0具有死区发生器,通常用于大电流设备应用PWM定时器特性•6个16位定时器可以工作在中断模式或DMA模式;•3个8位预分频器和2个5位分割器和1个4位分割器;•输出波形的占空比可编程控制(PWM)•自动加载模式或单触发脉冲模式;•死区产生器;预分频器和分割器•定时器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模式。•通过TCFG0的设置和TCFG1的组合,定时器可获得的输入精度如表所示。基本定时器操作•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计数观察寄存器为只读寄存器。TCMPBnBitDescriptionInitialState定时器比较缓冲区寄存器[15:0]SettingcomparebuffervalueforTimer(0..4)0x00000000TCNTBnBitDescriptionInitialState定时器计数缓冲区寄存器[15:0]SettingcomparebuffervalueforTimer(0..5)0x00000000TCMPBnBitDescriptionInitialState定时器观察寄存器[15:0]SettingcountobservationvalueforTimer0x00000000注:定时器5不具有比较缓冲区寄存器定时器n计数观察寄存器(TCNTOn)自动装载•自动装载操作是当TCNTn为0时,复制TCNTBn到TCNTn中。写到TCNTBn中的值只有在TCNTn为0且自动装载使能的时候装载到TCNTn中。•如果TCNTn为0,自动装载位为0,则TCNTn不再工作。双缓冲•PWM的双缓冲特性可以在不停止当前定时器操作的前提下,为下一次定时器操作改变其预装载值。此时,虽重新设定了定时期的装载值,但当前的定时器的操作仍能完成。•定时器计数值可以写入TCNTBn,而当前计数器的计数值可以通过TCNTOn(定时计数观察寄存器)读取。•如果读取TCNTBn,那么读出的数值不一定是当前定时器的计数值,但肯定是下一个定时周期的计数值。定时器的启动•定时器初始化时,必须使用手动更新位和转换位来装载初值。•定时器的启动步骤1将初始值写入TCNTBn和TCMPBn2设置对应定时器的手动更新位3设置对应定时器的启动位来启动定时器(同时清除手动更新位)•如果定时器被强制关闭,TCNTn就保持计数值而不从TCNTBn重新装载计数值。新的计数值必须被手动更新PWM脉宽调制•PWM特性可通过使用TCMPBn来实现,PWM频率由TCNTBn决定•降低PWM的输出值,需减少TCMPBn的值;获得更高的PWM输出值,需要增加TCMPBn的值。若输出转换器使能,增减是相反的•TCMPBn中的值应小于TCNTBn中的值,当TCNT中的值小于等于TCMP中的值时,输出高电平以下的办法用来保持TOUT为高或低(假设反转器为OFF)•关闭自动载入位。然后TOUTn变为高电平,定时器在TCNTn倒数到0时停止。推荐采用这个模式。•通过将定时器的启动/停止位清0来停止定时器。如果TCNTn=TCMPn,输出电平为高。如果TCNTnTCMPn,输出电平为低。•在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”/*包含文件*/Voidtest_pwm();/*函数*/•//函数名称:Main,功能描述:测试程序主函数•//返回类型:int参数:void•Voidmain()•{•test_pwm();•while(1);•}•/*************************************************•//函数名称:test_pwm•//功能描述:测试pwm,通过蜂鸣器输出脉冲•//返回类型:int•//参数:void•***********************************************/•voidtest_pwm(){•intindex,rate;•unsignedshortdiv;•intfreq;•/*设置定时器的预分频值: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;freq14000;freq+=500){•div=(MCLK/256/4)/freq;•rTCON=0x0;•rTCNTB0=div;•rTCMPB0=(2*div)/3;//设置占空比•rTCON=0xa;/*手工装载定时器