stm32 pwm输出_STM32之PWM

脉冲宽度调制

脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效且应用十分广泛的技术,例如直流电机的控制、开关电源的输出调制、信号的传递也离不开脉冲宽度调制。

  我们接下将要讨论的便是单片机中PWM的产生与应用。在STM32单片机中,以F103C8为例,它共有四个定时器,每个定时器有四个PWM输出通道,TIM1为高级定时器,除了正常的四路PWM输出外,前三路还可以有与之互补的PWM输出,并且带有死区控制,可以用于电机控制。

   本文在介绍PWM使用的同时,顺便推广一波STM32CubeMX的应用。

7c8fb757140f59e39f6e01138ffb8dae.png

相信对于很多新手来说,上来就了解工程的配置和单片机一些寄存器的配置是比较吃力的。即便是一些老手也不一定完全了解整个单片机MDK文件工程的配置,一直在套用类似于模板的东西,遇到新型的单片机便是心有余而力不足,并且现在官方标准库也是停止更新了,对于一些新型的单片机是不支持的,而STM32CubMX便可以很好的解决这个问题。即便是新手,也可以轻松学会单片机整个工程文件的配置,也能为后期的寄存器进一步学习打好基础。本文便以PWM呼吸灯程序为例,使用STM32CubeMX进行相关外设的配置和MDK工程文件生成。

在打开软件之后,点击File,选择新建工程,然后在跳出的对话框中选择STM32F103C8(本文以此单片机为例),然后点击Start Project。

d7ad9472686a41635ddf0bd9393cfcd7.png

首先点击时钟RCC页面进行配置,由于小编使用的板子为外部时钟,(虽然STM32单片机大多提供内嵌RC振荡电路,但是其精度经出厂校准后也只有1%,而外部晶振一般在10^-5甚至更低)所以选择在高速时钟选择Ceramic Resonstar,没有使用低速时钟所以默认失能,其它配置默认参数。

1c80add25a35233a78702fa5bf8c50fa.png

接着进行SYS配置,Debug模式选择Serial Wire(小编用的是SW,与个人硬件配置有关),其它默认配置。

8fe442ba3e3476f31b9d82ab1e4c81c0.png

       再接着配置时钟树,相信大多数没有使用过Cube的小伙伴对于时钟树的理解可能比较抽象,但是看看下图时钟树界面,整个世界亮了有木有。

        按照下图所示选择8M外部晶振,经过锁相环后倍频为9倍(小编的板子是外接的8M晶振,并且此单片机最高频率72M),然后接着给各个时钟线进行分频,当哪个时钟框变紫色则说明超过这个时钟线的最大频率,我们把各时钟线均配置为最大频率。(在不考虑低功耗的情况下,均选择其性能最佳频率)

6b8fccc0e6f60f96f5e53300f5827794.png

在配置完了时钟树之后,就可以配置定时器了,小编的LED是挂在PA6引脚的,拉低引脚电平灯亮。所以单击右侧单片机上的PA6引脚,选择其所在的定时器3通道1,在配置框内通道1选择生成PWM,然后在下面进行参数配置,定时器的分频和装载值填写在前期的推送中已经讲过,这里把定时器周期配置为1ms,具体不再赘述。下面有关PWM输出配置:PWM模式和通道极性,它们的作用如下图所示。

503232eb32b761a19ed05e8d97406d5c.png 166db27dfdc7b9cb5871755dc53888d4.png

接着在中断配置页面使能中断。

12b1ff6954f04b91b9617a5efbce1f8a.png

在这里点亮一个呼吸灯的相关端口配置就结束了。在GPIO窗口界面我们还可以看到,当单片机某个引脚被配置为PWM输出后,这个引脚就被默认配置为推挽输出功能,由于是默认配置,下面就不放图了。最后进行工程文件设置。

来到工程管理页面,首先进行工程命名,然后选择工程保存地址,再选择IDE。(本文以KEIL,也就是MDK工程文件)再进一步可以看到每个端口配置可以选择其所使用的函数库,我们默认使用HAL库。在基础设置全部配置完毕之后,点击右上角生成代码就OK了。第一次生成F1系列工程文件,还需要下载一个固件包,按照提示,点击确定就可以了。

到这里端口配置和工程生成就大功功告成了,有木有感觉很简单???

41f8045a2c33310962d1d53cf6c733f1.png

(本文所示意的配置均为最基础配置,其它的没有提到的配置选项和功能还有很多,除了基础功能之外,它甚至可以根据你的配置估算单片机的功耗。对于未提到的单片机配置选项,可以自行查看单片机参考手册探索配置,对于未提到功能,感兴趣可以百度尝试食用。)

配置完成之后用KEIL打开工程,可以看到所有配置好的的初始化已经放在了相应的位置,只需要开启使用便可以了,本实验中我们用到了定时器3和它的PWM1输出通道,开启输出。

4185cba1599a7aa960616beda1f5d4a7.png

       接着书写呼吸灯程序,由于程序单一,便直接写在中断了。

        我们通过num这个变量来不断改变输出PWM的占空比。由我们配置可知,在计数寄存器TIM3->CNT未计到TIM3->CCR1的比较值之前,PWM输出为高电平,LED灭,之后输出低电平,LED亮。呼吸灯可以划分为灯由亮到暗和由暗到亮两个过程。在本程序中,我们使用flag变量标志灯所处在亮过程还是暗过程,num由0-999循环,控制PWM输出有效电平的占空比随之加长或变短,就形成了灯的呼吸效果。本文生成的呼吸灯周期为2s.(有一点需要注意,自己书写的代码必须放在工程中规定的地方,就是各种BEGIN和END之间,否则再次使用Cube进行配置后未放在指定位置的代码将被清理)

1a551242fe2c1def462bcb3b6cdeb579.png

640?wx_fmt=gif

    要更好的呼吸效果和方式,可以自行探索哦!

        STM32CubeMX软件可以从STM32官网免费获取!

        点击文章末尾阅读原文可获取完整工程文件百度云链接。

        由于作者水平有限,难免有错漏之处,欢迎在公众号后台留言指出。

82f1b3187673395c3f9e3a938eaca043.png ff7e95be9c3fcd3dbe4e4057bfbc0a3c.png 82f1b3187673395c3f9e3a938eaca043.png

欢迎关注我们!!!

083969fc0e0770532afecc901cba38b6.png

微博

195c275d77d13f9b274f75e77e762cc8.png

B站

4260a48e1002a14097f0cc99ea0ab810.png

公众号

4025a2ab9b2d958d9b1e9390439345b8.png

QQ群

ACTION

诚邀赞助

联系邮箱:neu_action@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值