cubemx配置图

先配置定时器,选择定时器8,内部时钟源,通道1,2,3,4

时钟配置,查看手册可以知道TIM8连接在APB2,定时器8时钟频率为168M。

定时器8参数配置

定时器8GPIO设置

定时器8 中断设置(比较中断)

生成代码

代码修改

1、生成S型加速点比较值及自动重装载值

添加bsp_stepmotor.c文件,主要是计算加速过程中确定加速点的自动重装载值,以及编写比较中断产生后回调函数中每个电机通道的状态机变化。

内容为:

#include "bsp_stepmotor.h"
#include "tim.h"
#include "math.h"uint16_t step_to_run[4]={6800,6800,6800,6800}; //要匀速运行的步数       总共运行步数 = ACCELERATED_SPEED_LENGTH*2 + step_to_run
float fre[ACCELERATED_SPEED_LENGTH]; //数组存储加速过程中每一步的频率
unsigned short period[ACCELERATED_SPEED_LENGTH]; //数组储存加速过程中每一步定时器的自动装载值     void CalculateSModelLine(float fre[], unsigned short period[], float len, float fre_max, float fre_min, float flexible)
{int i=0;float deno ;float melo ;float delt = fre_max-fre_min;for(; i<len; i++){melo = flexible* (i-len/2) / (len/2);deno = 1.0f / (1 + expf(-melo));  //expf is a library function of exponential(e)?fre[i] = delt * deno + fre_min;period[i] = (unsigned short)(10000000.0f / fre[i]); // 10000000 is the timer driver frequency}return ;
}void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t count[4]={0,0,0,0};static uint32_t num_callback[4]={0,0,0,0};static uint8_t status[4]={1,1,1,1};if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){num_callback[0]++;if(num_callback[0]%2==0){switch(status[0]){case ACCEL://加速__HAL_TIM_SetAutoreload(&htim8,period[count[0]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_1,period[count[0]]/2);count[0]++;if(count[0]>=ACCELERATED_SPEED_LENGTH){status[0]=3;}                        break;case RUN://匀速step_to_run[0]--;if(step_to_run[0]<1)status[0]=2;     break;case DECEL://减速count[0]--;__HAL_TIM_SetAutoreload(&htim8,period[count[0]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_1,period[count[0]]/2);if(count[0]<1)status[0]=0;break;case STOP://停止// 关闭通道TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_DISABLE);        __HAL_TIM_CLEAR_FLAG(&htim8, TIM_FLAG_CC1);break;}}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){num_callback[1]++;if(num_callback[1]%2==0){switch(status[1]){case ACCEL://加速__HAL_TIM_SetAutoreload(&htim8,period[count[1]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_2,period[count[1]]/2);count[1]++;if(count[1]>=ACCELERATED_SPEED_LENGTH){status[1]=3;}                        break;case RUN://匀速step_to_run[1]--;if(step_to_run[1]<1)status[1]=2;     break;case DECEL://减速count[1]--;__HAL_TIM_SetAutoreload(&htim8,period[count[1]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_2,period[count[1]]/2);if(count[1]<1)status[1]=0;break;case STOP://停止// 关闭通道TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_2, TIM_CCx_DISABLE);        __HAL_TIM_CLEAR_FLAG(&htim8, TIM_FLAG_CC2);break;}}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){num_callback[2]++;if(num_callback[2]%2==0){switch(status[2]){case ACCEL://加速__HAL_TIM_SetAutoreload(&htim8,period[count[2]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_3,period[count[2]]/2);count[2]++;if(count[2]>=ACCELERATED_SPEED_LENGTH){status[2]=3;}                        break;case RUN://匀速step_to_run[2]--;if(step_to_run[2]<1)status[2]=2;     break;case DECEL://减速count[2]--;__HAL_TIM_SetAutoreload(&htim8,period[count[2]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_3,period[count[2]]/2);if(count[2]<1)status[2]=0;break;case STOP://停止// 关闭通道TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_3, TIM_CCx_DISABLE);        __HAL_TIM_CLEAR_FLAG(&htim8, TIM_FLAG_CC3);break;}}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){num_callback[3]++;if(num_callback[3]%2==0){switch(status[3]){case ACCEL://加速__HAL_TIM_SetAutoreload(&htim8,period[count[3]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_4,period[count[3]]/2);count[3]++;if(count[3]>=ACCELERATED_SPEED_LENGTH){status[3]=3;}                        break;case RUN://匀速step_to_run[3]--;if(step_to_run[3]<1)status[3]=2;     break;case DECEL://减速count[3]--;__HAL_TIM_SetAutoreload(&htim8,period[count[3]]);__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_4,period[count[3]]/2);if(count[3]<1)status[1]=0;break;case STOP://停止// 关闭通道TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_4, TIM_CCx_DISABLE);        __HAL_TIM_CLEAR_FLAG(&htim8, TIM_FLAG_CC4);break;}}}}
#ifndef __bsp_stepmotor_H
#define __bsp_stepmotor_H
#include "tim.h"
#ifdef __cplusplusextern "C" {
#endif#define S_ACCEL 1
#define T_ACCEL 0/* S型加速参数 */
#define ACCELERATED_SPEED_LENGTH 3000  //定义加速度的点数(其实也是3000个细分步的意思),调这个参数改变加速点
#define FRE_MIN 500  //最低的运行频率,调这个参数调节最低运行速度
#define FRE_MAX 35000 //最高的运行频率,调这个参数调节匀速时的最高速度35000#define STOP                                  0 // 加减速曲线状态:停止
#define ACCEL                                 1 // 加减速曲线状态:加速阶段
#define DECEL                                 2 // 加减速曲线状态:减速阶段
#define RUN                                   3 // 加减速曲线状态:匀速阶段void CalculateSModelLine(float fre[], unsigned short period[], float len, float fre_max, float fre_min, float flexible);    #endif/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

设置完定时器各通道参数及回调函数后即可在main函数中启动定时器

    ...省略部分代码CalculateSModelLine(fre,period,ACCELERATED_SPEED_LENGTH,FRE_MAX,FRE_MIN,4);HAL_TIM_Base_Start(&htim8);//启动定时器HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);//启动定时器8通道1比较输出中断HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_2);//启动定时器8通道2比较输出中断HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_3);//启动定时器8通道3比较输出中断HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_4);//启动定时器8通道4比较输出中断while(1)...//省略部分代码

这样代码就完成,烧写进去后每次复位开机可以看到4个电机开始S型加速运行一周,如果需要对电机做不同的加速修改相应的参数即可

单个电机S型加速过程参见上一篇博客

步进电机S型加速

CUBEMX教程—— STM32F407实现多步进电机型加减速全过程相关推荐

  1. STM32步进电机S型加减速算法

    简单说明一下硬件资源,需要用到STM32两个定时器,TIM1产生PWM脉冲并对脉冲个数计数,TIM2开启定时中断用于算法的实现.采用CubeMX+Hal库配置,这里不做详细介绍,重点介绍S型加减速算法 ...

  2. 步进电机的S型加减速算法

    电机能运行的速度远远大于启动速度(即最大匀速速度),那么怎么平稳的运行到最大速度就是S型加减速曲线的作用 1.Qt 1.1.S加减速的计算 static float Freq[10][1000]; s ...

  3. 步进电机s型加减速计算工具_步进电机噪音和振动的原因分析及应对策略

    不正确地驱动步进电机很容易导致电机发出"嗡嗡"的噪声和很大的振动. 当驱动步进电机时,如果发现步进电机处于静止状态时,其内部都发出很明显的噪音,有点类似线圈快速变化那种,一般是由于 ...

  4. 步进电机-T型加减速

    1.声明 1.这是根据大佬的一篇文章进行修改,原末尾有一处描述有误,我在这里详细补充更正一下,很感谢大佬的分享. 步进电机加减速--梯形算法_步进电机梯形加减速算法_woniu2333的博客-CSDN ...

  5. 七段S型加减速算法--多轴时间同步方案调研

    七段S型加减速算法--时间同步 基本概念 问题提出 参考资料 参考一: 链接1 链接2 链接3 参考二 实现方案 后续 基本概念 7段S型加减速算法(7 segments S-curve veloci ...

  6. STM32-步进电机S型加减速控制

    基于STM32的步进电机S型加减速控制算法 STM32简介 STM32代表ARM Cortex-M内核的32位微控制器.专为要求高性能.低成本.低功耗的嵌入式应用专门设计的: STM32系列的内核主要 ...

  7. STM32:F407步进电机梯形加减速算法的实现

    项目中对步进电机运行速度有了新要求,所以尝试实现梯形加减速算法,S形加减速算法. 本文主要实现梯形加减速算法. 更新(22-06-18) 正点原子官6月17日新上线了<电机控制专题例程>, ...

  8. 步进电机的加减速控制---QYC

    文章目录 前言 一.步进电机 二.步进电机的分类与驱动 1.步进电机的相与极 2.步进电机的驱动与细分 三.步进电机的加减速控制 1.步进电机的梯形加减速控制 1.1梯形加减速的速度与脉冲周期 1.2 ...

  9. S型加减速程序,C++,PLC,AGV

    做无人驾驶AGV项目,起动和停车冲击非常大,参考牛人的博文https://blog.csdn.net/Septembernine/article/details/53125828,写了一段S型加减速程 ...

最新文章

  1. Java培训教程之对象的创建与使用
  2. Java 反射(练习)
  3. oracle缓存怎么看,Oracle从缓存里面查找真实的执行计划
  4. github 无法访问_Markdown文档写作利器套装:Typora+PicGo+GitHub
  5. bat处理中的管道[|]
  6. hive窗口函数入门
  7. 【转】 pycharm快捷键、常用设置、配置管理(后两者详见原博客)
  8. 台式计算机可以放到笔记本立马,怎么把台式电脑投影到笔记本电脑
  9. 【数据分析与挖掘实战】航空公司客户价值分析
  10. Android 直播调研
  11. android:scrollbars代码控制,android:scrollbars属性和弹出键盘的问题
  12. 抽奖随机滚动_老板让我做年会抽奖系统,我用Excel制作内定抽到自己的大奖!...
  13. Arduino ESP8266利用定时器中断控制LED闪烁示例程序
  14. 使用 Django 实现私有云盘
  15. 初识Linux与运维
  16. adb 连接某个wifi_adb wifi 测试(无需root)
  17. 台式电脑属于小型电子计算机,个人计算机属于小型计算机。
  18. 稿定科技内推|稿定让设计更简单,只要你来,稿定就能给你无限可能
  19. 用自己拍的一张照片做海报
  20. TRS过期后解决办法

热门文章

  1. 【Java】通讯录管理系统小项目
  2. word排版----分节、页眉页脚、页码、制作标题样式
  3. Python中回文数和质数问题的解决
  4. LBS:利用IP地址,获取地理位置
  5. 音视频系列1:流媒体
  6. [Xcode]自己常用的Code Snippets、Xcode插件、文件目录
  7. C语言规定 在一个源程序中 main函数,C语言规定:在一个源程序中,main函数的位置()A.必须在程序的最开始B.必须在系统调用的库函数的_搜题易...
  8. 如何提高代码质量,或者说高质量代码的特征是什么
  9. regedit.msc
  10. 04_Linux ARM架构-部署kibana服务-银河麒麟V10 操作系统