合泰杯(HT66F2390),旋转编码器控制LED亮度(外部中断和PWM)|手册讲解

本文详细介绍了如何通过HT66F2390的外部中断功能配合旋转编码器控制LED亮度,包括接线、代码示例和中断设置流程,旨在帮助读者掌握该芯片的中断和定时器配置。
摘要由CSDN通过智能技术生成

前言:

通过旋转编码器控制LED亮度的实验,来讲解HT66F2390外部中断的配置。可以根据这个流程来熟练整个板子的中断和定时器相关的配置。


实验演示和代码:
 

1.接线图:

旋转编码器接线:

LED接线:

根据自己型号的旋转编码器接对口就好,本文主要是学习如何设置外部中断。 
旋转编码器的相关知识可以看下下方链接的博文。

旋转编码器原理|正反转判定


2.视频演示:

HT66F2390,旋转编码器控制LED亮度变化|演示视频

3.实验代码:
 

#include "HT66F2390.h" 

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

void Set_PWM(unsigned long Duty);

void delay(unsigned long count); 

void PWM_Init(void);

void EntInter_Init(void);

int count_PWM = 0; //用来区分亮度的挡位
void main()
{
	_wdtc=0b10101011;              //关闭看门狗
	EntInter_Init();              //外部中断初始化
	PWM_Init();           //PWM初始化	
	while(1)
	{	
		
	}
}

void EntInter_Init(void) //外部中断初始化
{
	_pas0=0x00000100;                //引脚功能选择
//	_pds0=0x00000001;
	_integ = 0x00000001;            //设置int0为上升沿触发中断;其余为0;
	
	_int0ps = 0;//设置int0 的输入源为PA1;
	
	_int0e = 1;//int0中断使能位开启;

	_emi = 1; //开启总中断;
}

DEFINE_ISR(A_down,0x04)     //中断函数 ,自定跳转
{
	if(_pd0 ==1)//逆时针转代码
	{
		count_PWM--;
		if(count_PWM>0&&count_PWM<10)    //旋转梯度设定
		{
			Set_PWM(count_PWM);         //设置占空比
		}
		else 
		{
			count_PWM = 0;
		}
				
	}
	 else if(_pd0 == 0)//顺时针转代码
	 {
	   count_PWM++;
	   if(count_PWM >10)
	   {
	   	count_PWM = 10;
	   	}
      Set_PWM(count_PWM); 
	 }			
	 _int0f = 0;               //软件除能 中断申请标志位
	
}

void Set_PWM(unsigned long Duty) //占空比设置
{
	if(Duty>=0)
	{
	_ptm3ah =Duty*40/256;      
   	_ptm3al =Duty*40%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;                //开启总中断
}

代码内有一些合泰板子的PWM输出配置的代码,这里就不赘述了,会用到里面的原理,本文不懂的代码或有兴趣可以去看看这篇文。
合泰杯(HT66F2390)通过PWM呼吸灯实验,了解定时器基础知识(手把手看手册)
 


正文:

外部中断的设置:

只看红框内容,外部中断的触发需要用到INT0~INT3,这四个引脚任何一个都可以实现外部中断功能,本文只用到INT0(其他的设置也一样)。

下面的红框说明:中断是自动复位,可以自发跳转执行中断函数。

以下是HT66F2390 所有中断的操作,我们需要什么中断,就将下面的一条通路打通(配置好),红框就是我们要本次配置的外部中断0(INT0)的通路。


流程:


条件触发中断(INT0)→中断请求标志位开启(INT0F)→中断控制位开启(INT0E)→进入总中断(EMI)→判别优先级执行

 搜索INT0,找到配置它的四个操作寄存器[PAS0,INTEG,INTC0,IFS2]


接下来我们一一配置(按照上图红框的寄存器顺序

PAS0 选择共用引脚的功能选择;
实验代码:

	_pas0=0x00000100;                //引脚功能选择

INTEG寄存器选择外部中断(INT0~INT3)的触发条件,这里我们实验选择上升沿触发

(在引脚接收到由低电平到高电平的变化时,触发中断) 


 实验代码:

_integ = 0x00000001;            //设置int0为上升沿触发中断;其余为0;

 接下来配置中断通路的最后两个步骤:使能中断控制位,开启总中断

因为此寄存器还可以设置其他中断,为了方便以后的修改和代码的移植,这里直接用寄存器每一位的名称(就是上图红框的内容)来直接配置,PS:仅限可以按位取址的寄存器

 代码: 


	_int0e = 1;//int0中断使能位开启;

	_emi = 1; //开启总中断;


每个外部中断有两个输入源可以选择,实验选择的是PA1

实验代码:

	_int0ps = 0;//设置int0 的输入源为PA1;

等等!还漏了一步?
并不是,中断请求标志位在条件触发中断的时候已经自动赋值为1了,


值得注意的是,这一位在中断函数执行完之后要软件进行复位
代码示例:

DEFINE_ISR(A_down,0x04)     //中断函数 ,自定跳转
{
//中断函数的主体
 _int0f = 0;               //软件除能 中断申请标志位
}

上面的代码就是中断函数的格式
两个参数:"A_down"是自己定义的,"0x04"是中断的优先级,看下图选择的通路配置。

 


小结:
 

以上就是外部中断配置的流程,旋转编码器的部分还未进行软件消抖,感兴趣的可以深入学习。
HT66F2390 设置PWM输出代码的部分这里就不赘述了。


以上就是本文的主要内容,如有错误,还望指出。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值