stm32一种步进电机查表法驱动


文章目录

  • 一、定时器基础频率
  • 二、驱动原理
  • 三、关键代码


对于stm32芯片来说,步进电机的驱动由于要在中断中不断计算下一次脉冲的时间而极其消耗算力,使用计算的方法对于芯片的算法消耗更高,特别是在f1这种算力比较低的芯片上,这时候使用查表法是一种比较靠谱的方式,这里只给出部分代码思路。当然使用查表法的缺点就是在算力够用的情况下相比计算会没有那么平滑,但是在使用更多电机的时候查表法表现更好,计算会由于算力不足出现卡顿的情况。

一、定时器基础频率

首先就是定时器基础频率的选择,stm32f1定时器的基础频率设置是36M,在这个基础上肯定还是要分频的,为了移植方便,选择分频后的频率为100k,所以分频系数为360-1;

htim1.Init.Prescaler = 360-1;

至于period这个参数就无所谓了,反正在电机运动的时候这个会改变。
下面是定时器的参考配置:

/* TIM1 init function */
void MX_TIM1_Init(void)
{/* USER CODE BEGIN TIM1_Init 0 *//* USER CODE END TIM1_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};/* USER CODE BEGIN TIM1_Init 1 *///200khz/* USER CODE END TIM1_Init 1 */htim1.Instance = TIM1;htim1.Init.Prescaler = 360-1;htim1.Init.CounterMode = TIM_COUNTERMODE_UP;htim1.Init.Period = 400-1;htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim1.Init.RepetitionCounter = 0;htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim1) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;sBreakDeadTimeConfig.DeadTime = 0;sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM1_Init 2 *//* USER CODE END TIM1_Init 2 */HAL_TIM_MspPostInit(&htim1);
}

二、驱动原理

使用查表法驱动步进电机使用了两个表,一个是加速表,即速度由慢到快S型曲线加速的过程,一个是速度表,通过这个表可以计算出下个定时器周期的自动重装载值。
加速度表就是一个S型曲线,通过MATLAB就能直接生成,速度表是根据计算得到的,我这里直接用EXCEL表做了,在这里插入图片描述
因为在定时器处理中CCR的值为ARR的一半,所以计算的时候是200k,部分表格如下:
在这里插入图片描述
转速就代表每分钟多少转。

三、关键代码

加速段ARR:

TIM4->ARR = Motor[0].Speed / s_curve_table[Motor[0].count_step/Motor[0].Accdelay];

这里有个Accdelay,这个是指加速度延迟的倍数,因为加速度表只有那么长,在高速的时候加速就会显得很快,使用这个可以显著的把加速表进行延长。
匀速段ARR:

TIM4->ARR = Motor[0].Speed / s_curve_table[Motor[0].Acc_Len/Motor[0].Accdelay - 1];

减速段ARR:

else{TIM4->ARR = Motor[0].Speed / s_curve_table[(Motor[0].Dec_Len - X_cnt-1)/Motor[0].Accdelay ];TIM4->CCR2 = TIM4->ARR / 2;X_cnt++;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257995.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万宾科技荣获2023物联网场景应用品牌企业创始人发表专题演讲

12月5日-6日由雄安新区管理委员会、中关村发展集团股份、物联中国团体组织联席会主办,全国33家物联网协会协办的2023物联网产业品牌大会于在雄安新区顺利召开。本次大会以“物联中国.数智雄安”为主题,邀请到科技部原副部长吴忠泽,雄安新区管…

SpringBoot集成Spring Security+jwt+kaptcha验证(简单实现,可根据实际修改逻辑)

参考文章 【全网最细致】SpringBoot整合Spring Security JWT实现用户认证 需求 结合jwt实现登录功能,采用自带/login接口实现权限控制 熟悉下SpringSecurity SpringSecurity 采用的是责任链的设计模式,是一堆过滤器链的组合,它有一条很…

西部再添“芯”增长极 | 海辰储能重庆基地正式投产

12月7日,海辰储能重庆基地一期一阶段项目投产仪式在重庆铜梁举行。此次重庆基地项目的投产,是海辰储能实施三大基地协同发展战略的重要里程碑,将进一步整合内部资源、发挥规模化生产优势、完善产业链布局,成为海辰储能持续迈向高质…

【动态规划系列】子数组的最大和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

<习题集><LeetCode><链表><61/83/82/86/92>

61. 旋转链表 https://leetcode.cn/problems/rotate-list/ public ListNode rotateRight(ListNode head, int k) {//k等于0,或者head为空,直接返回head;if(k 0 || head null){return head;}//创建last用于记录尾节点,移动last找…

ubuntu22.04 安装cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU(图形处理单元)进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展,使得开发…

MQTT 协议入门:轻松上手,快速掌握核心要点

文章目录 什么是 MQTT?MQTT 的工作原理MQTT 客户端MQTT Broker发布-订阅模式主题QoS MQTT 的工作流程开始使用 MQTT:快速教程准备 MQTT Broker准备 MQTT 客户端创建 MQTT 连接通过通配符订阅主题发布 MQTT 消息MQTT 功能演示保留消息Clean Session遗嘱消…

Ui自动化概念 + Web自动化测试框架介绍!

1.UI自动化测试概念:我们先明确什么是UI UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …

【江科大--32课程中讲解到的外部设备】

一、传感器模块(GPIO模块) 1.基本介绍 传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进…

Redis基础系列-持久化

Redis基础系列-持久化 文章目录 Redis基础系列-持久化1. 什么是持久化2. 为什么要持久化3. 持久化的两种方式3.1 持久化方式1:RDB(redis默认持久化方式)3.11 配置步骤-自动触发3.12 配置步骤-手动触发3.12 优点3.13 缺点3.14 检查和修复RDB快照文件3.15 哪些情况会触…

PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)

使用PPLCNet模型对车辆朝向进行识别 1 准备环境2 准备模型2.1 模型导出2.2 修改配置文件3 编译3.1 使用CMake生成项目文件3.2 编译3.3 执行3.4 添加后处理程序3.4.1 postprocess.h3.4.2 postprocess.cpp3.4.3 在cls.h中添加函数声明3.4.4 在cls.cpp中添加函数定义3.4.5 在main.…

测试文档---智力冲刺

文章目录 项目背景测试计划UI测试接口测试手工测试 测试总结 项目背景 项目描述:“智力冲刺”是一款网页小游戏,就像我们平时看到的网页游戏一样,前端页面负责展示游戏效果,后端服务器来实现游戏的逻辑。在我们的“智力冲刺”游戏…