我是靠谱客的博主 虚幻信封,最近开发中收集的这篇文章主要介绍合泰杯 | 合泰单片机入门 定时器详解(三),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

说在前面:

好久没有更新是因为一直在忙,想必关注这个系列博文的都是参加合泰公司比赛的小伙伴,后台有好些小伙伴给我私我什么时候更新,这里先道个歉,不好意思久等了。人啊,知道的越多就越迷茫,所以做一个“无知“”的人是多么的快乐啊!!!好的言归正传,我们今天要说的就是合泰单片机的定时器功能。

 

一、定时器模块 – TM介绍分类

控制和测量时间在任何单片机中都是一个很重要的部分。该系列单片机(注:本文都是基于HT66F2390型号(下同都称“该系列单片机”))提供几个定时器模块 ( 简称 TM ),来实现和时间有关的功能。定时器模块是包括多种操作的定时单元,提供的操作有:定时 / 事件计数器,捕捉输入,比较匹配输出,单脉冲输出以及PWM 输出等功能。每个定时器模块有两个独立中断。每个TM 外加的输入输出引脚,扩大了定时器的灵活性,便于用户使用。其中,该系列单片机包含了七个 TM 且每个 TM 可分为特定类型,即标准型 TM 或周期型 TM。虽然性质相似,但不同 TM 特性复杂度不同。这里先介绍标准型和周期型 TM 的共性,x更多详细资料分别见后面两点。两种类型 TM 的特性和区别如下表。

1.1、TM 操作
不同类型的 TM 提供从简单的定时操作到 PWM 信号产生等多种功能。理解TM 操作的关键是比较 TM 内独立运行的计数器的值与内部比较器的预置值。当计数器的值与比较器的预置值相同时,则比较匹配, TM 中断信号产生,清零计数器并改变 TM 输出引脚的状态。用户选择内部时钟或外部引脚来驱动内部 TM 计数器。
1.2、TM 时钟源
驱动 TM 计数器的时钟源很多。通过设置 xTMn 控制寄存器的 xTnCK2~xTnCK0位,选择所需的时钟源。其中“x”代表“S”或“P”型 TM,“n”代表指定TM 的序列号。该时钟源来自系统时钟 fSYS 或内部高速时钟 fH 或 fSUB 时钟源或外部 xTCKn 引脚。 xTCKn 引脚时钟源用于允许外部信号作为 TM 时钟源或用于事件计数。
1.3、TM 中断
标准型和周期型 TM 都有两个内部中断,分别是内部比较器 A 或比较器 P,当比较匹配发生时产生 TM 中断。当 TM 中断产生时,计数器清零并改变 TM 输出引脚的状态。
1.4、TM 外部引脚(重点理解)
无论哪种类型的 TM,都有两个 TM 输入引脚,分别为 xTCKn 和 xTPnI。  TM输入引脚 xTCKn 作为 TM 时钟源输入脚,通过设置 xTMnC0 寄存器中的xTnCK2~xTnCK0 位进行选择,外部时钟源可通过该引脚来驱动内部 TM。xTCKn 输入引脚可以选择上升沿或下降沿有效。 STCKn 和 PTCKn 引脚还可分别用作 STMn 和 PTMn 单脉冲输出模式的外部触发输入引脚。另一种 xTM 输入引脚 STPnI 或 PTPnI 作为捕捉输入脚,其有效边沿有上升沿、下 降 沿 和 双 沿, 可 分 别 通 过 设 置 STMnC1和PTMnC1 寄 存 器 中 的STnIO1~STnIO0 和 PTnIO1~PTnIO0 位来选择有效边沿类型。除 PTPnI 引脚外,PTCKn 也可用作 PTMn 捕捉输入模式的外部触发输入引脚。每个 TM 各有一个输出引脚, xTPn。 TM 输出引脚可通过相应的引脚共用功能选择位选择,详细内容在引脚共用功能章节有所描述。当 TM 工作在比较匹配输出模式且比较匹配发生时,这些引脚会由 TM 控制切换到高电平或低电平或翻转。外部 xTPn 输出引脚也被 TM 用来产生 PWM 输出波形。当 TM 输出引脚与其它功能共用时, TM 输出功能需要通过寄存器先被设置。如下图:

1.5、编程注意事项

TM 计数寄存器和捕捉 / 比较寄存器 CCRA、 CCRP 寄存器,含有低字节和高字节结构。高字节可直接访问,低字节则仅能通过一个内部 8-bit 的缓存器进行访问。值得注意的是 8-bit 缓存器的存取数据及相关低字节的读写操作仅在其相应的高字节读取操作执行时发生。
读写流程如下步骤所示:
● 写数据至 CCRA 或 CCRP
♦ 步骤 1. 写数据至低字节寄存器 xTMnAL 或 PTMnRPL
– 注意,此时数据仅写入 8-bit 缓存器。
♦ 步骤 2. 写数据至高字节寄存器 xTMnAH 或 PTMnRPH
– 注意,此时数据直接写入高字节寄存器,同时锁存在 8-bit 缓存器中的数据写
入低字节寄存器。
● 从计数器寄存器和 CCRA 或 CCRP 中读取数据
♦ 步骤 1. 由高字节寄存器 xTMnDH、 xTMnAH 或 PTMnRPH 读取数据
– 注意,此时高字节寄存器中的数据直接读取,同时由低字节寄存器读取的数
据锁存至 8-bit 缓存器中。
♦ 步骤 2. 由低字节寄存器 xTMnDL、 xTMnAL 或 PTMnRPL 读取数据
– 注意,此时读取 8-bit 缓存器中的数据。
 

二、标准型 TM – STM 和 周期型 TM – PTM

因为两者的功能都差别不大,主要就是功能的引脚配置实现差别。其中,标准型 TM 和周期型 TM 都包括 5 种工作模式,即比较匹配输出,定时 / 事件计数器,捕捉输入,单脉冲输出  PWM 输出模式

标准型 TM 由两个外部输入脚控制并驱动一个外部输出脚。周期型 TM 由两个外部输入脚控制并驱动两个外部输出脚。
结合下面图形更好理解而且这区别:

说了很多理论,如果你认真看到这里,说明已经理解什么是定时器和定时器的使用方法了,下面我将通过一个实例来更加实际的编写代码让你理解定时器的应用。上面说了二者功能相差不大,所以我以周期性 PT--PTM 为例子,标准型的编写同理。

 

2.1、实例:掌握 PTM / STM PWM 控制输出模式

实验目的:利用脉波宽度调变(Pulse Width Modulation;PWM)的技巧,让直流马达呈现不同的转速,通过按键灵活设置直流马达的按键 1、加速;2、减速;3、转向功能。定时器选用PTM3。

编程技巧:正确编写模式配置

要实现 PTM3 工作 PWM 模式:

2.1.1、我们需要配置 PTM3C1 寄存器中的 PT3M1 和 PT3M0 位需要设置为“10”

2.1.2、详细的配置我们看他通过官网的芯片手册得知如下图:

 

● 16-bit PTMn, PWM 输出模式

CCRP1~655350
Period1~6553565536
DutyCCRA


注:若 fSYS=16MHz, TM 时钟源选择 fSYS/4, CCRP = 512 且 CCRA=128,
PTMn PWM 输出频率 =(fSYS/4)/512=fSYS/2048=8kHz, duty=128/512=25%,
若由 CCRA 寄存器定义的 Duty 值等于或大于 Period 值, PWM 输出占空比为100%。

2.1.3、代码块

//功能:通过定时器控制PWM 按键控制电机的正反转

#include "HT66F2390.h"

typedef	unsigned char	u8;
typedef	char			s8;
typedef	unsigned short	u16;
typedef	short			s16;
typedef	unsigned long	u32;
typedef	long		

#define	SEGPort			_pg
#define	SEGPortC		_pg

#define	SW_SpeedUp		_pc0	
#define	SW_SpeedUpC		_pcc0
#define	SW_SpeedUpPU	_pcpu0	
		
#define	SW_SpeedDown	_pc1	
#define	SW_SpeedDownC	_pcc1
#define	SW_SpeedDownPU	_pcpu1	
		
#define	SW_Direction	_pc2	
#define	SW_DirectionC	_pcc2
#define	SW_DirectionPU	_pcpu2	

const u8 SEG_TAB[] = {0x3F,0x06,0x5B,0x4F,0x66,		//共阴
			 		  0x6D,0x7D,0x07,0x7F,0x67};
