实验16:红外遥控printf输出
- 格式:pdf
- 大小:539.32 KB
- 文档页数:8
实验16 红外遥控实验
本章我们将向大家介绍如何通过 STM32来解码红外遥控器的信号。
普中科技STM32开发板标配了红外接收头和一个很小巧的红外遥控器。
在本章中,我们将利用 STM32 的外部中断功能,解码开发板标配的这个红外遥控器的编码信号,并将解码后的键值数据通过printf打印输出在串口助手上。
本章分为以下学习目标:
1. 了解红外遥控的解码原理
1.1红外遥控简介简介
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。
这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。
由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。
红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。
普中科技 STM32 开发板配套的遥控器使用的是NEC 协议,其特征如下:
1、 8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;
NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms
( 560us脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低电平)。
而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。
同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。
按照低位在前,高位在后的顺序发送。
采用反码是为了增加传输的可靠性(可
用于校验)。
1.ENC 协议的时序图
ENC 特点如下:
1)协议规定低位首先发送。
一串信息首先发送9ms 的AGC(自动增益控制)的高
脉冲,接着发送 4.5ms 的起始低电平,接下来是发送四个字节的地址码和命令码,这四个字节分别为:地址码;地址码反码;命令码;命令码反码。
2)如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以110ms
为周期的重复码。
3)接收到的信号是跟发送信号正好反向的。
2.重复码的格式
重复码的格式是由9ms 的AGC 高电平和 4.5ms 的低电平及一个560us 的高电平组成。
3.逻辑“1”的表示
逻辑 1 的是由560us 的高电平和1.69ms 的低电平组成的脉冲表示。
4.逻辑“0”的表示
5.ENC 的解码过程
一般ENC 的解码过程为:
1) 产生下降沿,进入外部中断15 的中断函数,延时一下之后检测IO 口是否还是低
电平,是就等待9ms 的低电平过去。
2) 等待完9ms 低电平过去,再去等待4.5ms 的高电平过去。
3) 接着开始接收传送的4 组数据
⏹ 先等待560us 的低电平过去
⏹ 检测高电平的持续时间,如果超过1.12ms 那么是高电平(高电平的的持续时间
为 1.69ms,低电平的持续时间为565us。
)
4)检测接收到的数据和数据的反码进行比较,是否等到的数据是一样的。
6.ENC 的解码函数为:
void EXTI15_10_IRQHandler(void) //红外遥控外部中断
{
u8 Tim=0,Ok=0,Data,Num=0;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1) {
Tim=HW_jssj();//获得此次高电平时间
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)
{
hw_jsm<<=1;
hw_jsm+=Data;
if(Num>=32)
{
hw_jsbz=1;
break;
}
}
Num++;
}
}
EXTI_ClearITPendingBit(EXTI_Line15);
}
/************************************************************************** *****
* 函数名 : HW_jssj
* 函数功能 : 高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us
* 输入 : 无
* 输出 : t
*************************************************************************** ****/
u8 HW_jssj()
{
u8 t=0;
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1)//高电平
{
t++;
delay_us(20);
if(t>=250) return t;//超时溢出
}
return t;
}
1.2电路设计
从上图我们可以看出,红外接收头使用的是一跟数据线传输数据,跟DS18B20 差不多。
我们开发板上面使用的单片机的PG15口。
1.3例程主函数
/**************************************************************************** * Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
****************************************************************************/ int main()
{
hwjs_init(); //红外接口初始化
printf_init(); //printf初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0; //清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0; //接收码清零
}
}
}
主程序的效果是,解码红外遥控的键值,将其地址码和反码还有控制码及反码通过printf输出到串口助手上,如下:
当程序下载进去后,打开串口,对DTR前进行勾选,然后在取消。
再通过发送字符即可以显示。