晓飛飛 发表于 2024-10-8 22:32:50

32G12K128例程反馈 红外发射部分 | 不需要发送状态,PWM还在输出

使用 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的例程也有类似问题,在实际产品中,持续开启红外管发射不但影响红外管寿命,而功耗也巨大,需要妥善处理为好。



大叶子 发表于 2024-10-9 07:07:41

感谢楼主的加持,让STC更好,是好事。

wlhet 发表于 2024-11-23 15:54:04

确实是楼主细心 这都能发现我也被三极管烫过 那酸爽
页: [1]
查看完整版本: 32G12K128例程反馈 红外发射部分 | 不需要发送状态,PWM还在输出