有刷电机驱动电路* ~" O L5 D: L, b8 m 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。 3 i+ G! D3 |6 J2 O( x$ ?( a0 z 3 q) E) \' ~0 m% J, ^6 Q& r3 o 资料来源于 IOR 公司数据手册 我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。 1.TIM模块6 P- T w8 E5 w; u TIM 模块最重要的三个寄存器是: : W" k1 _8 `8 J3 Z' V Counter Register (TIMx_CNT) 计数寄存器3 j* a( k- [% M) Q- L' S. E' k( d 9 p# Q' T- C, c2 W0 K$ c/ H Auto-Reload Register (TIMx_ARR) 重置寄存器 + {% L6 J" x6 Y0 {6 D* U0 o Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器 , B" p4 A$ h9 V- X Counter 在时钟的驱动下计数. T% r8 g8 ~0 {6 W0 t1 n+ [# c; L" z 9 B' O2 @+ ^" R4 s; e Auto-Reload 设定计数的最大限制值4 z3 M) G! H* j3 G& k* d 2 X F3 F* P; B* p5 ^0 `+ ` Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件8 s" k! R5 ?$ t6 |5 i" \) t 在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。/ H) }6 @4 L, f: ^ 有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。9 n4 h6 d$ T2 Y& J 所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。1 H3 x. @7 ?! T ` 2.代码& \0 `8 D1 Z" u . e/ c9 ]+ s L" }0 s1 Z4 ? 我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。8 Y3 d8 W5 T7 |. {" I% V * {- N+ r, {8 x. ^ STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx + x4 B9 w2 l* \* }% y. D$ N- P 这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。3 l$ [8 I" h- w 然后把ADC采样的代码添加进来:% B3 O! F/ W5 | Step 1:( Z/ U, R2 ?3 v% G8 Q1 ^ stm32f0xx_hal_conf.h 3 o4 o: U8 @! V #define HAL_ADC_MODULE_ENABLED4 |7 ~3 w# V: V2 L0 n+ o: h Y Step 2: . L( b% o2 f- @ main.h 添加ADC相关宏定义 1 l. {- u; ~. f; |* x7 [6 v # I- h/ A# K# K* l7 @+ j* N) K Step 3:. S: {9 O3 Z0 i- D' p7 P ' C( O3 `& B6 \0 G9 t& p stm32f0xx_hal_msp.c, g* k, [1 r4 P2 ]! Q( V , V% |. D8 o1 i& C: ^' T0 v 添加ADC使用的引脚的初始化代码 $ T7 L( ]) c/ P( h- m Step 4: ) n4 p* w9 D, s# o; ? 把ADC的驱动文件添加进工程,在主程序初始化ADC。* V F$ g" |6 a" \ % t' \/ [/ u o& W# |5 D Step 5: 3 C1 _% D( j* L+ C 读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。 2 I J P9 J3 V& n @ - `8 E: d! r$ A5 v1 n 如果需要参考代码,可以在 Github 搜索 TopSemic 找到。 2 @) a, W3 o- L$ O' [ |
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数
【经验分享】STM32F1之定时器
【经验分享】【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用