stm32精密控制步进电机(基础篇)

news2024/11/26 2:52:02

众所周知,步进电机由于使用脉冲控制,会比直流电机的控制稍难一些,但开环控制时也更加稳定。

落到做项目的时候,目前来说我都会先考虑步进电机,再去考虑直流,无刷这样的电机。包括毕设时所用的机械臂也是用3个42步进电机控制自由度,剩下一个八线四相步进电机byj-28作为末端夹爪的电机。

技术系列的文章都是在总结和捋顺我自己得到的一些经验,如有错漏欢迎讨论


控制原理

定时器中断完成脉冲计数与脉冲引脚翻转,脉冲等于设定脉冲后关闭定时器中断,重新控制步进电机时,打开相应定时器中断即可。

简单的速度控制方法

1.通过改变arr和psc的值来改变速度,其中arr控制电机转速,psc控制电机计数频率。以stm32f103为例,单片机主频为72M,说明每1000个时钟周期产生一次中断,并将输入时钟的频率分频为720倍。arr和psc值越小,速度越大。

2.通过改变步进电机驱动器的细分数,细分数越小,速度越大,步进电机步距角1.8度,转一圈需要200个脉冲,所以最小细分数是200,细分数为400的时候步进电机转动0.9度,细分数800时步进电机转动0.45度,以此类推。

3.PWM方式调速,这个方式我最初会用,后面发现在实际应用中,使用脉冲计数显然更好控制一些。

注:速度较快时步进电机可能丢转,或者是和目标位置有较大差距,所以速度要控制在合适范围内

由脉冲数计算运动距离(丝杠滑台步进电机)

假设步进电机细分数为800,步距角为1.8度,可知步进电机每次脉冲都会运动0.45度,假设丝杠螺距为5mm,说明步进电机每转一整圈就会让滑台向前运动5mm,此时:

步进电机每完成800个脉冲就会让滑台向前运动5mm

如果需要移动100mm,需要16000个脉冲

由脉冲数计算运动距离(同步轮或者齿轮)

在机械臂这样的项目里,没有丝杠这么直观的距离换算方式,以下是我选用的方式:

不算直线距离,只把角度换算成脉冲。

通过正解或逆解,输入末端位置xmm,ymm,zmm后换算成机械臂需要运动的角度,后查看大小齿轮传动比。

假设步进电机齿轮齿数是9,机械臂齿数是32:

void angle_to_pulse(void)
{
    pulse_we_need = (low*9/32) / per_angle;
    pulse2_we_need = (rot*9/32) / per_angle;
    pulse3_we_need = (high_all*9/32) / per_angle;
    printf("normalized low_pulse: %d, rot_pulse: %d, high_all_pulse: %d\r\n", pulse_we_need, pulse2_we_need, pulse3_we_need);  // 调试输出
}

硬件连接

使用步进电机驱动器(其他方法会放在之后介绍),PUL-引脚控制脉冲,DIR-引脚控制方向,另外两个引脚DIR+和PUL+引出到5v,用于引脚供电,使能引脚可接可不接。

VCC和GND常接开关电源,为步进电机驱动器供电。由图片也能看出来,它可以承受9~42V的直流电压。

B+,B-,A+,A-是步进电机的接线

判断步进电机AB同相/异相的方式

一般步进电机上会有接线方式:

如果标签被撕毁,没有办法辨认,可以把四根步进电机的线两两相连,如果两条线连上之后很难拧动螺杆,说明两线同相。

控制代码解析

在中断内完成引脚翻转和中断标志位的清除

在这里面,GPIO_PIN_SET是1,GPIO_PIN_RESET是0,为了保证只运行一次相关状态,x为其他值时都保持引脚下电的状态,举个例子:MOTER1(0)、MOTER2(0)......

 

在这个枚举类型定义中:

  • GPIO_PIN_RESET 被定义为 0u,表示 GPIO 引脚处于低电平状态。

  • GPIO_PIN_SET 表示 GPIO 引脚处于高电平状态。

  • 这种枚举类型定义常常用于创建相关常量值

 

在主函数中设置和重置好定时器标志位,pulse计数值后,可以通过重新开启中断的方式完成定时器计数,方向引脚上电和脉冲引脚翻转

 

这个函数可以设置初始速度,改变arr和psc的值,使能定时器时钟,使能定时器,设置中断优先级,是一个比较重要的定时器初始化函数

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

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

相关文章

Linux开发讲课33---线程实现与线程控制步骤简析

线程概述 进程是系统中程序执行和资源分配的基本单位。 每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演…

Java基础-内部类与异常处理

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Java 内部类 什么是内部类? 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…

一位3D打印工程师繁忙的一天

早晨:准备与规划 7:00 AM - 起床与晨练 3D打印工程师早起进行晨练,如跑步或瑜伽,以保持身心健康。晨练后,享用一顿健康的早餐,为一天的繁忙工作做好准备。 8:00 AM - 检查邮件和项目进展 在开始工作前,先…

封装了一个仿照抖音效果的iOS评论弹窗

