合泰杯(HT66F2390)通过PWM呼吸灯实验,了解定时器基础知识(手把手看手册)

前言:
 

本文将由一个实验,引出时钟和定时器的介绍和使用。
并分享下查手册(HT66F2390)的小思路:功能索引。

 


时钟和定时器/计数器的作用:


时钟和定时器/计数器是单片机的重要部件和核心部件之一,


我们都知道,单片机的工作离不开时钟,
按照相同或者不同的时钟频率,各个外设和硬件部分才知道在何时应该处于何种状态。
定时器/计数器充当闹钟的功能,由机器周期外部输入为信号进行计数,


1.当信号由机器周期提供的时候,由于可以由频率计算出时间,所以称为定时器。
2.当信号由外部事件提供的时候,可以知道某个操作/行为发生了多少次,所以称为计数器。
 


实验部分:

实验代码:
 

#include "HT66F2390.h" 

const int Period = 4000;           // 定义PWM周期 (数值越大,呼吸越慢)

void Set_PWM(unsigned long Duty);  //占空比设置函数

void delay(unsigned long count);   //延时

void PWM_Init(void);

void main()
{
	_wdtc=0b10101011;              //关闭看门狗
	int i;
	PWM_Init();         //PWM初始化
	while(1)
	{	
		for(i=0;i<Period;i++) // 渐亮
		{
			delay(10);
			Set_PWM(i);			//占空比逐渐变大
		}
		for(i=Period;i>0;i--) //渐暗
		{
			delay(10);           //占空比逐渐变小
			Set_PWM(i);  
		}			
	}
}

void delay(unsigned long count)  //延时count*10us
{
    volatile unsigned long i;
    for(i=0;i<count;i++)
        asm("nop");
}

void Set_PWM(unsigned long Duty) //占空比设置
{
   	_ptm3ah =Duty/256;      
   	_ptm3al =Duty%256;
}

void PWM_Init(void) //PWM 初始化 配置
{
	_ptm3c0=0b00001000;	   // 时钟选择
    _ptm3c1=0b10101000;    //选择为PWM输出且高有效
    
    _ptm3rph=Period/256;    //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
    _ptm3rpl=Period%256;
    //输出引脚选择
    _pbs0=0b00110000;       //PTP3输出,引脚接的是PB2
    
    _emi=1;                //开启总中断
}

接线图:


效果演示:
 

HT66F2390 PWM 呼吸灯演示视频


流程解析:

PWM配置通用流程:

1.时钟选择
2.模式配置:寄存器定位,按位选择
3.PWM输出频率和占空比设置:寄存器定位
4.引脚输出:引脚的定位

PWM的原理就是面积等效,两大要素就是占空比和频率
以呼吸灯为例:
占空比越高,输出电压越大(越亮),输出频率越高,越趋近于常亮
占空比越低,输出电压越低(越暗),输出频率越低,越容易看到亮暗交替闪烁


1.时钟选择和模式配置

注意点:用什么就查什么!(查手册)

PWM离不开定时器模块

首先查看HT66F2390的定时器模块(简称TM),有两种TM,分别是STM(标准型)PTM(周期型),下图可以看出,两种类型的定时器都可以实现PWM的功能,且用法相似。

我们本次的实验主要以PTM为基础,



查找对应的寄存器

因为本次用16-bitPTM定时器,所以寄存器开头为PTM3(n=3),

寄存器为以上几种:定时器基础配置寄存器有xTMnC0和xTMnC1

单片机各模块的功能是配置单片机内部的功能控制寄存器实现的,不同的赋值会有不同的功能实现。

发现是由控制寄存器 xTnCK2~xTnCK0,这两位(bit)控制

对关键字进行搜索

找到,xTMnC0(“x”可以是S/P,n为0~3) 是定时器的控制寄存器

接下来开始对xTMnC0的配置

	_ptm3c0=0b00001000;	   // 时钟选择


因为呼吸灯要不断用到计数器功能,BIt7配置为0;

时钟位选择000(可以自行选择);

接下来配置PWM功能(可以直接搜索关键字查找)

 _ptm3c1=0b10101000;    //选择为PWM输出且高有效

看到PWM了,6-7为配置为10

本实验接GND,所以设置为PWM输出,且输出高有效。


这样子时钟和模式的配置就完成了




2.PWM输出频率和占空比设置
 

单片机输出为数字信号,只分为高/低电平,需要通过PWM(脉冲宽度调制)来将数字信号模拟输出,越低的占空比,高电平窄带宽的输出越少,模拟输出的电压越低。PWM的输出频率由时钟信号和PWM输出的周期决定。
 

以呼吸灯为例:时钟信号固定,周期太长会导致频闪比较高,太低会导致灯还没暗下去就又亮起来了(人类视觉反应不够),实验选择的是4000单位的机器周期时间(个人向)。
 

const int Period = 4000;           // 定义PWM周期 


查找PTM定时器的PWM输出模式

输出频率的设置引出两个寄存器,TM计数寄存器(CCRA)和捕捉/比较寄存器(CCRP)
 



 

通过计数寄存器(CCPA)的预存储数值计数后和比较寄存器(CCRP)预存的数值比较,触发中断,产生高电平信号来产生PWM波(PWM相关内部实现原理可以自行研究)

上图我们知道PWM周期CCRP存储,占空比dutyCCRA/CCRP来配置。

值得注意的是,这两个寄存器的输入,需要分高八位低八位来分别写入数据!
(手册搜索关键字CCRA/CCRP)

PWM周期设置代码:
 _ptm3rph=Period/256;    //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
 _ptm3rpl=Period%256;

上述寄存器_ptm3rp(后缀h为高八位,后缀l为第八位)CCRP的寄存器名称,

CCRA的寄存器名称为_ptm3ra,(为什么为3 是选用编号为3 的PTM寄存器)

占空比设置代码:
void Set_PWM(unsigned long Duty) //占空比设置
{
   	_ptm3ah =Duty/256;   //CCRA高八位   
   	_ptm3al =Duty%256;
}

3.输出引脚选择
 

PWM输出需要引脚,也就是定时器的输出引脚(PTP3


查找手册引脚图或搜索PTP3,可以找到PTP3有在两组共用引脚中出现,外部输出有PB2/PD4

(io口),我们任选一个就好,实验使用PB2.


 

配置引脚:
 

搜索找到在PBS0寄存器配置PB2

输出引脚代码:
 _pbs0=0b00110000;       //PTP3输出,引脚接线的是B2

通过查找ESK-303手册(合泰官网可下载可以找到外部引脚的位置

这样基础的四个步骤就完成了。


小结:

1.时钟选择
2.模式配置:寄存器定位,按位选择
3.PWM输出频率和占空比设置:寄存器定位
4.引脚输出:引脚的定位

预先了解板子的定时器组成,类型,功能。

再根据查找对应功能控制寄存器去配置,

最后再进行引脚选择输出。

看手册能力:

以上都离不开看手册的能力和日常的练习,本文通过用PWM配置思路索引和用查找关键词的方式快速找到对应的寄存器并完成配置,实现想要的功能。
 


希望以上内容对你有帮助,有错误还望指正。

  • 37
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值