X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
stm32/stm8
[原创] 51单片机 stm8 stm32 红外发码,红外发码距离短 过短 太近解决方法
仙景
2017-5-8 12:03
楼主
此内容由EEWORLD论坛网友
仙景
原创,如需转载或用于商业用途需征得作者同意并注明出处
之前做项目,要用到红外,看了网上很多例子,都不是很理想,就自己搞了一个,我们都知道红外可以传输数据,要生活中很多地方用到,红外遥控,语言数据传输,红外检测,都需要红外,那就需要产生红外的仪器,有纯硬件的,网上都有,也有软件的。
红外的特点:就是简单,价格也低,缺点就是距离近,方向性特强。
红外载波:38K比较常用,1/3占空比就可以实现,至于为什么用38K不用其他的,其实用哪个频率都可以,只要你能产生都可以,但这也要考虑到红外接收头,很多都是在一定的频率,太低,太高都接收不了。所以,38K载波频率肯定有它存在的道理。
红外协议:
NEC协议是众多红外遥控协议的其中一种,除NEC外,还有RC5、RC6等其它的。市面上买到的非学习型万能电视遥控器大多集成一种或多种编码是NEC型的的,这里也主要说说NEC协议。NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us
脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控
接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到
的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。
当然,对于这种协议,自己也可以完全定义自己专用的,这样的话,别人就解调不了,现在市场空调,每家有每家的一套做法。
红外硬件电路:电路一:
通过电源接个电阻再接红外灯直接接入单片机的IO口; 电路二:
通过电源接个电阻再接红外灯通过一个三极管接地。
我们发现两种电路都可以,如果对距离没要求,建议选第一种,可以省成本;如果对距离有要求,建议选第二种,第二种,电流大,距离远,毕竟红外发射距离跟功率有很大的关系。
软件:要产生38K的频率,那就只需要26us周期就可以了,现在的单片机都可以产生,软件模拟也很贱多,但是选择1/2,1/3……哪种的占空比,经过我测试后,发现占空比是对红外距离影响最小的。随意选择就有,我是利用定时器中断来做的,代码如下:
TIM2_DeInit();[/size]
TIM2_TimeBaseInit(TIM2_PRESCALER_1, 211);
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
ITC_SetSoftwarePriority(ITC_IRQ_TIM2_OVF,ITC_PRIORITYLEVEL_1);
void IR_Process(void)
{
switch(State)
{
case 0: // 状态初始化
SendCnt = 0;
Bit = 1;
Pos = 1;
IR_OFF;
State++;
break;
case 1: // 发送4.5ms调制引导码
if(++SendCnt < 342)
{
IR_TOGGLE;
}
else
{
//IR_TOGGLE;
SendCnt = 0;
State++;
}
break;
case 2: // 发送4.5ms引导码
if(++SendCnt < 342)
{
IR_OFF;
}
else
{
IR_TOGGLE;
SendCnt = 0;
State++;
}
break;
case 3: // 发送一位数据
++SendCnt;
if(SendCnt < 40)
{
IR_TOGGLE;
}
else if(SendCnt < 84)
{
IR_OFF;
}
else
{
if((IR_Data[Pos] & Bit) && (SendCnt < 168))
{
IR_OFF;
}
else
{
SendCnt = 0;
State++;
}
}
break;
case 4: // 下一位
Bit <<= 1;
if(Bit >= 0x100)
{
++Pos;
if(Pos > IR_Data[0]) // 发送完成
{
State++;
}
else
{
Bit = 1;
State--;
}
}
else
{
State--;
}
break;
case 5: // 发送最后一位
++SendCnt;
if(SendCnt <= 40)
{
IR_TOGGLE;
}
else if(SendCnt < 84)
{
IR_OFF;
}
else
{
if((IR_Data[Pos] & Bit) && (SendCnt < 168))
{
IR_OFF;
}
else
{
SendCnt = 0;
State++;
}
}
break;
default:
State = 0;
IR_Sended = 2;
IR_ON;
TIM2_Cmd(DISABLE);
TimeOut(&TimeIRDelay, 0);
break;
}
}
经过上面就可以利用stm8惊醒红外发码了,如果再发现距离不够,好像又发现不了什么问题,那我们就从最初的开始寻找,距离跟红外的功率有关,那我们可以调试电阻看看是否能改善,其次就是看看电源是否波动,我就是由于电源波动,导致距离非常近,经过寻找发现后,电源加了个滤波,红外发射距离可以更远,至少8米之外。这就是我要说的。如果有什么不对,也可以交流交流。
本帖最后由 仙景 于 2017-5-8 13:54 编辑
点赞
回复评论 (3)
沙发
weizhongc
除非你电源带不起啊,不然要什么滤波啊。
点赞
2017-5-8 23:09
板凳
仙景
引用:
weizhongc 发表于 2017-5-8 23:09
除非你电源带不起啊,不然要什么滤波啊。
肯定带得起,如果你不是稳压电源的话,肯定有波动啊
点赞
2017-5-9 10:07
4楼
huo_hu
以前也弄过,距离是不远,具体原因也没搞清楚,因为接收端就是个黑盒子
点赞
2017-5-9 12:53
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
示波器基础原理入门
改程序还是写程序?
一个完整的项目范例,供大家参考
连续依次输出GPIO口用什么方法好?
关于ppc共享文件夹
求16×16点阵字库.什么语言的都可以
为国产芯片增加OpenOCD Flash驱动----以AIC8800为例
使用28335进行AD实验,得出的波形总会出现如图的情况,是怎么回事
zigbee添加自己的消息类型
贴片元件焊接教程
MSP430的熔丝怎么会被烧
超级电容的容量和容值如何测
buck变换器问题求助
晒照片赢话费---reayfei
【AN-1165应用笔记】用于MEMS麦克风前置放大器电路的运算放大器
CC3220S-LaunchPad 开箱及原理图分析
关于把程序烧写进c2000launchpad的FLASH中无法正常运行的问题?
谁有iesimple的源码?
怎样在vb中自动检测到可用串口号
C2000 Piccolo-A/B开发评估套件 免费申请
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复