历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2019年01月09日 | STM32学习笔记一一红外遥控

2019-01-09 来源:eefocus

1. 简述

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,低功耗,低成本。


红外遥控的编码方式目前广泛使用的是: PWM (脉冲宽度调制)的 NEC 协议和 Philips PPM(脉冲位置调制) 的 RC-5 协议的。


1.1 NEC 协议定义

NEC 码的位定义: 一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要2.25ms(560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要1.125ms(560us 脉冲+560us 低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低 + 560us 高。


发射端逻辑:


在这里插入图片描述

在这里插入图片描述

遥控接收头逻辑:

在这里插入图片描述

在这里插入图片描述


1.2 NEC 协议特点

(1) 8 位地址和 8 位指令长度;

(2)地址和命令 2 次传输(确保可靠性);

(3) PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;

(4)载波频率为 38Khz;

(5)位时间为 1.125ms 或 2.25ms;


1.3 NEC 遥控指令的数据格式


在这里插入图片描述


采用反码是为了增加传输的可靠性。NEC 码规定的连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平+97.94ms 高电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,即连发码。


2. 软件实现

上面我们基本了解了 NEC 格式的红外发码和收码的格式,就可以根据通信的协议来完成对应的程序。


程序逻辑:


在这里插入图片描述


2.1 初始化

void Remote_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_ICInitTypeDef TIM_ICInitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_1);


TIM_TimeBaseStructure.TIM_Period = 10000;//设定自动重装值,10ms溢出

TIM_TimeBaseStructure.TIM_Prescaler = (72-1);//预分频器,1MHz的计数频率,1us加一

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式

TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);


TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//IC2映射到TI5

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频

TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011,输入滤波器8个定时器时钟周期滤波

TIM_ICInit(TIM5,&TIM_ICInitStructure);//初始化定时器输入捕获通道

TIM_Cmd(TIM5,ENABLE);//使能定时器5


NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;//TIM5中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//从优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断,允许CC2IE捕获中断

}



2.2 中断捕获

u8 RmtSta=0;

u16 Dval;

u32 RmtRec=0;

u8 RmtCnt=0;

void TIM5_IRQHandler(void)

{

if(TIM_GetITStatus(TIM5,TIM_IT_Update)!= RESET)

{

if(RmtSta&0x80)//数据接收到标志位

{

RmtSta &= ~0x10;//取消上升沿捕获标记

if((RmtSta&0x0F)==0x00)

RmtSta |= 1<<6;

if((RmtSta&0x0F)<14)

RmtSta++;

else

{

RmtSta &= ~(1<<7);//清空引导标志位

RmtSta &= 0xF0;//清空计数器

}

}

}

if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)

{

if(RDATA)//上升沿已经捕获

{

TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);//CC1P=1,设置为下降沿捕获

TIM_SetCounter(TIM5,0);//清空定时器数值

RmtSta |= 0x10;//标记上升沿已经被捕获

}

else

{

Dval = TIM_GetCapture2(TIM5);//读取CCR1的值

TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising);//设置为上升沿捕获

if(RmtSta&0x10)

{

if(RmtSta&0x80)//接收到引导码

{

if(Dval>300&&Dval<800)//高电平为560us

{

RmtRec <<= 1;

RmtRec |= 0;//接收到0码

}

else if(Dval>1400&&Dval<1800)//高电平为1680us

{

RmtRec <<= 1;

RmtRec |= 1;//接收到1码

}

else if(Dval>2200&&Dval<2600)//连发码判断

{

RmtCnt++;

RmtSta &= 0xF0;//清空计数器

}

}

else if(Dval>4200&&Dval<4700)

{

RmtSta |= 1<<7;//记录接收到引导码

RmtCnt = 0;

}

}

RmtSta &= ~(1<<4);

}

}

TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2);

}


2.3 遥控键值扫描

u8 Remote_Scan(void)

{

u8 sta=0;

u8 t1,t2;


if(RmtSta&(1<<6))//得到一个按键的信息

{

t1 = RmtRec>>24;//地址码

t2 = (RmtRec>>16) &  0xFF;//地址反码

if((t1==(u8)~t2)&&t1==REMOTE_ID)//校验遥控识别码以及遥控接收地址

{

t1 = RmtRec >> 8;//控制码

t2 = RmtRec;//控制反码

if(t1==(u8)~t2)

sta = t1;

}

if((sta==0)||((RmtSta&0x80)==0))//接收错误或者按键没有按下

{

RmtSta &= ~(1<<6);//清除接收按键有效标志位

RmtCnt = 0;

}

}

return sta;

}


