
有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。6 w! b, S x& f! _4 M" S 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。# B/ q1 O# T4 o9 Y ![]() % l* V( L6 r* ^# q# M' | 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。( V M4 X! v, h; U0 x3 B, R ![]() ( P w- y0 B: O. i U6 H& r ![]() + J2 L( u" q1 Z8 x0 F) Q- d6 p 资料来源于 IOR 公司数据手册" r4 Y, \, h5 ~: @5 m6 r9 o ; N [8 v% Z' K2 @/ F$ x 我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。 1 G; N% P3 n4 n# H8 Z+ P ![]() $ z o% C8 J) L1 V0 o) T3 _8 T# P 1.TIM模块& `3 p* M: C$ D2 g TIM 模块最重要的三个寄存器是: Counter Register (TIMx_CNT) 计数寄存器' v/ F s, a0 A( M9 V. d Auto-Reload Register (TIMx_ARR) 重置寄存器 6 ~9 I8 f' {, {! ?8 V8 L Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器4 O" A; L" s7 E( p, ~$ Q" U: E ![]() Counter 在时钟的驱动下计数 Auto-Reload 设定计数的最大限制值& U/ O! ]9 K6 s y- z+ q9 O 8 R( y1 t) q! _$ D) ]9 M Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件: N8 l4 ^* h8 W+ K . t5 F6 O t% c: L 在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。 有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。 ! _7 @( o) g% M0 p% R! ^& ~ 所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。3 n+ Z/ U5 ^5 x, |/ Y 0 x4 ~& Z5 ]3 \/ F1 d, V* { 2.代码 我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。 STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx ; c0 I" Q/ O F) i/ b4 |% b. Q; { 这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。 然后把ADC采样的代码添加进来:1 K- Z8 @- B3 ~7 V& z ; X! ` F' a" e! Q& [7 m7 Z6 h Step 1: 6 }+ H; V$ M k# P stm32f0xx_hal_conf.h #define HAL_ADC_MODULE_ENABLED 3 z4 p4 `/ X7 F: P1 h- v) K9 x Step 2:& K4 S$ r7 I' ^, X0 @ main.h, F. |- q4 `5 ~+ s( n$ H ( D3 z( j# @6 }+ W! \3 R6 s 添加ADC相关宏定义 ^6 d$ b" G; r, K# ?! d/ t ![]() / D' k0 }' T I$ A/ e" h& s; I Step 3:' K. y$ O9 o6 k) R9 N9 q stm32f0xx_hal_msp.c9 g5 g+ e0 C" z 添加ADC使用的引脚的初始化代码 - k( E4 G1 [& H' d( g$ i: G ![]() x' \$ G% X, m. e Step 4:( s) y( j; r) H+ [$ X' ~4 h/ j7 C5 C 把ADC的驱动文件添加进工程,在主程序初始化ADC。0 _9 K4 ^, Y' Z& \ ![]() Step 5: 读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。 ![]() * H( a1 J6 ^$ m- \! D- Z" E8 _ \ 如果需要参考代码,可以在 Github 搜索 TopSemic 找到。, I. y: \! t F- }; b |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数