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.mzph.cn/news/207649.shtml

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

相关文章

Pipenv环境配置+Pytest运行

环境配置 使用Pipenv进行虚拟环境管理,Pipfile为依赖模块管理文件。 安装pipenv:brew install pipenv根项目根目录下执行命令创建虚拟环境: pipenv install在Pycharm中指定项目运行的虚拟环境 :File->Settings->Project:-…

一文2500字使用Python进行GRPC和Dubbo协议的高级测试

01、GRPC测试 GRPC(Google Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,由 Google开发并基于Protocol Buffers(protobuf)进行通信。它使用了HTTP/2协议作为传输层&#…

C++11条件变量condition_variable

文章目录 前言正文等待通知注意事项 结尾 前言 条件变量用于多线程中,其作用是在多线程间实现线程的等待、唤醒和通知机制,常配合互斥锁(std::mutex)一起使用。它主要用于解决数据竞争问题>。 正文 条件变量只有五个函数&am…

PyQt6 QCalendarWidget日历控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

快速实现入门HarmonyOS开发

本文档适用于HarmonyOS应用开发的初学者。编写两个简单的页面,实现在第一个页面点击按钮跳转到第二个页面。开始前,请参考下载与安装软件、配置开发环境和运行HelloWorld,完成开发工具的安装和开发环境的配置。 开发Ability 概述&#xff1…

Python 日期时间模块详解(datetime)

文章目录 1 概述1.1 datetime 类图1.2 类描述 2 常用方法2.1 获取当前日期时间&#xff1a;now()、today()、time()2.2 日期时间格式化&#xff1a;strftime()2.3 日期时间大小比较&#xff1a;>、、<2.4 日期时间间隔&#xff1a;- 3 扩展3.1 Python 中日期时间格式化符…

混合预编码(Hybrid Precoding)的全连接结构与子连接结构

A Survey on Hybrid Beamforming Techniques in 5G: Architecture and System Model Perspectives 全连接结构的混合预编码 子连接结构的混合预编码 Alternating Minimization Algorithms for HybridPrecoding in Millimeter Wave MIMO Systems

UE Websocket笔记

参考链接 [UE4 C入门到进阶]12.Websocket网络通信 - 哔哩哔哩 包含怎么用Nodejs 写测试服务器 UE4_使用WebSocket和Json&#xff08;上&#xff09; - 知乎 包含Python写测试服务器 UE4_使用WebSocket和Json&#xff08;下&#xff09; - 知乎 示例代码 xxx.Build.cs"W…

【React】使用react hooks实现评论示例

实现功能 1、渲染评论列表 2、删除评论 3、渲染导航栏和高亮 4、评论列表排序功能 5、获取评论 6、点击发布按钮发布评论 7、清空输入框 8、重新聚焦 实现代码 1、需要引入 import React, { useRef, useState } from react import avatar from "../logo.png" //头…

[动态规划及递归记忆搜索法]2.插入乘号

插入乘号 题目描述 给定一个非负整数&#xff0c;用k个乘号将其分割&#xff0c;使得乘积最大。 例如&#xff1a;在整数12345中插入两个乘号&#xff0c;有以下插入法&#xff1a; 1*2*345 1*23*45 1*234*5 12*3*45 12*34*5 123*4*5 其中最大值是123*4*5 2460 关于输入 一…

前端小技巧: 面向切面编程在前端代码中的应用

面向切面编程 面向切面编程在java中提出这类概念但是在js没有束缚和约定&#xff0c;只需要按编程思想来实现原理在js中使用function或class实现面向切面编程 面向切面概念 AOP (Aspect Oriented Programming) 面向切面编程主要实现目的是针对业务处理过程中的切面进行提取&…

第18章:随堂复习与企业真题(JDK8-17新特性)

第18章&#xff1a;随堂复习与企业真题&#xff08;JDK8-17新特性&#xff09; 一、随堂复习 1. JDK新特性的概述 几个重要的版本 jdk 5.0 / jdk 8.0 &#xff1a;里程碑式的版本jdk9.0 开始每6个月发布一个新的版本LTS : jdk8 、 jdk 11 、 jdk 17 如何学习新特性 > 角…

Android安全学习路标

1. Android操作系统基础知识 首先&#xff0c;你需要建立坚实的Android操作系统基础知识&#xff0c;包括Android架构、进程和内存管理、应用组件和权限模型等基本概念。 2. 安全防范理论 学习关于安全防范理论的基础知识&#xff0c;包括常见的威胁模型、攻击类型和安全风险…

Python-猜数字游戏

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

免费的AI改写文案软件,热门AI改写文案软件【2024】

在数字化时代&#xff0c;文案创作变得更为便捷&#xff0c;其中AI改写文案软件的兴起为写作者们带来了全新的创作体验。这些工具通过智能算法和自然语言处理技术&#xff0c;能够快速改写文本&#xff0c;提高创作效率。本文将深入探讨AI改写文案软件的现状&#xff0c;介绍一…

LeetCode题:174. 地下城游戏

目录 一、题目要求 二、解题思路 &#xff08;1&#xff09;状态表示 &#xff08;2&#xff09;状态转移方程 &#xff08;3&#xff09;初始化dp表 &#xff08;4&#xff09;填表顺序 &#xff08;5&#xff09;返回值 三、代码 一、题目要求 174. 地下城游戏 恶魔们…

swagger入门

swagger入门 pom依赖 不用专门导入swagger 因为springboot已经将它集成了 org.springframework.boot spring-boot-starter com.github.xiaoymin knife4j-spring-boot-starter Swagger配置类 Configuration public class SwaggerConfig { // 创建并配置Docket Bean&#xf…

snakeyaml编辑yaml文件并覆盖注释

文章目录 前言技术积累实战演示1、引入maven依赖2、覆盖注释工具类3、snakeyaml工具类4、测试用例5、测试效果展示 写在最后 前言 最近在做一个动态整合框架的项目&#xff0c;需要根据需求动态组装各个功能模块。其中就涉及到了在application.yaml中加入其他模块的配置&#…

TCP传输层详解(计算机网络复习)

介绍&#xff1a;TCP/IP包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff0c;简称TCP/IP。该协议族提供了点对点的连接机制&#xff0c;并将传输数据帧的封装、寻址、传输、路由以及接收方式都予以标准化 TCP/IP的分层模型 在讲TCP/IP协议之前&#xff0c;首先介绍一…

力扣贪心题解 跳跃游戏

55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b…