请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0单片机 PWM + ADC 控制有刷电机

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
有刷电机驱动电路
有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。

在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。

20201229152425486.png


下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。

20201229152425562.png



20201229152425807.png



资料来源于 IOR 公司数据手册

我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。

20201229152425648.png


1.TIM模块
TIM 模块最重要的三个寄存器是:

Counter Register (TIMx_CNT) 计数寄存器

Auto-Reload Register (TIMx_ARR) 重置寄存器

Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器

20201229152425708.png


Counter 在时钟的驱动下计数

Auto-Reload 设定计数的最大限制值

Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件

在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。

有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。

所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。

2.代码

我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx

这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。

然后把ADC采样的代码添加进来:

Step 1:

stm32f0xx_hal_conf.h

#define HAL_ADC_MODULE_ENABLED

Step 2:

main.h

添加ADC相关宏定义

20201229152425927.png


Step 3:

stm32f0xx_hal_msp.c

添加ADC使用的引脚的初始化代码

20201229152425911.png


Step 4:

把ADC的驱动文件添加进工程,在主程序初始化ADC。

20201229152426192.png


Step 5:

读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。

20201229152426108.png




如果需要参考代码,可以在 Github 搜索 TopSemic 找到。


收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版