PWM,又一个典型的输出功能,是利用处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它主要包括周期、脉冲宽度和占空比这几个概念。脉冲宽度就是高电平输出的时间,占空比就是低电平所占的百分比。而高电平与低电平时间的总和就是周期,所以我们主要设置脉冲宽度和占空比这两个数值(当然,一些基本的设置已经被封装好或使用默认值)。
还是先来看一下类的定义,请打开PWM单元文件:
与GPIO单元类似,同样有两个类供使用。但是这里面有一些不同,先说说TPWM类。
TPWM类的使用方法和TGPIO相同,直接创建就可以用了,但是它的实现方式不一样。PWM口与IO口是复用的,它是IO口的另一种功能,所以TPWM类继承了TGPIO类。继承后的TPWM类在内部调用了TGPIO类的一些功能设置对应的IO口为PWM输出,同时设置好了一些基本的属性,所以在使用时不需要考虑的太多。
而TPWMGROUP类就不同了,它是一个单例类,即在同一个程序中它只能被创建一次,而且是第一次使用时被创建,再在其他任何地方使用都是这个已经创建好的实例,而且不需要手动释放,在程序退出时自动释放。这样做是为了尽量避免多处程序对一个PWM通道操作造成影响。当然,完全避免是不可能的(除非加锁,但是这样对操作系统的依赖比较大),主要还是起到提示作用。
好了,开始动手吧,自制神器再次出现
请忽略上面的各种按键,只看LED。和上一节香蕉派上的PH24不一样,这个LED通过一个三极管来驱动,它可以根据PWM的频率来亮灭。当PWM输出低电平时形成压差使LED亮,高电平时灭。
硬件的连接,由于是自制的,不具有通用性,所以不再表述,只看PWM这根线,出于方便,我把它接在了PWM1上,也就是PI3这个IO口(紫色的那根线)。
准备工作完成,开始写程序。
pascal的with可以省略对象名,真正操作就是指定PWM通道,设置预分频、周期、占空比。更改后面这三个可以看到LED闪烁频率的变化。
闪烁的过程是动态的,就不拍照了,拍了也看不出效果:-)。
再看看TPWMGROUP类的使用方法,实现了和上面完全一样的效果,但是代码是要这样写地:
代码量一下增加了好多,但是使用起来更加灵活,根据自己的需要来决定。
有兴趣的话可以试试电机的控制或实现一个呼吸灯吧。
请在https://github.com/tjCFeng/ClassA20下载ClassA20类库。