STM32实操教学:步进电机速度控制大揭秘
单片机与嵌入式 2024-05-29


项目需求

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

调整占空比或者调整周期

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

周期固定,调整占空比


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

占空比固定,调整周期


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

基于STM32的实现

在STM32F1中,定时器具有PWM模式,可以用来产生PWM。相关文章:STM32中PWM的配置与应用详解。但是,STM32的PWM模式,只要确定了时基单元(即确定了PWM周期),改变输出比较寄存器,仅可改变PWM的占空比。
若需要改变PWM周期,需不停地改变定时器的时基单元。但时基单元与硬件相关,不适合频繁变更。因此,步进电机的调速,不适合使用STM32下定时器的PWM模式来控制。
在多方查找资料后,确定了一种利用输出比较精确控制PWM周期的方式。

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

利用输出比较产生频率可变的PWM,原理简单介绍如下:
首先配置定时器时基单元,确定脉冲最小长度单位CK。
然后开启定时器的输出比较,设置模式为翻转模式,并开启输出比较中断。
将定时器内计数器CNT当前值,加上脉冲长度X(单位为CK),写入输出比较寄存器。
在X个CK后,将会触发输出比较中断。同时电平翻转。
在中断中再次将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。
在X个CK后,将会触发输出比较中断。同时电平翻转。
在中断中再次将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。
如此往复……
以此即可得到一个占空比为50%,周期为2X个CK的PWM。

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

首先确定一个最小的间隔CK,规定PWM的高电平长度和低电平长度的单位都是CK。
即高电平的长度一定是CK的整数倍。低电平亦然。
然后配置定时器的时基单元,通过CK的长度确定预分频系数。
已知STM32F103的主频为72MHZ,则时基单元中预分频系数为

PSC = 72M / (1/CK)

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

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

TIM_TimeBaseStructure.TIM_Period = 0XFFFF;TIM_TimeBaseStructure.TIM_Prescaler =720;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

开启输出比较通道,设置输出比较模式为翻转模式,并配置NVIC,开启输出比较中断,配置输出比较通道:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_Pulse = 500;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM2, &TIM_OCInitStructure);

开启输出比较中断,配置NVIC优先级:

TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

编写中断服务函数

在输出比较中断中,唯一要做的事情就是把当前CNT的值取出,加上脉冲长度X,写入输出比较寄存器。
当计数器达到0XFFFF(之前设定的重装载值)后,再加一会自动变为0.
例如,当前CNT值为0XFFFF,脉冲长度为5,很明显,输出比较寄存器应设置为0X0004才可触发下一次中断,而不是0X10004,这样会造成溢出。
因此将CNT的值与脉冲长度相加后,需要取0XFFFF的余数后,再写入输出比较寄存器。

int t_m=5;//低电平和高电平的长度void TIM2_IRQHandler(void){if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { TIM_SetCompare1(TIM2,(TIM2->CNT+t_m)%0XFFFF); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); }}

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


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 模拟
  • 模电
  • 运放
  • 放大
  • 压力传感器调试常见问题有哪些?

    变送器由测量部分、放大器和反馈部分组成,变送器是基于传感器实现的。因为变送器具备测量部分,所以变送器可属于测量仪器范畴。为增进大家对变送器的认识,本文将对变送器和液位传感器的区别,以及液位变送器的种...

    昨天
  • 2.

    压力变送器是在工业中常用的一种器件,但是并非所有人对压力变送器都较为熟悉。为增进大家对压力变送器的认识,本文将对压力变送器和压力表的区别以及压力变送器的主要注意事项予以介绍。如果你对压力变送器具有兴...

    昨天
  • 三分钟了解4种不同类型的ADC

    ADC也就是模拟数字转换器,对于ADC,我们通常也会称其为A/D转换器。为了增进大家对ADC的认识,本文将对逐次逼近型ADC、积分型ADC、并行比较ADC、压频变换型ADC进行详细阐述,以帮助大家了解这几种不同类型ADC之间的...

    昨天
  • ∑-Δ型ADC和流水线型ADC了解

    ADC的使用,能够帮助我们将模拟信号转化为数字信号。在上篇文章中,小编对4种不同类型的ADC进行了详细阐述。为增进大家对ADC的认识,本文将对∑-Δ型ADC和流水线型ADC予以介绍。如果你对ADC具有兴趣,不妨继续往下阅...

    昨天
  • SAR ADC模拟输入信号类型

    对于ADC,很多朋友都很了解。在小编身边,便存在好几个ADC大佬。如果你还不是一个精通ADC的大佬,可要认真学习了哦。为了增进大家对ADC的认识,本文将对不同SAR ADC模拟输入架构予以介绍。如果你对ADC具有兴趣,不...

    昨天
  • 想学好电路,这些基础基础模块电路一定要看懂!

    下面的五副电路图,你能看懂几个?

    昨天
  • 巩固一下,三极管应用电路

    学习模拟电路时少不了学习三极管,过往老师的谆谆教诲已经忘记,今天再来巩固一下

    昨天
  • 抖动和抖动测试专题介绍

    如果要评选电子工程师近20年来的最耳熟能详的专业词汇,眼图和抖动作为孪生姊妹一定在前10之列。

    06-14
  • 在运放的输出环节,应连接至同相端或反相端?

    为什么该电路中运算放大器的输出接到了同向输入端,而不是一般常看到的反向输入端,今天终于想明白了。因此,本文的内容就是先把这个问题讲清楚。

    06-14
  • 阻抗匹配大揭秘:原理、方法与实用技巧一网打尽

    PCB上传输线的电子模型示意图阻抗匹配(Impedance matching)是微波电子学里的一部分,主要用于

    06-14
  • 详解运放七大电路设计应用

    运放的基本分析方法:虚断,虚短。对于不熟悉的运放应用电路,就使用该基本分析方法。

    06-14
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告