前言:前面已经完成了红外解码,重点来了,红外信号调制。
空调控制演示效果:
1、红外发射电路原理
使用的红外发射模块为网购的普通模块,价格是一块钱左右(实际上是9毛);
可能是因为价格的原因,模块的资料也不是很详细,反正也就3根线,2根电源+1根信号;但是,在测试过程中,红外接收那边的LED一直不亮,示波器也测不到信号。
这个时候才去使用万用表测量了引脚信号:当前VCC为空置,也没有硬件上拉。
想着既然模块没有上拉,那就设置驱动引脚为上拉配置。但是很遗憾,检查了引脚,没有发现在输出模式下的上拉功能:
只能硬件上拉了,在VCC和DAT之间使用跳线焊接了1个电阻。→硬件上拉后,DAT引脚波形:
DAT引脚上的波形效果看起来挺不错,但是很神奇,红外接收那边的LED一直不亮,同样,示波器也测不到信号。
进一步测量红外二极管引脚波形:可以检测到预料波形。
这里输出的波形,由延时控制,并非由PWM控制输出。
1.1、使用PWM波控制红外发射管
当前驱动红外的GPIO:
这里的CMOS属于在输入配置下,输出配置下应该也有相关功能。
确认一下CMOS的定义。
输出级的上臂配置PchMOS晶体管,而下臂配置NchMOS晶体管的一种输出结构形式称为CMOS输出(互补输出)。—-参考:https://www.rohm.com.cn/products/faq-search/faqId/137
P213成功输出PWM波:周期10us,占空比50%;
设置占空比5%,10%:失败!后面具体的PWM改由代码设置,所以这里实际波形和图形配置不一致,暂时略过。
小结:红外接收那边的LED一直不亮,同样,示波器也测不到信号。
1.2、修改硬件电路:增加MOS管或者三级管
随机选择了一款mos的数据手册进行学习:
偶然发现,之前的开发板驱动扬声器有1个三极管。查一下引脚分布,拆下来装上。
加上三极管后,测量发射二极管的电压才2.55V,如图:
现在改为5V供电,也没有预期效果。依旧怀疑是红外发射管的问题。
1.3、对比不同红外发射管的技术参数
普通发光二极管LED的电流-100ma,持续时间1us;
Mw/Sr → 兆瓦/球面度;1mW/cm^2为每平方厘米内1mW,1mW/sr为每球面度内1mW。
SFH445的辐射强度很大,但是驱动电流也很大,达到1A了。也能在100MA的情况下进行驱动,如图:
拆开一个遥控器,连接遥控器的红外发射管,得到波形:
25us,50%占空比,电压幅值1.4V.
到此已经能够确认,是接收头自带滤波导致红外信号异常:
参考:https://blog.csdn.net/qq_17351161/article/details/107437382
设置50ms的延时,PWM交替开启、关闭,得到接收头的波形(虽然延时的时间不对,但是波形趋势符合预期):
实际上,是因为延时不准:vTaskDelay (50); →130+ms。⇒2.5倍数。
延时不正常的原因,驱动OLED的底层函数采用了阻塞延时(us级别延时)。
1.5、OLED显示存在的问题
将底层函数修改后,可以解决延时不准确的问题,但是刷屏时间会得很长。后期有时间,要将硬件IIC的中断引入。
后面有时间优化了,可以尝试IIC+DMA的方式驱动OLED:
1.6、使用26us作为定时器中断周期
38KHZ频率的周期:26.3us。
修改GPT定时器周期后,符合38KHZ的要求。
当前解码时间不对:
修改解码逻辑,9250us解码符合要求。
修改解码逻辑,550us解码符合要求。
修改解码逻辑,40274us解码符合要求。
设置延时100ms,PWM波形交替设置为50%和0%,红外接收头可以检测预期波形:
截取红外接收二极管的数据手册里的描述:
加入休息时间(红外接收头在限制状态需要让其输出搞定平-重要-重要-非常重要):
小结:这种接收芯片,不能平均的50%高电平,50%低电平,需要接收一段时间的信息,然后保持低电平充能。
1.6.1、精确分析
当前接收到的波形,已经大差不差了,但是,细节上还有一些小问题:
可以解码了,就是解析的数据是反向的,如图:
还原的红外信号:
实际信号:
信号的还原顺序还需要调整一下,准确还原9.0ms低电平和4.5MS高电平!
调整后,空调已经能够响应遥控信号(距离<2.5米)。
红外发射关键代码:
static void transmitInfraredKeyValue(void)
{
static int64_t counter;
static int64_t startTimeCounter =0;
static int64_t runTimeCounter =0;///<持续发送红外光的时间
if(runStatus==TRANSMIT_START)///<开启发送红外波
{
counter =0;
tranmitInfraredClose();
startTimeCounter = counter;
runStatus = TRANSMIT_RUN_HIGHT;
}
if((runStatus==TRANSMIT_RUN_HIGHT)||(runStatus==TRANSMIT_RUN_LOW))///<执行发送流程
{
runTimeCounter = counter - startTimeCounter;
if(runStatus==TRANSMIT_RUN_HIGHT&&runTimeCounter >= infrared_data.data_record_hight[indexTransmitInfraredData]&&\
runTimeCounter < infrared_data.data_record_hight[indexTransmitInfraredData] + infrared_data.data_record_low[indexTransmitInfraredData]){///<高电平发送完成
tranmitInfraredOn();
runStatus= TRANSMIT_RUN_LOW;
}
else if(runTimeCounter >= infrared_data.data_record_hight[indexTransmitInfraredData] + infrared_data.data_record_low[indexTransmitInfraredData]){
tranmitInfraredClose();
runStatus=TRANSMIT_FINISH;///<发送完成转杯下一次发送
}
}
if(runStatus==TRANSMIT_FINISH)///<准备下一次发送
{
indexTransmitInfraredData = indexTransmitInfraredData+1;
runStatus = TRANSMIT_START;
if(indexTransmitInfraredData >infrared_data.data_index_low){///<暂时只测试1/10的数据
tranmitInfraredClose();
runStatus = TRANSMIT_IDLE;///<注释后,连续发送
indexTransmitInfraredData =0;
}
}
counter++;
}
当前已经解码和发射红外,接下来需要将接收的红外数据存储到Flash,使用的时候提取出来。
【瑞萨 RA2E1】+ 点亮LED(1)
【瑞萨 RA2E1】+ 硬件IIC驱动LCD和LM75温度传感器(2)
【瑞萨 RA2E1】+ 基于U8G2显示菜单(3)
【瑞萨 RA2E1】+ 红外解码(4)
【瑞萨 RA2E1】+ 红外发射(5)
【瑞萨 RA2E1】+ 空调控制项目-总结帖(6)