摘要:本文主要介绍如何使用Mixly实现PWM波形的输出。
下面就先用Mixly实现PWM波形的输出。首先打开Mixly软件,这次还是先使用C语言来实现。如果你有示波器,或者逻辑分析仪,可以先用这两种仪器看一下输出的波形。我在这里的程序设置输出3路PWM信号,频率是10KHz,占空比分别是25%、50%和75%。使用的PWM占空比分辨率为12位,绑定的通道为0、1和2,使用的GPIO的输出端口为25、26、27。因为这个只需要设置一次,就会不停的输出PWM波形,因此,先到“控制”功能模块区找到“初始化”功能模块,然后再到“输入/输出”功能模块区找到PWM波形输出功能,然后按照上面的描述配置相应的参数,配置完成后,如下图所示:
然后,将ESP32的25、26、27引脚分别连接到逻辑分析仪的CH1、CH2和CH3,采样之后的PWM波形图如下图所示。
逻辑分析仪的通道1、通道2和通道3分别显示了频率为10kHz,占空比为25%、50%和75%的PWM信号,这证明我们的程序是没有任何问题的,成功实现了PWM信号的输出。
接下来看一下Mixly生成程序的源代码吧。如下所示:
void setup(){ ??ledcSetup(0, 10000, 12); ??ledcAttachPin(25, 0); ??ledcSetup(1, 10000, 12); ??ledcAttachPin(26, 1); ??ledcSetup(2, 10000, 12); ??ledcAttachPin(27, 2); ??ledcWrite(0, 1024); ??ledcWrite(1, 2048); ??ledcWrite(2, 3072); } void loop(){ } |
在源代码中可以看到:
ledcSetup()函数实现了LEDC控制器的初始化设置。这个函数有三个参数,第一个参数为使用的通道,第二个参数为PWM波形的频率,第三个参数为PWM波形的占空比分辨率。
ledcAttachPin()函数实现了GPIO引脚与LEDC通道的绑定,确定引脚与通道的对应关系。
ledcWrite()函数用于设置通道输出的占空比,第一个参数为通道号,第二个参数为占空比。注意这个占空比的取值不是0~100,而是和占空比分辨率相关,对应的是高电平脉冲的数量。对于12位占空比分辨率来说,这个比率的取值范围在0~4096(2的12次方)之间。
接下来就可以将程序中PWM通道绑定的GPIO引脚切换为控制智能小车运动的8个ESP32引脚了。一次可以输出4路PWM信号,分别绑定到4个轮子的一个驱动端上,可以设置成不同的占空比,看看这4个轮子的转速是不是就有区别了啊?这样就实现了最简单的用PWM波形控制智能小车行驶速度的目的了。
前面介绍了用Mixly生成C语言代码来产生PWM波的方法。接下来介绍一下如何使用MicroPython来实现相同的功能,这两者在实现上是有着一些差别的。所以,下面再来详细介绍一下,首先打开Mixly,选择Python ESP32。
在Mixly的Python开发环境中,默认所有的代码都执行一次,这与C语言的环境是不同的,在C语言中,setup()函数中的代码在启动阶段被执行一次,而loop()函数则会被循环调用。在Python中,如果想实现循环调用,则需要靠自己编写循环的逻辑代码来实现,这一点差别要知晓。
在Python的例子中,只以一个引脚为例,实现一路PWM信号的输出。这个功能需要使用3个功能控件,它们都在“输入/输出”功能模块中。首先,是“初始化PWM模拟输出”功能,在这个功能中,需要指定输出PWM信号的引脚,在管脚中输入25。第二步,将PWM输出的频率设置为10000,最后设置PWM输出的占空比为32768(50%)。在这里需要注意的就是占空比的设置值是在0~65535之间,不再和占空比分辨率这个参数相关,Python进行了统一的转换处理。这样处理的好处是开发者不用关注底层的细节了,Python将其转换为了统一的设置区间,相当于标准化了。而缺点也是显而易见的,这样处理势必增加了一些额外的工作量,会导致机器执行效率的下降。想想之前的ADC是不是也存在同样的处理?
这三个功能设置好的样子如下图所示。
这些功能对应的程序源代码为:
import machine pwm25 = machine.PWM(machine.Pin(25)) pwm25.freq(10000) pwm25.duty_u16(32768) |
在这段代码中,首先是生成一个PWM对象的实例pwm25,生成这个对象实例的参数则为输出PWM波形的引脚对象。然后是PWM对象调用其freq()方法来设置PWM波形的频率。最后是duty_u16()方法来设置占空比,这个方法的后缀u16就表示要在2的16次方的范围内进行设置。如果在Tonny IDE中采用编码来开发,则还有别的设置方法。