最近在串口发送引脚上接LED指示发送或者接收状态,但是需求是希望连续发送或者接收字符过程中LED闪烁,而不是保持在一个常量或者常灭的状态。首先,把实际电路图和串口时序贴出来:
可以看出串口发送接收空闲态为高电平,只要进行数据发送就一定会产生低电平,利用低电平点亮LED,再利用高电平熄灭。
但是在实际操作中发现大于2500bps,连续发送数据的时候灯是不会闪烁的,会保持一个常量的状态,只是亮度会随数据内容不同而变化,这就牵涉到 LED 点亮的一个时间问题了。LED点亮熄灭到再次点亮是需要一定时间间隔的,一般常见的在 4.x ms,这里以4ms举例,也就是说如果点亮led,熄灭,下次点亮,只有这个熄灭的时间超过4ms,才可以看出闪烁,否则看起来就像是常亮的。既然有这个要求,就和波特率有一定关系了,我们按照极端情况来考虑,发送字符为0xFF的情况,那么只有起始位是一个低电平,按照4ms发送一个字符(10bit)来计算,此时波特率为2500bps。这就表明大于2500波特率的时候,无论连续发送什么数据,灯都是不会闪烁的。
好了,确定灯目前处于一个常亮状态了,那么现在的问题是为什么灯亮度会不略有变化,做一个测试,发送连续十六进制,会发现这个十六进制数中的为0的bit越多,灯就越亮。说道这里,那就是 PWM 呼吸灯一个原理啦。实际上都是较快频率控制LED亮灭,值得注意的是不少人认为是亮灭太快,导致肉眼观察不出,这个说法有点牵强,我以前也是跟着这个想法走,实际上 LED 根本没有不停亮灭,根据我前面说的LED点亮的间隔可以得知,所以灯一直是亮的,亮度发声变化是由于LED两端的电压差发生了变化。以PWM举例,高频率的周期变化的0和1电平,也就是占空比对应到模拟信号上也就成了转换电压,拿5V举例,占空比百分之50,那么实际输出平均电压就是2.5V,但是为什么要平均呢?这就是数字信号和模拟信号的区别了,我们控制的是数字信号,而实际起作用的要转换成模拟信号了。
综上,低频是亮灭效果,因为可以满足led点亮间隔要求,高频就是不同亮度的常亮效果了,原因如上。