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[D12],PIN7[D11],下边开始编程: 在定义对象的下边加上两行: 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还是会改变的。 |