第4节 16bit PPG 定时器
推荐给好友
打印
加入收藏
更新于2008-08-24 09:27:28

16 位PPG 定时器可以进行单步或者持续PWM 方波的输出,周期和占空比同样可以分别进行16 位设置。故周期和占空比最大值为65534。
PPG 的占空比和周期可以在运行自行调整。


7.4.1 16bit PPG 定时器原理及应用

16 位PPG 定时器主要通过向下计数器进行减计数,当计数器的值与设置的占空比之乡同时,即改变方波的高低电平,从而达到输出PWM 的目的。具体原理如图7-5 所示

16 位PPG 定时器可以有多种中断触发条件:外部触发或减计数借位;正极性中上升沿被扫描到,负极性下降沿被扫描到。具体的中断如表7-4 所示


7.4.2 16bit PPG 定时器寄存器配置及I/O 端口选择

16 位PPG 定时器端口引脚:

16 位PPG 定时器的对应寄存器:16 位PPG 向下计数器寄存器(PDCRH0/PDCRL0), 16 位PPG 周期设置缓冲寄存器(PCSRH0/PCSRL0),16 位PPG 占空比设置缓冲寄存器(PDUTH0/PDUTL0),16 位PPG 状态控制寄存器(PCNTH0/PCNTL0)。
16 位PPG 向下计数器寄存器(PDCRH0/PDCRL0):存储当前16 位PPG 向下计数器值。
16 位PPG 周期设置缓冲寄存器(PCSRH0/PCSRL0):设置16 位PPG 向下计数器周期。16 位PPG 占空比设置缓冲寄存器(PDUTH0/PDUTL0):设置16 位PPG 向下计数器占空比值。16 位PPG 状态控制寄存器PCNTH0 包括了计数器使能位,软件触发使能位,软件触发标志位,工作模式选择位,工作时钟选择位,输出使能位。16 位PPG 状态控制寄存器PCNTL0 包括了输出取反位,PPG 专用端口输出使能位,终端模式选择位,中断标志位,中断请求使能位,硬件触发使能位0/1。


7.4.3 16bit PPG 定时器应用设计范例

前面介绍过16 位PPG 定时器可以在运行中改变周期和占空比值并运行,该节通过下面的样例详细说明其使用。
#include "mb95100.h"
#define SEG_A 0x01
#define SEG_B 0x02
#define SEG_C 0x04
#define SEG_D 0x08
#define SEG_E 0x10
#define SEG_F 0x20
#define SEG_G 0x40
#define SEG_DP 0x80
#define SEG_0 SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F
#define SEG_1 SEG_B | SEG_C
#define SEG_2 SEG_A | SEG_B | SEG_D | SEG_E | SEG_G
#define SEG_3 SEG_A | SEG_B | SEG_C | SEG_D | SEG_G
#define SEG_4 SEG_B | SEG_C | SEG_F | SEG_G
#define SEG_5 SEG_A | SEG_C | SEG_D | SEG_F | SEG_G
#define SEG_6 SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G
#define SEG_7 SEG_A | SEG_B | SEG_C
#define SEG_8 SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G
#define SEG_9 SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G
const unsigned char seg_display[12] = { SEG_0, SEG_1, SEG_2, SEG_3, SEG_4, SEG_5, SEG_6, SEG_7, SEG_8, SEG_9, 0xff, 0x00 };
/*****************************************************************************/
/*主程序部分*/
/*****************************************************************************/
void main(void)
{
const int DELAY = 100; // 延迟时间
// variables
unsigned int pwm_value; // 设置的可变PWM 占空比值
int delay; // 计数延时,以方便在示波器上观测波形变化
int direction; // 表示占空比输出的各阶段的信号

unsigned int pwm_see;
// 初始化 I/O 端口

PDR0 = 0xff; // Port 0:
DDR0 = 0xff; // 7 段显示

PDR1 = 0x00; // Port 1:
DDR1 = 0xff;

PDR2 = 0x00; // Port 2: DDR2 = 0xff;
PDR3 = 0x00; // Port 3: AIDRL = 0xff; DDR3 = 0xff;
PDR4 = 0x00; // Port 4: AIDRH = 0xff; DDR4 = 0xff;
PDR5 = 0x00; // Port 5: DDR5 = 0xff;
PDR6 = 0xff; // Port 6: DDR6 = 0xff;
PDR7 = 0x00; // Port 7: DDR7 = 0xff;
PDR8 = 0x00; // Port 8: DDR8 = 0xff;
PDRE = 0x00; // Port E: DDRE = 0xfc; // PE0=INT10, PE1=INT11 键位输入;
// 设置中断
InitIrqLevels(); // 初始化中断寄存器和 IRQ 向量表
__EI(); // 全局中断使能
__set_il(3);
// 初始化PPG 定时器
PCSR0 = 0xFFFF; // 设置周期(duration of high and low phase!)
pwm_value = 10; // 设定 PPG 占空比初始值
PDUT0 = 10;
PCNTH0_CNTE = 0; // 停止 PPG timer
PCNTH0_MDSE = 0; // 选择PWM
PCNTH0_RTRG = 0; // 禁止触发
PCNTH0_CKS = 0; // 选择时钟模式(0: MCLK/1)
 

// PWM 周期= 65536 x 0.1us = 152.58Hz @ 10MHz 主时钟状态下
PCNTH0_PGMS = 0; // 禁止 PPG 输出
PCNTL0_EGS1 = 0; // 禁止触发扫描TRG
PCNTL0_EGS0 = 0;
PCNTL0_IREN = 0; // 禁止终端请求
PCNTL0_POEN = 1; // 使能PPG 输出
PCNTL0_OSEL = 0; // 正常输出模式
PCNTH0_CNTE = 1; // 使能 PPG timer, 等待触发开始
PCNTH0_STGR = 1; // 开始PPG timer
direction = 1;

while(1) // " 主循环"
{

for (delay = 0; delay < DELAY; delay++)
{
asm("\tnop");
}//for()
if (direction == 1) // 增加PWM 占空比值阶段
{
if (pwm_value <= 30000)
{ pwm_value = pwm_value + 10; // 增加PWM 占空比值,但实际看见的输出波形不变
pwm_see = 30000;
PDR0 = seg_display[0];
}
else if ( pwm_value < 65530)
{
pwm_value = pwm_value + 10; // 增加PWM 占空值,波形随占空值增加而改变
PDR0 = seg_display[1];
pwm_see = pwm_see + 10;
}
else
{

direction = 0;
}

//if(direction = 1) } if (direction == 0) // 减少PWM 占空值比阶段
{
if (pwm_value > 30000)
{ PDR0 = seg_display[2];
pwm_value = pwm_value - 10; // 减少PWM 占空值,波形不变
pwm_see = 65530;

}
else if ( pwm_value > 0)
{
PDR0 = seg_display[3];

pwm_value = pwm_value -10; // 减少PWM 占空值,波形随变化而改变
pwm_see = pwm_value - 10;
}
else
{

direction = 1; // set to upcounting direction (upcounting)
}
}//if(direction = 0)

PDUT0 = pwm_see; // 将各阶段PWM 占空比的值导入进寄存器中
}//while(1)
}//main

 

上一节                    下一节





 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.