有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。 4 N$ J) N0 J+ q 6 p. @+ [& q/ S+ G; }3 B ' j7 |/ H0 w" U9 w- G9 O 资料来源于 IOR 公司数据手册2 \& H& C& {5 C i9 o4 { z9 L- E6 E$ @* h 我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。 ( ?0 }/ |6 G9 n4 P 5 O s l* H; Z* @8 o 1.TIM模块. _, @! {8 I/ r. |* y' w TIM 模块最重要的三个寄存器是:* }8 y; L8 E! w& z& W , G7 i! P2 `; }8 }" ] Counter Register (TIMx_CNT) 计数寄存器 Auto-Reload Register (TIMx_ARR) 重置寄存器4 E5 N3 G& E; X8 c1 `3 D Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器4 J; z+ o" j( F # w2 @% p- V7 ^/ N# T: T ; ^& {' a; c5 R/ j0 b7 H$ X- _ Counter 在时钟的驱动下计数: [% F: F! |9 `& ~7 c- o2 z6 f Auto-Reload 设定计数的最大限制值/ {6 h0 i/ @5 _" s 9 e/ K% a7 b2 J$ l* ?$ k Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件# f4 e* ~4 A! J 在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。* r, D% h3 G% I1 Y 有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。! H2 v% ^' b0 s! k1 g 所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。 2.代码0 H9 T1 W: D! d5 L, e/ ?, [- N : u" n! R4 h2 h: h5 f7 }% K; q 我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。 & I% s. M: Y: X( f: M" f. U STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx& u. {8 N/ I- f# n! x+ s8 R# S , f' O; Q, Y; x- O. n6 R 这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。 . \; n' D, @6 u- y9 j 然后把ADC采样的代码添加进来:( X. _* Y* b- L7 a% S: O: S Step 1: 2 v' w0 | `, b% z: k- s e& v stm32f0xx_hal_conf.h( j. q3 M8 h ]+ y6 N , M: `5 P& y7 T #define HAL_ADC_MODULE_ENABLED' j$ q* @9 l6 g1 Y; X" r Step 2: main.h$ d# ~/ R4 r, _, T9 j# k) v 添加ADC相关宏定义 Step 3:8 p& x8 b. U' o5 A4 L/ K 0 p! ~) a- i2 l7 ]# d. _ stm32f0xx_hal_msp.c $ J' M7 @7 U+ W* d8 j 添加ADC使用的引脚的初始化代码 # x; @9 Y9 I) Y : y2 C6 u: g8 R3 D7 R8 ], s Step 4:: ], a/ g9 @$ b% n9 x3 F. T # W1 }( }3 O4 b9 r% a3 R 把ADC的驱动文件添加进工程,在主程序初始化ADC。 $ a/ g' p6 k! V Step 5:) V; E. N; h6 f 读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。 % r% o+ ]" n l6 W: m' [! F$ { Q4 e) u, \5 K) p* p 7 D: B' n4 X( c2 X$ W) f 如果需要参考代码,可以在 Github 搜索 TopSemic 找到。 + Q1 Z' w: N# t: n6 ^/ f) e |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数