有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。 / ^3 ]7 v$ C. [5 }/ f 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。, t: C. F- A. e' R9 Z; O3 a ! V0 i: v. H j$ y3 j; ?: i+ i7 I: B * ]$ g6 \. X* U! g; v& F 4 A, M, }- u) c2 s; y+ r 0 Z) }; t$ @+ ]5 ?& S1 M 资料来源于 IOR 公司数据手册; y, p2 K$ f ]* k , k8 [; k+ k2 R$ Z" { 我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。 ( j/ v6 y7 T' u! y 1.TIM模块 TIM 模块最重要的三个寄存器是:0 z/ w% a- n& R- A , l& h# p* ?+ B& \" X9 _ Counter Register (TIMx_CNT) 计数寄存器 Auto-Reload Register (TIMx_ARR) 重置寄存器; v% w/ i9 G6 c Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器 - c, V& ~: t6 s, }- {4 D( I Counter 在时钟的驱动下计数 h) c2 s# i# n# Y6 S Auto-Reload 设定计数的最大限制值3 x* A& \$ H6 b( g, `# X# X p5 E8 W ! l# Q( Z; ^! U9 t' `7 m Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件 0 H Y+ r0 E7 c0 J$ r 在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。9 s$ c1 P h0 F( Z : q6 Z% \# R2 s' x4 o I 有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。 所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。 & u, v7 J7 C1 e- l, J 2.代码( k y K. f# |, o, C 我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。6 o5 J4 f" a$ L+ @ STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx9 u- _- U d. J# A) { 这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。 * N# i" z' U2 i- @. h5 _% `+ G, k6 v 然后把ADC采样的代码添加进来: " z0 S8 I+ F U5 Y+ U Step 1: stm32f0xx_hal_conf.h6 h0 j* Y5 p' } ^$ [ #define HAL_ADC_MODULE_ENABLED Step 2: main.h1 D6 x+ N5 L) e- V( u$ f 添加ADC相关宏定义 + [* E3 J- h P1 j I! j- Q( h ( y. A7 P! ^- Y0 c8 Y Step 3:8 e7 e: j5 A7 ^4 L3 l stm32f0xx_hal_msp.c 添加ADC使用的引脚的初始化代码% \2 Z- Y& f4 _( ]0 S8 u% q ; {' _) G, {. y) ]8 r Step 4:( B2 ~# r' K) _ : i( u3 |( H) m, o, K: k0 _ 把ADC的驱动文件添加进工程,在主程序初始化ADC。 " b3 `6 n" Y0 p Step 5: 读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。) j) u4 k: O) f; ~ ) w9 W- z" M- h, F# v6 \7 b 6 F# C2 W) w9 U, m1 M: j 如果需要参考代码,可以在 Github 搜索 TopSemic 找到。0 g7 ?0 N* G2 l3 V & D6 t/ \/ y- s0 B+ r/ q1 u |
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数
【经验分享】STM32F1之定时器
【经验分享】【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用