实验五 定时器输入捕捉与输出比较功能实验
一、实验目的:
1.熟练运用嵌入式开发系统环境、C语言及调试方式; 2.理解定时器工作原理;
3.初步掌握定时器输入捕捉与输出比较功能及程序设计方法; 4.进一步熟悉LED数码块显示编程原理及方法。
二、实验要求:
1.仔细阅读本实验指导书。 2.复习有关的定时器章节。
3.熟悉定时器模块的原理及定时器模块输入捕捉及输出比较功能及及编程方法。 4.根据实验内容要求编写好程序,为实验做充分地准备。
三.实验设备及其连接
1.PC机
一台
2.飞思卡尔嵌入式实验开发系统 一台
3.PTD0插孔接一个LED灯,PTE2(定时器1通道0)接一个拨动开关。 4.PTE3(定时器1通道1)接口连接到一个LED灯。
四.实验内容
1.理解并运行输入捕捉样例程序(经PTD0上插孔连接一个LED灯,当接在定时器1通道0上的开关上下拨动时,捕捉通道上的上升沿与下降沿,捕捉到时让LED灯亮一会然后熄灭);
2.理解并运行输出捕捉样例程序(根据接在PTD7、PTD6上的两个拨动开关的状态,在定时器1通道1上分别在比较成功输出拉高、比较成功输出拉低、比较成功时输出翻转三种不同情况下,观察接在通道1PTE3的LED灯的不同状态。注意拨动开关推到上面为1,推到下面为0);
3.在理解上面两个样例程序的基础上,自行设计一个运用定时器1通道1的输出比较功能输出一个频率固定方波,由定时器1的通道0对其进行输入捕捉,并将捕捉到的脉冲数在LED数码块上显示。
五.编程提示
根据功能要求,将定时器模块的相关寄存器列出并确定设定值,因是要对输入的脉冲计数,所以应该设置通道只捕捉上升沿或下降沿,当捕捉到时可用中断方式对脉冲计数加1(也可用查询方式)。当计数达到9999时计数值应复位到0。
LED数码块显示部分可参考前面实验程序,即将脉冲计数值转换成BCD码,送入显示缓冲区,然后调用显示子程序即可。
六.实验报告要求
1.按实验报告格式认真完成实验报告,要求画出工程的总体流程图; 回答下列问题: 2.回答下列问题
(1)通道的输出比较输出的三种形式有什么差别,如果希望用输出比较功能形成一个脉冲输出源,应该选择什么方式,输出的脉冲有什么特点?
(2)本实验是利用输入捕捉功能对通道上输入的脉冲计数,如果要计算输入脉冲的频率要如何进行?如果输入脉冲的周期较长,要注意什么问题?如何解决?
(3)本实验对脉冲计数可用查询方式和中断方式,比较两种方式的不同,你更愿意用什么方式,为什么?
七.参考例程:
输入捕捉参考例程:
Main.C
//总头文件
#include \
//在此添加全局变量定义
//主函数
void main(void) {
//1 关总中断
DisableInterrupts; //禁止总中断
//2 芯片初始化
MCUInit();
//3 模块初始化
BLinit(); //(1) 小灯控制引脚(I/O)初始化 TPM1Ch0Init(); //(2) 定时器1通道0初始化
//4 开放中断
TPM1C0SC|=TPM1C0SC_CH0IE_MASK; //(1) 允许定时器1通道0的输入捕捉中断
EnableInterrupts; //(2) 开放总中断
//5 主循环 while (1) { } }
Blinit.c
#include \
void BLinit(void){ PTDD=0xff;
PTDDD=0b00000001; }
TPM.c
#include \
//-------------------------------------------------------------------------*
//函数名: TPM1Ch0Init //功 能: 初始化定时器通道 //参 数: //返 回: 无 //说 明: 无 //-------------------------------------------------------------------------* void TPM1Ch0Init() {
//设置定时器状态和控制寄存器
//分频因子64,设置为系统时钟,禁止溢出中断,清溢出标志 TPM1SC=0b00001110;
//设置定时器通道状态和控制寄存器
//选择输入捕捉方式,捕捉上升沿,允许通道中断 TPM1C0SC=0b01001000; }
Isc.c
#include \
interrupt 5 void T1Ch0In(void) { uint8 temp ; DisableInterrupts; //禁止总中断
PTDD&=~PTDD_PTDD0_MASK ; //接在PTD0上的LED亮 delay(100); //延时 PTDD|=PTDD_PTDD0_MASK ; //接在PTD0上的LED暗 //清除输入捕捉标志位 temp = TPM1C0SC; //(1)读该寄存器 TPM1C0SC&= ~TPM1C0SC_CH0F_MASK; //(2)向输入捕捉标志位写0 EnableInterrupts; //开放总中断 }
General.c
* * * * *
#include \ //包含通用函数头文件
//-------------------------------------------------------------------------*
// 函数名: Delay() * // 功 能: 延时 * // 参 数: count(小于65535) * // 返 回: 无 * //-------------------------------------------------------------------------* void delay(uint16 count) { uint16 i,j; for(j=0; j 输出比较参考例程: Main.c //总头文件 #include \ //在此添加全局变量定义 //主函数 void main(void) { //1 关总中断 DisableInterrupts; //禁止总中断 //2 芯片初始化 MCUInit(); //3 模块初始化 TPM1Init(); // 定时器1中模块初始化 PD_Init(); //4 开放中断 EnableInterrupts; //(2) 开放总中断 //5 主循环 while (1) { uint8 i; i=PTDD&0b11000000; i>>=6; TPM1outCInit(1,i); delay(200); } } TPM.c #include \ //-------------------------------------------------------------------------* //函数名: TPM1Ch0Init * //功 能: 初始化定时器通道 * //参 数: * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void TPM1Ch0Init() { //设置定时器状态和控制寄存器 //分频因子64,设置为系统时钟,禁止溢出中断,清溢出标志 TPM1SC=0b00001110; //设置定时器通道状态和控制寄存器 //选择输入捕捉方式,捕捉上升沿,允许通道中断 TPM1C0SC=0b01001000; } void TPM1Init(){ TPM1SC=0b00001111; TPM1MODH=0x7f; TPM1MODL=0xff; } void TPM1outCInit(uint8 CHo,uint8 Edge) { //设置定时器状态和控制寄存器 //分频因子64,设置为系统时钟,禁止溢出中断,清溢出标志 uint8 TPM1Cn=0b00010000; if (Edge>3) Edge=3; Edge<<=2; switch(CHo){ case 0: TPM1C0VH=0x3f;TPM1C0VL=0xff;TPM1C0SC=TPM1Cn|Edge;break; case 1: TPM1C1VH=0x3f;TPM1C1VL=0xff;TPM1C1SC=TPM1Cn|Edge;break; case 2: TPM1C2VH=0x3f;TPM1C2VL=0xff;TPM1C2SC=TPM1Cn|Edge;break; case 3: TPM1C3VH=0x3f;TPM1C3VL=0xff;TPM1C3SC=TPM1Cn|Edge;break; case 4: TPM1C4VH=0x3f;TPM1C4VL=0xff;TPM1C4SC=TPM1Cn|Edge;break; case 5: TPM1C5VH=0x3f;TPM1C5VL=0xff;TPM1C5SC=TPM1Cn|Edge;break; } } PD_Init.c //PTD7,PTD6设置为输入,有上拉电阻 #include \ void PD_Init(){ PTDD=0b11111111; PTDPE=0b11000000; PTDDD=0b00111111; }