使用 32G12K128 实验箱V9.4 测试红外发射部分,用的官方例程STC32G-DEMO-CODE-V9.4-20230309的《29-红外遥控接收程序(NEC码)-数码管显示用户地址和键值》,
测试过程中无意中摸到红外发射管旁边的三极管热到飞起,在按键空闲时,用手机拍红外发射管持续高亮,而电路上的限流电阻仅10Ω,驱动三极管的基极电阻为1KΩ,因此三极管因为发射极电流过大而处于放大区,承受了大部分的热量耗散。在没有按键事件的时候,红外应该关闭,而现在的现象这明显是不对的。
翻看代码,发现在不需要发送的时候,PWM还是处于输出状态,因此红外一直发射中,功耗很大。
- if(KeyCode > 0) //检测到收到红外键码
- {
- IR_TxPulse(342); //对应9ms,同步头 9ms
- IR_TxSpace(171); //对应4.5ms,同步头间隔 4.5ms
- IR_TxPulse(21); //开始发送数据 0.5625ms
-
- IR_TxByte(User_code%256); //发用户码低字节
- IR_TxByte(User_code/256); //发用户码高字节
- IR_TxByte(KeyCode); //发数据
- IR_TxByte(~KeyCode); //发数据反码
-
- KeyCode = 0;
- }
复制代码
于是,增加以下代码
- /************* 发送关闭函数 **************/
- void IR_TxOff(void)
- {
- PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
- PWMA_CCMR4 = 0x40; //设置 PWM4 强制为无效电平
- P27 = 1; //PWM端口当IO置高,关闭红外输出
- }
复制代码
放在了键码发送后,按键发送红外光信号后,就不再继续发射了。
- if(KeyCode > 0) //检测到收到红外键码
- {
- IR_TxPulse(342); //对应9ms,同步头 9ms
- IR_TxSpace(171); //对应4.5ms,同步头间隔 4.5ms
- IR_TxPulse(21); //开始发送数据 0.5625ms
-
- IR_TxByte(User_code%256); //发用户码低字节
- IR_TxByte(User_code/256); //发用户码高字节
- IR_TxByte(KeyCode); //发数据
- IR_TxByte(~KeyCode); //发数据反码
-
- KeyCode = 0;
- IR_TxOff();
- }
复制代码
同样的,实验箱V9.6的例程也有类似问题,在实际产品中,持续开启红外管发射不但影响红外管寿命,而功耗也巨大,需要妥善处理为好。
|