0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32的步进电机速度控制

STM32嵌入式开发 来源:搜狐网 作者:搜狐网 2020-09-23 10:51 次阅读

项目需求

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

调整占空比或者调整周期

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

周期固定,调整占空比


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

占空比固定,调整周期


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

基于STM32的实现

在STM32F1中,定时器具有PWM模式,可以用来产生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)。即可得出方程

PSC = 72M / (1/0.00001)=72000000/100000=720

预分频系数确定为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
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348733
  • 步进电机
    +关注

    关注

    149

    文章

    2929

    浏览量

    146060

原文标题:STM32实例-步进电机的速度控制

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    步进电机速度控制

    步进电机速度控制方法步进电机是将电脉冲信号转变为角位移或线位移的开环
    发表于 01-11 15:02

    基于Stm32F407的多路步进电机速度控制函数

    应学弟们的要求特意将步进电机速度控制函数完善。重点: 这里只是速度控制函数, 没有加减速曲线!
    发表于 06-29 06:52

    stm32控制步进电机速度

    stm32控制步进电机速度,利用stm32控制
    发表于 07-08 07:29

    步进电机的线速度控制资料下载

    步进电机的线速度控制资料下载,1. 介绍这篇应用笔记描述怎样去实现步进电机的线
    发表于 07-08 08:39

    步进电机速度控制及运动规律

    步进电机速度控制及运动规律 步进电机区别于其他控制
    发表于 09-17 15:07 9108次阅读
    <b class='flag-5'>步进</b><b class='flag-5'>电机</b>的<b class='flag-5'>速度</b><b class='flag-5'>控制</b>及运动规律

    STM32控制步进电机插补法画直线

    使用STM32编程序控制两相步进电机实现简单的直线插补。
    发表于 11-09 14:20 192次下载

    基于STM32步进电机转速控制实验设计

    基于STM32步进电机转速控制实验设计
    发表于 09-28 16:00 79次下载
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b>转速<b class='flag-5'>控制</b>实验设计

    基于STM32步进电机控制系统

    摘 要 本文的主要工作是基于STM32步进电机控制系统的设计。随着越来越多的高科技产品逐渐融入了日常生活中,步进
    发表于 11-27 18:49 91次下载

    使用PLC如何控制步进电机速度与方向

    步进电机是一种很常见的动力元件,步进电机可以很方便的由控制系统控制速度与转动方向。那么使用PL
    的头像 发表于 02-16 22:37 2w次阅读
    使用PLC如何<b class='flag-5'>控制</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b>的<b class='flag-5'>速度</b>与方向

    基于DSP的步进电机速度控制系统

    本文步进电机原理及DSP控制方法,进行了步进电机速度控制
    发表于 06-07 09:11 28次下载

    stm32F4 定时器中断 + 步进电机控制控制四线两相步进电机 (初级版本)

    引出MCU是 stm32F407ZGT6 最小系统板根据步进电机控制器的资料可以知道 步进电机
    发表于 12-05 12:51 0次下载
    <b class='flag-5'>stm32</b>F4  定时器中断 + <b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b>器 <b class='flag-5'>控制</b>四线两相<b class='flag-5'>步进</b><b class='flag-5'>电机</b> (初级版本)

    STM32控制启动步进电机

    STM32控制启动步进电机概述正在做的项目需要用STM32控制
    发表于 12-24 19:30 79次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>控制</b>启动<b class='flag-5'>步进</b><b class='flag-5'>电机</b>

    基于STM32步进电机驱动设计

    ------一个固定的角度(及步进角)。可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制
    发表于 03-16 10:29 14次下载
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b>驱动设计

    STM32实例之步进电机速度控制

    在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机 的优点是可以不使用编码器,开
    发表于 03-22 09:42 3次下载
    <b class='flag-5'>STM32</b>实例之<b class='flag-5'>步进</b><b class='flag-5'>电机</b>的<b class='flag-5'>速度</b><b class='flag-5'>控制</b>

    plc如何控制步进电机速度和方向?

    plc作为一种工业控制计算机,具有模块化结构、配置灵活、高速的处理速度、精确的数据处理能力、PLC对步进电机也具有良好的控制能力,利用其高速
    的头像 发表于 08-07 08:09 1202次阅读
    plc如何<b class='flag-5'>控制</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b>的<b class='flag-5'>速度</b>和方向?