完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. 红外遥控简介
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。红外遥控通讯系统一般由红外发射装置和红外接收设备两部分组成。 1.1 红外发射装置 红外发射装置(红外遥控器)是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管(目前使用的红外线波长多为940nm)。红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,红外遥控器将遥控信号(二进制脉冲码)调制在38kHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。 二进制脉冲码目前最广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制)。本例程遥控器使用的是NEC协议,其特征如下
而红外接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样在接收头端收到的信号为:逻辑1应该是560us低电平+1680us高电平,逻辑0应该是560us低电平+560us高电平。所以可以通过计算高电平时间判断接收到的数据是0还是1。 NEC 码位定义时序图如下图 NEC 遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。引导码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下: NEC 码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms 高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发射连发码,可以通过统计连发码的次数来标记按键按下的长短或次数。 1.2 红外接收设备 红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、 检波、整形,形成遥控指令脉冲,输出至遥控微处理器。 由于红外接收头在没有脉冲的时候为高电平,当收到脉冲的时候为低电平,所以可以通过外部中断的下降沿触发中断,在中断内通过计算高电平时间来判断接收到的数据是0还是1。 2. 硬件设计 D1指示灯用来提示系统运行状态,红外遥控器用来发射红外键值的编码信号,通过红外接收头进行解码,并将解码后的数据通过串口1打印输出
3. 软件设计 3.1 STM32CubeMX设置
3.2 MDK-ARM编程 在tim.c文件下实现微秒延时(us)函数 void delay_us(uint16_t us){ uint16_t differ = 0xffff-us-5; __HAL_TIM_SET_COUNTER(&htim7,differ); //设定TIM7计数器起始值 HAL_TIM_Base_Start(&htim7); //启动定时器 while(differ < 0xffff-5){ //判断 differ = __HAL_TIM_GET_COUNTER(&htim7); //查询计数器的计数值 } HAL_TIM_Base_Stop(&htim7); } 创建按键驱动文件irremote.c 和相关头文件irremote.h uint8_t IR_HighLevelPeriod(void){ //高电平持续时间函数 uint8_t t=0; while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_15)==1){ //高电平 t++; delay_us(20); if(t>=250) return t; //超时溢出 } return t; } //在中断回调函数中完成红外解码 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //红外遥控外部中断回调函数 uint8_t Tim=0,Ok=0,Data,Num=0; while(1){ if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_15)==1){ Tim = IR_HighLevelPeriod(); //获得此次高电平时间 if(Tim>=250) break; //无用的信号 if(Tim>=200 && Tim<250) Ok=1; //收到起始信号 else if(Tim>=60 && Tim<90) Data=1; //收到数据1 else if(Tim>=10 && Tim<50) Data=0; //收到数据0 if(Ok==1){ receive_Code <<= 1; receive_Code += Data; if(Num>=32){ receive_Flag=1; break; } } Num++; } } } 在main.c文件下编写红外遥控测试代码 int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM7_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf("IR Remote testing...please press the controller!!!rn"); /* USER CODE END 2 */ while (1){ if(receive_Flag == 1){ receive_Flag = 0; printf("IR Received Code: %0.8xrn",receive_Code); receive_Code = 0; } HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); HAL_Delay(200); } } 4. 下载验证 编译无误下载到开发板后,可以看到D1指示灯不断闪烁,当按下红外遥控器按键时,串口将打印出解码后的数据(地址码+地址反码+控制码+控制反码) |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:00 , Processed in 1.145512 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号