推荐阅读

史海拾趣

HDK(北陆电气)公司的发展小趣事

对于STM32与四线电阻触摸屏的接口电路,网友可能会有以下一系列问题,我将逐一进行回答:

1. STM32如何与四线电阻触摸屏连接?

回答:STM32与四线电阻触摸屏的连接主要通过STM32的GPIO口实现。通常,STM32的多个GPIO口会分别连接到四线电阻触摸屏的X+、X-、Y+、Y-四个引脚。这些引脚用于驱动和检测触摸屏上的触摸动作。

2. 如何在STM32上配置GPIO以支持四线电阻触摸屏?

回答:在STM32上配置GPIO以支持四线电阻触摸屏时,需要将相应的GPIO口配置为模拟输出(用于驱动触摸屏)或模拟输入(用于读取触摸屏上的电压信号)。此外,还需要配置中断引脚来检测触摸屏是否被触摸。具体的配置步骤包括设置GPIO的模式(如推挽输出、上拉输入等)、速度以及是否启用中断等。

3. 如何使用STM32读取四线电阻触摸屏的坐标值?

回答:读取四线电阻触摸屏的坐标值通常涉及两步操作:首先,通过驱动触摸屏的X+或Y+引脚为高电平,并同时保持对应的X-或Y-引脚为低电平,以在触摸屏上形成电压梯度;然后,使用ADC(模数转换器)读取另一侧的X+或Y+引脚上的电压值。根据读取到的电压值与参考电压的比例关系,可以计算出触摸点的X或Y坐标。为了获得更准确的坐标值,通常需要进行多次读取并取平均值。

4. 是否需要外部控制芯片来实现STM32与四线电阻触摸屏的接口?

回答:不一定需要外部控制芯片。STM32的GPIO口和ADC功能已经足够强大,可以直接与四线电阻触摸屏接口。然而,在某些情况下,为了简化电路设计或提高触摸检测的精度和稳定性,可能会使用如XPT2046这样的专用触摸屏控制芯片。这些芯片内部集成了A/D转换器和触摸屏控制逻辑,可以通过SPI等接口与STM32通信,从而简化软件设计。

5. 如何进行触摸屏的校准?

回答:触摸屏的校准是为了确保触摸点与实际屏幕坐标之间的准确对应。通常,在触摸屏首次使用或更换后需要进行校准。校准过程包括在触摸屏上选择几个已知的点(如屏幕的四个角),然后记录这些点对应的ADC值。通过计算这些点的ADC值与实际屏幕坐标之间的关系,可以得到校准参数(如缩放因子和偏移量)。在后续的触摸检测中,可以使用这些校准参数将ADC值转换为实际的屏幕坐标。

6. STM32与四线电阻触摸屏接口电路中的常见问题有哪些?

回答:STM32与四线电阻触摸屏接口电路中的常见问题可能包括:

  • 触摸屏无响应:可能是由于GPIO配置错误、ADC配置不当或触摸屏硬件故障等原因导致。
  • 坐标偏移:可能是由于触摸屏未正确校准或校准参数设置错误导致。
  • 触摸点跳动:可能是由于触摸屏表面有污渍、静电干扰或ADC采样不稳定等原因导致。

解决这些问题的方法通常包括检查GPIO和ADC的配置、重新校准触摸屏以及清洁触摸屏表面等。如果问题依然存在,可能需要检查触摸屏硬件是否损坏。

Dialog公司的发展小趣事

Dialog公司最初可以追溯到1972年,当时它是由美国洛克希德导弹航空公司所属的一个情报科学实验室负责建立的。这个实验室的初衷是探索和开发新的通信技术,以支持军事和情报领域的需求。随着时间的推移,这个实验室逐渐积累了丰富的技术经验和研发实力。

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

面对全球制造业的数字化转型趋势,金宇半导体于2015年启动了智能制造项目。公司投入巨资引进先进的自动化生产线和智能管理系统,实现了从原材料采购、生产制造到产品测试的全程数字化管理。这一举措不仅大大提高了生产效率和产品质量,还降低了运营成本,增强了企业的竞争力。同时,金宇半导体还积极探索工业互联网、大数据等新技术在半导体制造领域的应用,为企业的未来发展注入了新的动力。

Arduino公司的发展小趣事

随着物联网和智能设备的兴起,Arduino平台在智能家居、智能农业、机器人等领域的应用越来越广泛。开发者们可以利用Arduino平台来设计和开发各种智能设备和应用,实现设备的互联互通和智能化控制。这些应用不仅提高了人们的生活质量,也推动了电子行业的进步和发展。

