打印
[STM32F4]

【Nucleo-F413ZH创想】 实验五 2路PWM输出实验

[复制链接]
988|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2017-1-27 20:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【Nucleo-F413ZH创想】 实验五 2路PWM输出实验
此次实验开始,简化MBED实例,不打印出来,直接分析应用。
先打开STM32 NUCLEO-144 F413 Board User manual.pdf,查看P35右上的管脚分布对应板子的右上印字可以的到,相对于Arduino输出的6个PWM口为:PA_6,PA_7,PD_5,PE_9,PE_11,PE_13,我们选择其中的两个即可选择PA_6,PA_7两个口。
打开PwmOut.h,上边对象定义为led,我们直接定义PWM0,PWM1
在定义对象类区域增加:
PwmOut pwm0(PA_6);
PwmOut pwm1(PA_7);
pwm0或pwm1为对象实例名称,用PA_6,PA_7两个GPIO口作为PWM输出,原因是我的板子这两个口挨在一起,连接双色LED查看方便。
再在变量定义区的浮点以后边增加以下几个变量:
,dut0,dut1,ddt0=0.005f,ddt1=0.01f
将这4个变量写到val1的后边,dut0,dut1表示PWM周期,ddt0,ddt1表示周期变化增量。因为pwm0和pwm1是对象,不能直接参与运算!
将下边的定义PWM周期的函数罗列在ioInit函数中:
pwm0.period(0.002f);//pwm0周期
pwm1.period(0.001f);//pwm1周期
这样在主函数的循环体内增加以下语句:
if(dut0>0.810f){dut0=0.150f;}
dut0 +=ddt0;pwm0=dut0;
if(dut1>0.950f){dut1=0.050f;}
dut1 +=ddt1;pwm1=dut1;
再在dispBase中增加以下语句:
c2l(3,0,48);c2l(3,1,55);c2l(3,2,45);c2l(3,3,26);//PWM:
c2l(3,10,48);c2l(3,11,55);c2l(3,12,45);c2l(3,13,26);//PWM:
在dispMes中增加以下语句:
c2l(3,4,16+int(dut0*10)%10);c2l(3,5,16+int(dut0*100)%10);c2l(3,6,16+int(dut0*1000)%10);c2l(3,7,16+int(dut0*10000)%10);
c2l(3,14,16+int(dut1*10)%10);c2l(3,15,16+int(dut1*100)%10);c2l(3,16,16+int(dut1*1000)%10);c2l(3,17,16+int(dut1*10000)%10);
显示3位就够了。又隔了一行显示,肯定将来有用的。编译下载后结果见照片图51。其中的LED是双向红绿LED,因为两路PWM周期不一样,会形成红绿交渐亮暗的。双踪示波器看到的实际波形见图52。

51-1路计数器2路ADC2路PWM.JPG (514.05 KB )

图51

图51

52-2路PWM波形.JPG (535.3 KB )

图52

图52
沙发
hhxf1| | 2017-1-27 21:17 | 只看该作者
写得不错哟,学习啦!**年大吉!

使用特权

评论回复
板凳
zhuotuzi| | 2017-1-28 09:09 | 只看该作者
好用,这个收藏了,我试试每一路都不同能否输出8路。

使用特权

评论回复
地板
619888476| | 2017-1-28 14:30 | 只看该作者
非常不错

使用特权

评论回复
5
hellosdc| | 2017-1-28 18:35 | 只看该作者

使用特权

评论回复
6
hellosdc| | 2017-1-28 18:38 | 只看该作者
定时器直接不能直接实现?

使用特权

评论回复
7
zhjb1|  楼主 | 2017-1-28 21:14 | 只看该作者
hellosdc 发表于 2017-1-28 18:38
定时器直接不能直接实现?

定时器没有输出口,直接输出不了,需要控制其它作为伪口输出。除非将定时器作为时钟输出,那就可以,制定IO就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

70

主题

303

帖子

1

粉丝