需求背景 开发一个类似抖音评论弹窗交互效果的弹窗,支持滑动消失, 滑动查看评论 效果如下图 思路 创建一个视图,该视图上面放置一个tableView, 该视图上添加一个滑动手势,同时设置代理,实现代理方法 (BOOL)gestur…

Zkeys三方登录模块支持QQ、支付宝登录

1,覆盖到根目录,并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理,配置管理员权限-系统类别-找到云外科技,全部打勾 3,后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…

【python中级】图像从从笛卡尔坐标系转换为极坐标系

【python中级】图像从从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互…

人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析|文献速递·24-07-07

小罗碎碎念 本期文献主题:人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析 这一期文献的速递,是有史以来数量最大的一次,足足有十一篇,本来打算分两期写,但是为了知识的系统性,我决定咬咬牙&…

texStudio使用(小白)

原先使用overleaf在线编译,可能eps格式的图片太大导致需要充钱,所以考虑本地安装 安装教程参考B站视频:B站Latex本地编译器安装:TexLive TextStudio 踩到坑: 1. 编译器位置要选择对 因为BibTex选成了Biber导致出现无…

minist数据集分类模型的训练

minist数据集训练 训练方法:利用pytorch来实现minist数据集的分类模型训练 训练模型如下图所示 模型代码: import torch from torch import nn from torch.nn import Flattenclass Net(nn.Module):def __init__(self):super().__init__()self.module …

文件管理下:文件函数的学习

前言 Hello,小伙伴们你们的作者君又来了,上次我们简单介绍了文件的坐拥并简单提到了数据的读取,和C语言的默认流的作用,今天我将继续带领大家探索文件的奥秘,大家准别好了吗? 在内容开始之前还是按照惯例&#xff0c…

**kwargs 字典解包传参的方式

字典解包传参 在Python中,****kwargs**是一种通过字典解包 (dictionary unpacking) 的方式进行参数传递的方式。它将一个字典的键值对解包并传递给函数的命名参数。 示例代码 kwargs实参: {name: "jordan", age: 18, score: [80, 85, 85]} get_info形…

下载linux的吐槽

本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…

前端扫盲:cookie、localStorage和sessionStorage

cookie、localStorage和sessionStorage都是存储数据的方式,他们之间有什么不同,各有什么应用场景,本文为您一一解答。 一、什么是cookie、localStorage和sessionStorage 1. Cookie是一种存储在用户计算机上的小型文本文件,由服务…

子数组按位与为k

注意这里的子数组是连续的非空的数组&#xff0c;我们要学会与处理就是求交集 class Solution { public:long long countSubarrays(vector<int>& nums, int k) {long long ans 0;for (int i 0; i < nums.size(); i) {int x nums[i];for (int j i - 1; j > …

通过消息传递同步操作

通信顺序进程&#xff08;CSP&#xff09; 是一种形式语言&#xff0c;用来描述并发性系统间进行交互的模式 每个线程或进程独立运行&#xff0c;它们之间仅通过消息传递进行通信&#xff0c;而不是直接共享状态 每个线程实际上都是一个状态机&#xff1a;当它接收到一条消息时…

Zabbix监控软件

目录 一、什么是Zabbix 二、zabbix监控原理 三、zabbix 安装步骤 一、什么是Zabbix ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的…

基于LoFTR_TRT项目实现LoFTR模型的trt推理与onnx推理,3060显卡下320图像30ms一组图

本博文主要记录了使用LoFTR_TRT项目将LoFTR模型导出为onnx模型&#xff0c;然后将onnx模型转化为trt模型。并分析了LoFTR_TRT与LoFTR的基本代码差异&#xff0c;但从最后图片效果来看是与官网demo基本一致的&#xff0c;具体可以查看上一篇博客记录。最后记录了onnx模型的使用【…

深入探索 Python 中的数据维数:高维数据处理方法与应用

Python 数据维数 在数据科学和机器学习领域&#xff0c;理解数据的维度是至关重要的。Python作为一种强大而灵活的编程语言&#xff0c;提供了丰富的工具和库来处理各种维度的数据。本文将介绍Python中数据维数的概念&#xff0c;以及如何使用Python库来处理不同维度的数据。 什…

27 防火墙不同区域之间是如何通信

26 华三防火墙安全区域-CSDN博客 目标实现不同区域的通信 1 给防火墙配置IP地址 WEB页面配置IP地址 2 在PC机上配置对应对IP地址 &#xff08;该要启用的接口一定要启用 IP地址 子网掩码 网关 一定要查看好&#xff09; 3 将配置好的IP地址对应的不同接口加入到不同的区域上去 …

关于忠诚:忠于自己的良知、理想、信念

关于忠诚&#xff1a; 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事&#xff0c;会纠结离开还是留下&#xff0c;这里我们要深知忠诚的定义&#xff0c;我们不是忠诚于某个人、某件事、或者某个机构&#xff0c;而是忠诚于自己的良知&#xff0c;忠诚于自己的理想和…