const u16 PWM_TAB[] = {0,512,1024,1536,2048,		//PWM常数建表值
			 		   2560,3072,3584,4096,4608};
void Delayms(u16);	
									 
void main()
{	u16 Index=0;								
	_wdtc=0b10101111;								//关狗
	
	SEGPort=0; SEGPortC=0; 							//输出属性且为0
	SW_SpeedUpC=1; SW_SpeedUpPU=1;			   		
	SW_SpeedDownC=1; SW_SpeedDownPU=1;		   	
	SW_DirectionC=1; SW_DirectionPU=1;
			   	
	_pb2=0; _pbc2=0; 
	_pd4=0; _pdc4=0;
					
	_pbs0=0x30; _pds1=0x00;							//PB2为PTP3功能、PD4为I/O功能
	_ptm3rpl=(u8)4608;                               //PWM 周期=4608/fINT
	_ptm3rph= 4608>>8;
	
/*************************************************************************
*_ptm3c0 = 0b00111000:
*PT3PAU=0 (继续计数);
*PT3CKS[2:0]=011 (fINT=fSYS/64=8MHz/64);
*PT3ON=1 (PTM3 On) 。
*_ptm3c1 = 0b10101000:
*PT3M[1:0]=10 (选择PWM输出或单脉冲输出模式);
*PT3IO[1:0]=10 (选择PWM 输出) ;
*PT3OC=1 (有效电平为高电平;Active High) ;
*PT3POL=0 (直接输出) ;
*当工作在PWM 输出模式下,PT3CAPTS、PT3CCLR位未使用。
*
***************************************************************************/					                   
	_ptm3c0=0b00111000;								//fINT=fSYS(8MHz)/64(8us),起始PTM3计数
	_ptm3c1=0b10101000;								//PWM 模式, 高电平有效

	while(1)
	{	
		SEGPort= ~SEG_TAB[Index];
		if(_pds1==0x02) 
		{
			SEGPort|=1<<7;			        	//反转时显示 dp 时段
		}
		_ptm3al=(u8)PWM_TAB[Index]; 				//取得占空比的参数
		_ptm3ah=PWM_TAB[Index]>>8;
		Delayms(250);
		
/*********************************************************************************************
*
*当IN2=0(PD4为输出属性且输出0)、IN1为PWM3由PTP3(PB2)输出的PWM信号,此时可控制马达正转的转速;
*当IN1=0(PB2为输出属性且输出0)、IN2为PWM3由PTP3(PD4)输出的PWM信号,此时可控制马达反转的转速;
*_pbs0 =0x30、_pds1 =0x00:设定PB2为PTP3功能、PD4为I/O;即上述的(a)项;
*_pbs0 =0x00、_pds1 =0x02:设定PD4为PTP3功能、PB2为I/O;即上述的(b)项;
*
***********************************************************************************************/		
										
		while(1)
		{	
			if(!SW_SpeedUp)
			{	
				if(++Index > 9) 
				Index=9;				//若按下加速键,增加(上限9) 
				break;   	
			}
			
			else if(!SW_SpeedDown) 					//若按下减速键,减小(下限0) 
			{	
				if(--Index < 0) 
				Index=0;
				break;   	
			}
			
			else if(!SW_Direction)
			{	
				if(_pds1==0)						//是否为正转?
				{
					_pbs0=0x00;
					_pds1=0x02;			//PB2为I/O功能、PD4为PTP3功能
				}
				
				else								//否
				{	
					_pbs0=0x30; 
					_pds1=0x00;			//PB2为PTP3功能、PD4为I/O功能
				}
				break;
			}
		}
	}
}
void Delayms(u16 del)
{	
	u16 i;											
	for(i=0;i<del;i++)
	GCC_DELAY(2000);
}


2.1.4、显现实现结果:(博文不能上传视频所以就拍了一张照片)

 

这篇 写的有点长了,不知道各位小伙伴们看懂没有,这可是花费2个小时写出来的文章,希望对正在学合泰单片机的同学有所帮助。如果不懂得可以私我联系方式在文末

=======================(更新中····)=====================

 

                                               一起共同成长,记录生活记录你!

 



 

最后

以上就是虚幻信封为你收集整理的合泰杯 | 合泰单片机入门 定时器详解(三)的全部内容,希望文章能够帮你解决合泰杯 | 合泰单片机入门 定时器详解(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部