调试背景
部件:两块级联移位寄存器芯片、4*7段数码管,单片机到移位寄存器线长 > 20cm, 单片机3v3, 移位寄存器5v,未添加电压匹配芯片
问题:引入强烈干扰以后,数码管数据显示异常,轻微时闪烁,严重时显示8888
/*数据线*/
#define SDA_H() xx
#define SDA_L() xx
/*时钟线*/
#define CLK_H() xx
#define CLK_L() xx
/*锁存线*/
#define SR_H() xx
#define SR_L() xx
/*伪代码逻辑如下*/
void SerialLedDisplayCtrl(uint16_t data){
SR_L();
for(uint8_t i = 0; i < 16; ++i){
CLK_L();
data & 0x01 ? SR_H() : SR_L();
delay_us(1);
CLK_H();
delay_us(1);
data >>= 1;
}
SR_H();
}
/*上述代码在强烈的干扰下表现性能不如以下逻辑*/
void SerialLedDisplayCtrl(uint16_t data){
for(uint8_t i = 0; i < 16; ++i){
data & 0x01 ? SR_H() : SR_L();
delay_us(1);
CLK_L();
delay_us(1);
CLK_H();
data >>= 1;
}
SR_L();
delay_us(1);
SR_H();
}
/*去掉所有延时表现更好一点儿*/
void SerialLedDisplayCtrl(uint16_t data){
for(uint8_t i = 0; i < 16; ++i){
data & 0x01 ? SR_H() : SR_L();
CLK_L();
CLK_H();
data >>= 1;
}
SR_L();
SR_H();
}
分析:
在未引入干扰前,数码管尽管电压未匹配,但仍然正常工作,在引入干扰后,单片机的输出信号变得异常多的毛刺,造成高低电平异常。
第一种逻辑在理论上是没有任何问题的,和其他两种没有任何区别。
但后面两种的抗干扰能力相对来说更强,因为其低电平持续的时间更短,毛刺不容易导致高电平的产生,更不容易导致上升沿的产生,对于时钟信号和锁存信号都存在同样的问题,因此是一个优化的方向。