[NUCLEO-F412ZG试用体验] 八、多路PWM输出实验
PWM多用于利用其信号高低电平的宽度不同产生的占空比[高电平时间/(高电平时间+低电平时间)]来控制:直流电的电压大小、舵机的偏转角、脉冲输出、时序控制、等等。本实验先设计编程产生两路PWM,利用示波器来观察PWM的波形输出。先打开PwmOut.h文档,其中的例子如下:* #include "mbed.h"
*
* PwmOut led(LED1);//定义PWM对象和类
*
* int main() {
* while(1) {
* led = led + 0.01;//led值增加0.1
* wait(0.2);
* if(led == 1.0){//为1时,清除位0,重新开始
* led = 0;
* }
* }
* }
查看PinNames.h,PWM1,PWM2输出分别为PA_6,PA_7,在查看用户手册的图,PA_6,PA_7在右边CN7外侧PIN6,PIN7,下边开始编程:
在定义对象的下边加上两行:
PwmOut pwm0(PA_6);
PwmOut pwm1(PA_7);
在变量定义的浮点数中添加:
,dut0=0.100f,dut1=0.002f,ddu0=0.04f,ddu1=0.001f
其中dutx表示PWM周期运算值,ddutx表示周期增加的量;我们将两个设置的都不一样。实际上周期不同、基础设置、增量都不一样。
在ioInit()函数中增加两行:
pwm0.period(0.002f);//PA_6定义PWM周期-两个不一样
pwm1.period(0.001f);//PA_7
在dispBase()函数中增加显示PWM周期变化的固定ASCII码:
c2l(3,0,48);c2l(3,1,55);c2l(3,2,45);c2l(3,3,16);c2l(3,4,26);//PWM0:
c2l(3,10,48);c2l(3,11,55);c2l(3,12,45);c2l(3,13,17);c2l(3,4,26);//PWM1:
再在dispMed()函数中添加PWM周期数值改变后的显示结果:
c2l(3,5,16+int(dut0*10)%10);c2l(3,6,16+int(dut0*100)%10);c2l(3,7,16+int(dut0*1000)%10);c2l(3,8,16+int(dut0*10000)%10);
c2l(3,15,16+int(dut1*10)%10);c2l(3,16,16+int(dut1*100)%10);c2l(3,17,16+int(dut1*1000)%10);c2l(3,18,16+int(dut1*10000)%10);
转换就不讲解了,同上一实验。
在主函数main的循环体while适当位置添加一下2句:
if(dut0<0.840f){dut0 +=ddu0;}else{dut0=0.30f;} pwm0=dut0;
if(dut1<0.90f){dut1 +=ddu1;}else{dut1=0.10f;} pwm1=dut1;
完成后编译下载,看看结果,见照片81,图82。示波器显示2路PWM输出波形见照片83,84。实际上此实验已经接近完成了模拟灯光控制了。由于按键程序没有删除,因此,按键后LED1~3还是会改变的。
页:
[1]