上次写的“入门实践”,只能实现占空比慢慢变大,滤波后的波形如下图:
用来控制LED的话,相当于呼吸灯的只能呼,不能吸。即使加个反相门,也是吸, 不能呼。多少有点遗憾,今天把这遗憾补上,把波形变成下图:
实现过程:
1、思考
首先让人想到的就是把原来的波形隔一个取反一个。这让我想到了异或门:
任何值 与 0 异或------输出不变
任何值 与 1 异或------输出取反
如果能产生一个类似的方波,输出信号与之异或就大功告成了。
2、关键方波怎么产生
方法一:计数器数脉冲
原来的输出波形如下,从这个波形中怎么生成一个方波呢,最初让我想到的是计数器数脉冲。
实际操作才发现这个方法有问题,第一个周期比后面的多一两个脉冲。而且数脉冲还有另一个问题,万一有一次不同步,后面的都会不同步。
方法二:检测最大占空比
通过观察发现,占空比慢慢变到最大,然后又回到最小。那只要检测出最大占空比,然后在最大那个占空比的下降沿取反。就得到我们想要的方波了。通过延时来检测最大占空比。选取延时时间的时候,必须大于倒数第二大占空比的时间。也就是只能检测到最大的那个占空比,倒数第二大的不能被检测出来。
用delay检测出最大占空比信号如下:
因为我们是要检测下降沿。所以把上面检测到的信号取反,就把我们要检测的信号变成了上升沿。上升沿输入到D触发器,就能得到我们想要的方波。
原始的输出信号与上面的方波异或, 果然得到我们想要的。
完整原理图:
3-L2 3-L3,是作门延时的,不知道软件会不会自动优化掉,不过去掉好像也没有影响。
参数计算:
CNT2: 决定脉冲的周期,比如,我们设置为200,则输出的PWM波的周期则为200个时钟。
CNT1: 决定了最小占空比,占空比增加的步长,还有决定了呼吸灯 呼一次或吸一次的时间。我们选择195,则占空比的输出为
5/200,10/200,15/200,20/200,…190/200,195/200,
从最小占空比—到最大占空比,一共是 195/5=39个周期。
呼吸灯的周期则为: 39x2=78周期。
实践中还遇到两个坑:
1、软件仿真时,我是把时钟调快了的,不然半天出来不了结果。连接上电路板后再把时钟调慢,发现灯有闪烁, 最后拿示波器看了波形,也没问题。才想到是PWM频率太低了,所以灯会闪。
2、检测最大占空比时,如果延时 时间设置太小,如果把倒数第二大占空比也检测到了,灯也会有跳变。
上一篇:https://blog.csdn.net/liangbin414/article/details/89370813