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