打印
[STM32F1]

STM32F1基础篇——红外遥控

[复制链接]
2711|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 aizaixiyuanqian 于 2017-12-27 20:02 编辑

通过 STM32 来解码红外遥控器的信号,我们将利用 STM32 的外部中断功能,解码开发板标配的这个红外遥控器的编码信号,并将解码后的键值数据通过 printf 打印输出在串口助手上 。
沙发
幸福小强| | 2017-12-27 19:56 | 只看该作者
这个芯片上面好像带红外接口吧,跟串口共用的一种模式。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2017-12-27 20:03 | 只看该作者
幸福小强 发表于 2017-12-27 19:56
这个芯片上面好像带红外接口吧,跟串口共用的一种模式。

是的

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2017-12-27 20:05 | 只看该作者
红外遥控 简介
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2017-12-27 20:06 | 只看该作者
红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 PhilipsRC-5 Protocol 的 PPM(脉冲位置调制)。
开发板配套的遥控器使用的是NEC 协议,其特征如下:
1、 8 位地址和 8 位指令长度;
2、地址和命令 2 次传输
3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2017-12-27 20:07 | 只看该作者
NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us低+560us 高。NEC 遥控指令的数据格式为:同步码头地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2017-12-27 20:08 | 只看该作者
ENC  协议的时序图

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2017-12-27 20:08 | 只看该作者
ENC 特点如下:
1) 协议规定低位首先发送。一串信息首先发送 9ms 的 AGC(自动增益 控制)的高脉冲,接着发送 4.5ms 的起始低电平,接下来是发送四 个字节的地址码和命令码,这四个字节分别为:地址码;地址码反 码;命令码;命令码反码。
2) 如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以 110ms为周期的重复码。
3) 接收到的信号是跟发送信号正好反向的。

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2017-12-27 20:13 | 只看该作者
逻辑 1 的是由 560us 的高电平和 1.69ms 的低电平组成的脉冲表示。

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2017-12-27 20:13 | 只看该作者
逻辑“0 ”的表示

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2017-12-27 20:14 | 只看该作者
ENC 的解码过程一般 ENC 的解码过程为:
1) 产生下降沿,进入外部中断 15 的中断函数,延时一下之后检测 IO 口是否还是低电平,是就等待 9ms 的低电平过去。
2) 等待完 9ms 低电平过去,再去等待 4.5ms 的高电平过去。
3) 接着开始接收传送的 4 组数据先等待 560us 的低电平过去检测高电平的持续时间,如果超过 1.12ms 那么是高电平( 高电平的的持续时间为 1.69ms,低电平的持续时间为 565us。)
4) 检测接收到的数据和数据的反码进行比较,是否等到的数据是一 样的。

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2017-12-27 20:18 | 只看该作者
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);
}

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2017-12-27 20:19 | 只看该作者
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;
}

使用特权

评论回复
14
aizaixiyuanqian|  楼主 | 2017-12-27 20:21 | 只看该作者
电路设计

使用特权

评论回复
15
aizaixiyuanqian|  楼主 | 2017-12-27 20:21 | 只看该作者
主代码
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;  //接收码清零
}
}
}

使用特权

评论回复
16
aizaixiyuanqian|  楼主 | 2017-12-27 20:23 | 只看该作者
主程序的效果是,解码红外遥控的键值,将其地址码和反码还有控制码及反码通过 printf 输
出到串口助手上,如图


使用特权

评论回复
17
aizaixiyuanqian|  楼主 | 2017-12-27 20:23 | 只看该作者
欢迎大家指正。

使用特权

评论回复
18
Brand2| | 2017-12-29 17:35 | 只看该作者
红外遥控的控制范围多远?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