这五个故事展示了Arduino公司在电子行业中的发展历程和取得的成就。从最初的廉价微控制器解决方案,到如今的多样化主板和广泛应用,Arduino始终秉持着创新、开放和合作的精神,为电子行业的发展做出了重要贡献。

Daburn公司的发展小趣事

在Daburn公司的发展历程中,质量控制一直是重中之重。公司建立了严格的质量管理体系,从原材料采购到生产流程再到成品检验,每一个环节都严格把控。此外,Daburn还注重持续改进,通过引入先进的生产设备和工艺,不断提高产品的质量和性能。这种对质量的执着追求让Daburn赢得了客户的信任和好评。

G-Link Technology公司的发展小趣事

面对日益多样化的市场需求,蜂鸟无线敏锐地意识到定制化服务的重要性。公司开始提供根据客户需求量身定制的无线通信解决方案,这一举措迅速赢得了众多企业和个人的青睐。例如,某大型互联网公司需要为其全球分支机构部署稳定可靠的无线通信网络,蜂鸟无线凭借其在全球范围内的研发和销售网络,迅速响应并提供了个性化的解决方案,不仅满足了客户对通信质量的高要求,还大大缩短了项目周期,赢得了客户的高度赞誉。

问答坊 | AI 解惑

ARM培训视频-dsp-CPLD-FPGA开发视频-嵌入式系统开发-单片机开发视频

ARM培训视频-dsp-CPLD-FPGA开发视频-嵌入式系统开发-单片机开发视频 ------------------------------------------------------------------ 【ARM培训视频】课程主要内容 1.概念和基本工具: 嵌入式系统基本概念、嵌入式操作系统介绍 嵌入式系 ...…

查看全部问答>

特性阻抗公式

 a.微带线(microstrip) Z={87/[sqrt(Er+1.41)]}ln[5.98H/(0.8W+T)] 其中,W为线宽,T为走线的铜皮厚度,H为走线到参考平面的距离,Er是PCB板材质的介电常数(dielectric constant)。此公式必须在0.1…

查看全部问答>

我该怎么办啊?迷茫。。。

我03年毕业于一所普通的本科院校,学的是机械工程自动化专业,毕业后即来到了现在工作的这家在全国还算比较有名的大型家电制造企业从事生产工艺工作。每天的工作枯燥乏味,工艺巡检,要么就是这个零部件尺寸长了,装不进去,或者那个零部件短了需要 ...…

查看全部问答>

wince 设置默认输入法问题!

最近接手一个wince项目,使用QT4.4.3做的,现在要解决的问题是在控件上输入的时候,调用出wince自带的手写输入法 我现在的设想是 做一个Dll,用SipEnumIM枚举所有的输入法,然后查找出的wince自带的手写输入法的CLSID,将手写输入法的CLSID设置为 ...…

查看全部问答>

LM3S9B96 EM2扩展板用户指南

LM3S9B96 EM2扩展板用户指南 9B96的数据表坛子里有,就不重复了哈…

查看全部问答>

版主呀,或者管理员呀,快进来看看呀!

好了,欢迎进来,某某某,你好!      想请版主或者管理员等等有能力回答的人告诉我们大家一个问题,那就是:      这个用户组头衔是怎么升级的?      跟积分有关系? 还是跟威望 ...…

查看全部问答>

Sitara AM355x低成本新手套件概述

在德州仪器额微博中看到了这个评估套件的视频,分享给大家! 视频内容简要介绍了这款强大的评估套件 [ 本帖最后由 IC爬虫 于 2012-10-24 12:11 编辑 ]…

查看全部问答>

工作无成就感

目前的工作提不起激情,轻闲的空虚,无聊的总跑厕所抽闷烟,前段时间还可以搞搞AVR,现在板子不好打了,流程特多,学习很是不方便,为了上班而上班,我不要这样过   80后!一个沉重的代名词,仿佛一切定格!如何找回存在的价值! [ 本帖 ...…

查看全部问答>

控制芯片的选择

电子设计大赛中的控制类说是四轴飞行器,控制芯片都是用的STM32,我想问一下,MSP430F149可以吗?姿态算法可以实现吗? 希望各位大神指点。 谢谢啦。…

查看全部问答>

从MSP430F149转到G2553,快把我搞疯了。

发现所有的手册中说明的寄存器名称,MSP430G2553.H中就找不到。不知道是我找错资料了还是怎么了,麻烦大家给我个好资料。…

查看全部问答>