嵌入式 PWM实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.5 PWM 实验
5.5.1 实验目的
1. 了解PWM的基本原理;
2. 掌握PWM控制的编程方法。

5.5.2 实验内容
1. 编写程序对PWM控制器输出8000Hz 2/3占空比的数字信号控制蜂鸣器;
2. 编写程序改变PWM控制器输出频率;
3. 编写程序改变PWM控制器输出占空比;
5.5.3 预备知识
1. 了解ADT IDE集成开发环境的基本功能;
2. 了解PWM的基本原理以及用途。

5.5.4 实验设备
1. 硬件:JX44B0教学实验箱、PC机;
2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。

5.5.5 基础知识
1. 脉宽调制的基本原理
模拟电压和电流可直接用来进行控制,如对汽车收音机音量进行控制。

尽管模拟控制看起来直观而简单,但它并不总是非常经济或可行的。

其中一点就是,模拟电路容易随时间漂移,因而难以调节。

能够解决这个问题的精密模拟电路可能非常庞大、笨重和昂贵。

模拟电路有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。

模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。

脉宽调制(PWM)就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

PWM的一个优点是从处理器到被控系统信号都是数字式的,无需进行数模转换。

让信号保持为数字形式可将噪声影响降到最小。

噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,才能对数字信号产生影响。

PWM是一种对模拟信号电平进行数字编码的方法。

通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。

电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。

通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。

只要带宽足够,任何模拟值都可以使用PWM进行编码。

图5-10显示了三种不同的PWM信号。

一个占空比为10%的PWM输出,即在信号周期中,10%的时间通,其余90%的时间断。

另外两个显示的分别是占空比为50%和70%的PWM输出。

这三种PWM输出编码的分别是强度为满度值的10%、50%和70%的三种不同模拟信号值。

例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。

图5-10还画出了一个可以使用PWM进行驱动的简单电路。

图中使用9V电池来给一个白炽灯泡供电。

如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。

如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。

如果在1秒钟内将此过程重复10次,灯泡将会点亮并像连接到了一个4.5V电池(9V的50%)上一样。

这种情况下,占空比为50%,调制频率为10Hz。

图5-10 PWM驱动的简单电路
大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。

设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。

占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。

要让灯泡取得4.5V电压的供电效果,通断循环周期与负载对开关状态变化的响应时间相比必须足够短。

要想取得调光灯(保持点亮)的效果,必须提高调制频率。

在其他PWM应用场合也有同样的要求。

通常调制频率为1kHz到200kHz之间。

2. PWM硬件控制器
许多微控制器内部都包含PWM控制器。

一般都可以选择接通时间和周期。

占空比是接通时间与周期之比;调制频率为周期的倒数。

具体的PWM控制器在编程细节上会有所不同,但它们的基本思想通常是相同的。

执行PWM操作之前,微处理器要求在软件中完成以下工作:1)设置提供调制方波的片上定时器/计数器的周期;
2)在PWM控制寄存器中设置接通时间;
3)启动定时器。

3. S3C44B0X的PWM控制器
S3C44B0X处理器有6个16位定时器,其中定时器0/1/2/3有PWM脉冲输出功能。

图5-11 S3C44B0X定时器
上图是S3C44B0X定时器结构框图,定时器0和定时器1使用相同的分频器,但他们的计数器以及控制器是各自独立的,定时器2/3、定时器4/5情况相同,各定时器的精度见下表:
表5-12 定时器精度
另外S3C44B0X的定时器还有一个特殊的功能:双缓冲功能,使用该功能可以在不停止本次操作的情况下改变下一个周期值,比如当前的周期为1秒,在运行的过程中,我们可以更改周期
值,而不会影响当前的这个周期,新的周期值直到本次定时结束后才被更新到寄存器中。

4. S3C44B0X定时器有关的寄存器
1) PWM定时器配置寄存器
用于设置定时器的分频值以及工作模式。

表5-13 定时器配置寄存器
2) PWM定时器初值计数器以及比较计数器
表5-14 PWM定时器初值计数器以及比较计数器
3) PWM定时器控制寄存器
表5-15 PWM定时器控制寄存器
5. 实验参考代码及说明
/* 包含文件 */
#include "44b.h"
/* functins */
void test_pwm();
/***************************************************************************** // Function name : Main
// Description : 测试程序主函数
// Return type : int
// Argument : void
*****************************************************************************/ void Main()
{
test_pwm();
while(1);
}
/*****************************************************************************
// Function name : test_pwm
// Description : 测试PWM,通过蜂鸣器输出脉冲
// Return type : int
// Argument : void
*****************************************************************************/
void test_pwm()
{
int index, rate ;
unsigned short div;
int freq;
/* 设置定时器的预分频率值:TIME0/1=255, TIME2/3=0, TIME4/5=0 */ rTCFG0=0xFF;
/* 设置定时器的工作模式:中断模式,设置分频率值:TIME0为1/4,其他为1/2 */
rTCFG1=0x1;
/* 输出脉冲:频率从4000HZ到14000HZ, 使用2/3的占空比*/ for ( freq = 500; 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/100 - 95/100的占空比*/ 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; index++);
rTCON=0x0;
}
}
1) PWM控制蜂鸣器
本实验通过PWM控制器控制蜂鸣器的发声,JX44B0教学实验系统的蜂鸣器脉冲输入端口连接到S3C44B0X的TOUT0端口,即定时器0的脉冲输出端口。

通过修改rTCNTB0和rTCMPB0设置输出的频率和占空比。

rTCNTB0用于设置输出频率,其值的计算公式如下:
div = MCLK / {prescaler value + 1} / {divider value}/freq
{prescaler value} = 0-255 由rTCFG0设定
{divider value} = 2, 4, 8, 16, 32 由rTCFG1设定
通过设置rTCMPB0寄存器调整占空比(rate),公式如下:
value = div * rate /*{rate} < 1*/
2) 编程改变输出的频率
rTCFG0=0xFF; /* 设置定时器的预分频率值:TIME0/1=255, TIME2/3=0, TIME4/5=0 */
rTCFG1=0x1; /* 设置定时器的工作模式:中断模式*/
/* 设置定时器的分频率值:TIME0为1/4,其他为1/2*/
/* 输出脉冲:频率从4000HZ到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; /* 延时并停止定时器 */
}
3) 编程改变输出的占空比
div = (MCLK/256/4)/8000;/* 输出频率8000HZ, 使用1/100 - 95/100的占空比 */
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++);
}
5.5.6 实验步骤
1. 参照模板工程pwm(modules\pwm\pwm.apj),新建一个工程pwm,添加相应的文件,并修改pwm的工程设置;创建pwm.c并加入到工程pwm中;
2. 编写程序对PWM控制器输出8000Hz 2/3占空比的数字信号输出到蜂鸣器;
3. 编译pwm,下载程序并运行,检查蜂鸣器的发声情况;
4. 编写程序改变PWM控制器输出频率,重新编译、下载并运行,听蜂鸣器输出效果;
5. 编写程序改变PWM控制器输出占空比,重新编译、下载并运行,听蜂鸣器输出效果。

5.5.7 实验报告要求
1. 简述PWM的原理和应用;
2. 记录实验结果,描述S3C44B0X PWM模块的使用方法。

相关文档
最新文档