STM32实现:步进电机的速度控制

发布者:chunxing最新更新时间:2024-04-02 来源: elecfans关键字:STM32  步进电机  速度控制 手机看文章 扫描二维码
随时随地手机看文章

项目需求

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


调整占空比或者调整周期

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

周期固定,调整占空比

fe693d5c-8273-11ed-8abf-dac502259ad0.png?imageView2/2/w/1000

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

占空比固定,调整周期

fe7c1b84-8273-11ed-8abf-dac502259ad0.png?imageView2/2/w/1000

    上图中有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),即可得出方程。

fe904abe-8273-11ed-8abf-dac502259ad0.png?imageView2/2/w/1000


   预分频系数确定为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频率的效果。


关键字:STM32  步进电机  速度控制 引用地址:STM32实现:步进电机的速度控制

上一篇:详解stm32的定时器8输出PWM
下一篇:STM32 CAN总线传输波特率的计算

推荐阅读最新更新时间:2026-03-20 16:51

stm32单片机教程实例-步进电机速度控制
  项目需求      在制作一个使用全向轮的机器人底盘,对于全向轮,的精度是影响效果的重要因素。所以使用了,使用步进电机的优点是可以不使用,开环控制即可达到高精度的效果。 调整占空比或者调整周期      众所周知,PWM有两个重要参数,周期与占空比。     步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比     上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产
[机器人]
步进电机控制器怎么调速度
引言 步进电机是一种将电脉冲信号转换为角位移的电机,具有控制精度高、响应速度快、结构简单等优点。在自动化设备、机器人、数控机床等领域得到了广泛应用。步进电机控制器是实现步进电机控制的关键部件,通过调整控制器的参数,可以实现步进电机的速度调节。本文将详细介绍步进电机控制器的调速方法,包括脉冲频率、电流设置、细分设置等方面的内容。 步进电机的基本原理 步进电机的工作原理是将电脉冲信号转换为角位移。当控制器向步进电机发送一个脉冲信号时,步进电机的转子就会按照一定的步距角进行旋转。步距角是指电机转子每接收到一个脉冲信号所旋转的角度,通常以度或弧度为单位。步进电机的转速与脉冲频率成正比,即脉冲频率越高,电机转速越快。 步进
[嵌入式]
plc如何控制步进电机速度和方向?
plc作为一种工业控制计算机,具有模块化结构、配置灵活、高速的处理速度、精确的数据处理能力、PLC对步进电机也具有良好的控制能力,利用其高速脉冲输出功能或运动控制功能,即可实现对步进电机的控制。 对于那些在运行过程中移动距离和速度均确定的具体设备,认为采用PLC通过步进电机驱动器来控制步进电机的运转也是一种技术方案。 步进电机的特点: (1)步进电机的角位移与输入脉冲数严格成正比,电机运转一周后没有累积误差,具有良好的跟随性。 (2)由步进电机与驱动器电路组成的开环数字控制系统,既非常简单、廉价,又非常可靠。同时,它也可以与角度反馈环节组成高性能的闭环数字控制系统。 (3)步进电机的动态响应快,易于启停、正反转及变速。 (
[嵌入式]
基于STM32单片机的控制步进电机实验
一、实验原理(以28BYJ48步进电机为例)和51控制步进电机原理一致 1、五线四相步进电机,不同线圈得电会让步进电机的转子转动一个角度,按一定规律给不同的线圈通电,就可以让步进电机连续转动,下表就是步进电机和拆解后的图片,以及四根线通电的顺序。 注:总共五条线,一个是VCC,剩下四条分别接上ABCD相。 2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转、异常震动。 3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行,转向用了一个枚举类型,控制转向。 4、单片机IO口和电机四条线连接时,一定不能错误,要按照顺序相连接。 5、调换
[单片机]
基于<font color='red'>STM32</font>单片机的<font color='red'>控制</font><font color='red'>步进电机</font>实验
STM32步进电机PID速度环控速源码
【1】例程简介 使用定时器功能输出PWM信号到步进电机驱动器,使其驱动步进电机转动。 编码器用于电机测速。在电机转动一圈时编码器可以输出固定的脉冲数,通过读取编码器 脉冲可以获取当前电机转动状态。 一般处理编码器脉冲有两种方法: 1.T法:计算一定量的脉冲数所用的时间 2.M法:计算一段固定时间内所捕获的脉冲数。 根据当前速度和目标速度之间的误差,使用PID计算定时器输出的脉冲频率,使得滑台能够以目标速度 运动 【2】跳线帽情况 编码器 A相 -- PC6 B相 -- PC7 步进电机驱动器 DIR- -- PB13 ENA- -- PB14 P
[单片机]
STM32控制步进电机源代码
单片机源程序如下: #include stm32f10x.h #include stm32f10x_rcc.h #include misc.h void RCC_Configuration(void); void GPIO_Configuration(void); void ZhengZhuan(u16 tt); void FanZhuan(u16 tt); void delay_ms(u16 nms); /**************************************************************************** * 名 称:int main(void) * 功 能:
[单片机]
<font color='red'>STM32</font><font color='red'>控制</font><font color='red'>步进电机</font>源代码
STM32 PWM输出控制步进电机-3000转每分钟串口显示+电位器调速
用电位器控制步进电机转速,可以控制正反转,在电位器中点停止;越往左翻转越快,越往右正转越快。速度均匀,包含滤波。付完整代码。全部测试正常。 单片机源程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include timer.h #include adc.h int main(void) { u16 adcx; float temp; int a=3999; //int b=0 u16 led0pwmval=200; u8
[单片机]
STM32用PWM实现步进电机的正反转
2019年7月23日 做小车的第三天。 利用可调的PWM脉冲实现步进电机的正反转,思路大致是:利用TIM3(STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出)的两个通道输出两道PWM脉冲,控制电机的高低电平以实现电机的正反转。 代码如下: #ifndef __TIMER_H #define __TIMER_H #include “sys.h” /**************************************************** 在下面的宏定义中 作用是起一个连接语句的作用意思是用 IN(a) 代表后面的if else语句。 #define IN1(a) if (a) GP
[单片机]
<font color='red'>STM32</font>用PWM实现<font color='red'>步进电机</font>的正反转
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved