有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。+ y' i0 U) W: A/ l) B+ R$ @2 K 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。% ?3 t" J1 i9 w" c' ^$ _6 o 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。# {; |) M9 h: t% X 0 v5 c: z7 u; | 1 g: \$ P# q& H' t' r: ` 资料来源于 IOR 公司数据手册% z- i$ q" F8 j' A1 Y # p, d8 b) t% f; ~; o/ ^' J 我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。 / m! Y% G9 P/ Z ( c/ \! h8 L% f3 Z 1.TIM模块) |4 S* r( ~( }0 a8 H TIM 模块最重要的三个寄存器是: Counter Register (TIMx_CNT) 计数寄存器 % A7 L0 h# ]2 p# c& _ Auto-Reload Register (TIMx_ARR) 重置寄存器 # K( N0 `2 D+ U! c- P; D1 @ Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器6 h0 T7 K: R e# R6 O0 ?3 a $ Y# `; \6 ^8 f) k5 ] Counter 在时钟的驱动下计数 : k* n8 @/ q3 q8 X2 b Auto-Reload 设定计数的最大限制值# [7 A8 w y5 G/ N; M+ c: o3 ~' s) T$ `6 g Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件" [; l% N0 }' o) s 在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。 有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。 / z; s. W2 l) Y$ V4 S/ g1 F 所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。% B: D! v# G" L2 P Q + d/ E3 ~ T8 s 2.代码 我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。& U& n* i0 r. G# D9 \ STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx 这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。 3 [9 r @: N0 S3 K! y, } 然后把ADC采样的代码添加进来:* G: E2 T$ F ]+ G Step 1:; W' a9 b. ?6 R, m 8 U8 i( C4 G+ H% y stm32f0xx_hal_conf.h 2 P$ @/ B, x4 R2 c" W, g #define HAL_ADC_MODULE_ENABLED " _% g- K/ d. M0 p% v1 u5 n0 R6 M5 _ Step 2: main.h 添加ADC相关宏定义 ( K1 @; R/ A6 Y { Step 3: ; j0 k* j9 a6 E- T" A" Y& A& T stm32f0xx_hal_msp.c 添加ADC使用的引脚的初始化代码7 ?% Q: v' T" n, E+ @2 V / A- @8 b, R# G4 b4 \* Q7 E Step 4:7 a" x5 k3 U) \/ H + ] G0 u0 s3 D9 w* F5 W" | 把ADC的驱动文件添加进工程,在主程序初始化ADC。1 k/ p/ i8 x# `5 @# ?/ S 5 O9 i+ U3 S% G3 Z Step 5:: C$ F9 N+ S( l4 F z0 G8 b1 l 读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。 . O: \4 B9 {# V: e I+ X $ j6 n! z4 A6 p" q( @ I/ O) v0 Q * W/ J$ U d8 `) V, t: O 4 i j7 M+ d( I2 l 如果需要参考代码,可以在 Github 搜索 TopSemic 找到。5 |8 z/ k. `% A7 |" ^ |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数