你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32实例-步进电机的速度控制

[复制链接]
STMCU小助手 发布时间:2023-1-3 17:34

( i& T# Q3 X, e  `$ }' a

项目需求

在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。

: s" W+ A4 F5 e# h, X8 p$ H& H

调整占空比或者调整周期

众所周知,PWM有两个重要参数,周期与占空比。

步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。


9 U5 _5 Z, A- G' `: l# E1 V

周期固定,调整占空比


' [+ \' \1 r% o: L0 s1 b9 o) C


; \+ M2 D/ s- ?$ V1 l/ l

上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整步进电机的速度。因为步进电机的速度仅与PWM的频率有关。


( ]1 J# e- }; C) x

占空比固定,调整周期

- e/ B* o& g0 C7 Y


) ^! V- Z: L  G! Q; F) f

上图中有4个PWM,它们的占空比都固定为50%,却拥有不同的周期。可以看出,即使占空比固定,只要动态调整周期,PWM就能在相同时间内产生数量不同的脉冲。因此,固定占空比,动态调整PWM周期,即可达到控制步进电机速度的效果。

. X8 V& g/ v, H5 f/ Q7 J3 Q& }6 |

基于STM32的实现

在STM32F1中,定时器具有PWM模式,可以用来产生PWM。相关文章:STM32中PWM的配置与应用详解。但是,STM32的PWM模式,只要确定了时基单元(即确定了PWM周期),改变输出比较寄存器,仅可改变PWM的占空比。

若需要改变PWM周期,需不停地改变定时器的时基单元。但时基单元与硬件相关,不适合频繁变更。因此,步进电机的调速,不适合使用STM32下定时器的PWM模式来控制。

在多方查找资料后,确定了一种利用输出比较精确控制PWM周期的方式。


0 h8 S+ x& {! d. C2 [$ @

利用输出比较产生频率可变的PWM

利用输出比较产生频率可变的PWM,原理简单介绍如下:

首先配置定时器时基单元,确定脉冲最小长度单位CK。

然后开启定时器的输出比较,设置模式为翻转模式,并开启输出比较中断。

将定时器内计数器CNT当前值,加上脉冲长度X(单位为CK),写入输出比较寄存器。

在X个CK后,将会触发输出比较中断。同时电平翻转。

在中断中再次将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。

在X个CK后,将会触发输出比较中断。同时电平翻转。

在中断中再次将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。

如此往复……

以此即可得到一个占空比为50%,周期为2X个CK的PWM。

6 ]! P- |8 U1 l5 {% B) _

确定最小单位CK,配置时基单元

首先确定一个最小的间隔CK,规定PWM的高电平长度和低电平长度的单位都是CK。

即高电平的长度一定是CK的整数倍。低电平亦然。

然后配置定时器的时基单元,通过CK的长度确定预分频系数。

已知STM32F103的主频为72MHZ,则时基单元中预分频系数为


! t& t/ E% U. {; L* ~# R- K

PSC = 72M / (1/CK)

例如,rtz所确定的CK长度为10us(0.00001s),即可得出方程。


5 W) L9 P% a( [# v" x$ U


' z$ c# a( f( f) `

预分频系数确定为720后,由高速晶振产生的72MHZ的时钟信号被720分频,得到100000HZ的时钟信号。即时钟信号每秒变动100000次。每次10us。同时可将重装载值设定为0XFFFF(16位定时器的最大值)。因为本次使用的输出比较模式不使用更新中断,该值可随意设置。


( ^9 F- G1 o; c) _* [0 e

TIM_TimeBaseStructure.TIM_Period = 0XFFFF;6 |6 n0 {  }% ~3 L% L8 w! h/ o
TIM_TimeBaseStructure.TIM_Prescaler =720;
# e9 R. n$ {% s* ^# @TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;; R! n" o- x8 V8 A. [
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;% V3 i2 i: M! l7 K, H; ~& {
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


  N: d$ q3 R9 p8 _开启输出比较通道,设置输出比较模式为翻转模式,并配置NVIC,开启输出比较中断,配置输出比较通道:0 p- D0 j! q4 w* p3 v, g5 H
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
0 o8 z: X; ~5 ?% a0 {TIM_OCInitStructure.TIM_Pulse = 500;
2 z4 F9 |; ^& s% c6 Z9 A3 [TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
( O1 Z. U2 e- G/ {6 zTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
& h" w1 ~6 o7 Q; ]' Y9 c0 xTIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;2 D9 R3 N7 ~2 S; l  y8 g' Y
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;1 A: m+ S. y  Y3 r- T
TIM_OC1Init(TIM2, &TIM_OCInitStructure);


: n% R. c" Y5 g4 J8 n开启输出比较中断,配置NVIC优先级:

TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);, P. L( H% m* }+ D4 E
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;& h& h$ I# V  e" f. [$ J
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
2 [- Z+ t0 m7 h# I3 P) ANVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;- o& a5 a" L* B9 n
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;' D( X. U7 Z% e& d6 p( s3 u4 W" E) U
NVIC_Init(&NVIC_InitStructure);

编写中断服务函数3 k9 g" U6 G, i( j$ R+ F' Z7 x( f; Y
在输出比较中断中,唯一要做的事情就是把当前CNT的值取出,加上脉冲长度X,写入输出比较寄存器。1 O. i( b* F! m% k  o6 I/ c6 z
当计数器达到0XFFFF(之前设定的重装载值)后,再加一会自动变为0.; A  ~$ x  P6 z' e8 s! d
例如,当前CNT值为0XFFFF,脉冲长度为5,很明显,输出比较寄存器应设置为0X0004才可触发下一次中断,而不是0X10004,这样会造成溢出。1 v( G5 O, f- ]0 B; r6 w% g' e
因此将CNT的值与脉冲长度相加后,需要取0XFFFF的余数后,再写入输出比较寄存器。

int t_m=5;//低电平和高电平的长度
6 H  L# [9 Q& ?; Avoid TIM2_IRQHandler(void)
0 f( ^* v' n* L2 }6 o. }{+ ], o2 Y* {+ J; J  [
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) {
1 {% H3 G- w6 L5 p( {TIM_SetCompare1(TIM2,(TIM2->CNT+t_m)%0XFFFF);: ~' ~* s  l; r6 |5 o0 _9 x
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);% N* [1 U" Y9 Z3 b0 [. A4 W  P
}1 a6 q2 M! ^6 l% y5 J7 r
}

动态调整中断服务函数中的变量t_m,即可达到修改PWM频率的效果。

; Z( t2 Q2 \; K  J) h( F% D! v

转载自:infinigo


  [; i# b/ R$ w: E) Y/ ~
收藏 评论0 发布时间:2023-1-3 17:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版