单片机直驱两相四线步进电机研究

【本文发布于https://blog.csdn.net/Stack_/article/details/132236329,未经允许不得转载,转载须注明出处】


双极性步进电机(两相四线步进电机),原理的东西就先不讲太多了,还没搞清楚,边查资料边写代码来理解吧。

此电路使用4片CMS6324去驱动2个H桥,每片CMS6324驱动的桥的同一侧,其自带硬件死区,所以不需要考虑死区插入的问题。如果不是这样的电路,则需要注意上下桥臂同时导通短路的问题。


一、电机基本原理图 内部简化图


在这里插入图片描述

四拍,每个脉冲转 1.8°


在这里插入图片描述

八拍,每个脉冲转 0.9°


二、简单的驱动代码


#define MOTOR_A_P_PORT          PORT1   //P15 A+
#define MOTOR_A_P_PIN           PIN5#define MOTOR_A_N_PORT          PORT1   //P14 A-
#define MOTOR_A_N_PIN           PIN4#define MOTOR_B_P_PORT          PORT1   //P13 B+
#define MOTOR_B_P_PIN           PIN3#define MOTOR_B_N_PORT          PORT1   //P12 B-
#define MOTOR_B_N_PIN           PIN2#define MOTOR_A_P__SET()        PORT_SetBit(MOTOR_A_P_PORT, MOTOR_A_P_PIN)
#define MOTOR_A_P__RESET()      PORT_ClrBit(MOTOR_A_P_PORT, MOTOR_A_P_PIN)#define MOTOR_A_N__SET()        PORT_SetBit(MOTOR_A_N_PORT, MOTOR_A_N_PIN)
#define MOTOR_A_N__RESET()      PORT_ClrBit(MOTOR_A_N_PORT, MOTOR_A_N_PIN)#define MOTOR_B_P__SET()        PORT_SetBit(MOTOR_B_P_PORT, MOTOR_B_P_PIN)
#define MOTOR_B_P__RESET()      PORT_ClrBit(MOTOR_B_P_PORT, MOTOR_B_P_PIN)#define MOTOR_B_N__SET()        PORT_SetBit(MOTOR_B_N_PORT, MOTOR_B_N_PIN)
#define MOTOR_B_N__RESET()      PORT_ClrBit(MOTOR_B_N_PORT, MOTOR_B_N_PIN)PORT_Init(MOTOR_A_P_PORT, MOTOR_A_P_PIN, OUTPUT); //P15 A+PORT_Init(MOTOR_A_N_PORT, MOTOR_A_N_PIN, OUTPUT); //P14 A-PORT_Init(MOTOR_B_P_PORT, MOTOR_B_P_PIN, OUTPUT); //P13 B+PORT_Init(MOTOR_B_N_PORT, MOTOR_B_N_PIN, OUTPUT); //P12 B-PORT_Init(PORT3, PIN0, OUTPUT); //P30 CMS6021 POWER_EN, 使能CMS6324供电PORT_SetBit(PORT3, PIN0);while(1){#if (0) 													//四拍#if (0) 													//四拍正转//A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);#else   													//四拍反转//A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);#endif#else   													//八拍#if (0) 													//八拍正向//A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A+ B+MOTOR_A_P__SET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+ A-MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A- B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B- A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);#else 														//八拍反向//A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B- A+MOTOR_A_P__SET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__RESET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A- B-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__SET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A-MOTOR_A_P__RESET();MOTOR_B_P__RESET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+ A-MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__SET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//B+MOTOR_A_P__RESET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);//A+ B+MOTOR_A_P__SET();MOTOR_B_P__SET();MOTOR_A_N__RESET();MOTOR_B_N__RESET();UserTimer_Reset(&timer_delay);while(UserTimer_Read(&timer_delay) < TIMEOUT_1MS);#endif#endif}

黄波形为 A+
蓝波形为 B+
紫波形为 A-
绿波形为 B-

在这里插入图片描述

四拍正转,每个正脉冲转1.8°,360°/1.8°=200个脉冲转一圈。一次循环A+ B+ A- B-四个脉冲,循环50次即转一圈。


在这里插入图片描述

四拍反转。四拍时,1ms切换太快了,会严重丢步,转动非常卡顿,将延时即切换时间适当拉长可获得较为平顺的效果。但导通时间过长会导致总电流很大。


在这里插入图片描述

八拍正转。拍数增加,转动相较于4拍平顺了不少


在这里插入图片描述

八拍反转



三、抓取步进电机驱动芯片/驱动器的四线波形进行对比


在这里插入图片描述

正转。可见,大体思路和上面的是一致的,只不过为了驱动更平顺以及功耗的考虑,各线通电时不是恒导通的,而是以PWM的方式进行输出


在这里插入图片描述

反转


在这里插入图片描述

每一相通电时,其正占空比都是先增后减,即电流先增后减


在这里插入图片描述

当速度提高,换相频率变高。一般地,功率也需要提高,速度不变负载增加,功率也需提高(需要接编码器),所以正占空比(平均)也变大了,电流变大


以上为波形研究,待续

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

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

相关文章

jsoup解析html之table表格

jsoup解析html之table表格 jsoup说明 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能 从一…

Python Opencv实践 - 图像旋转

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像旋转 #Opencv中的旋转&#xff0c;首先通过cv.getRotationMatrix2D获得旋转矩阵 #cv.getRotationMatrix2D(center,ang…

Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期

Spring之Bean的生命周期 Aware接口项目结构项目代码运行结果源代码使用场景 InitializingBean接口项目结构项目代码运行结果源代码 BeanFactoryPostProcessor接口项目结构项目代码运行结果源代码 Bean的生命周期项目结构项目代码运行结果源代码 Aware接口 实现Aware接口是为了…

微信小程序实现图片多点裁剪

话不多说&#xff0c;直接上代码 1、页面布局 <view class"buttons" style"height: 50px;"><view class"upload btn" style"background-color: #d18118;"bindtap"uploadImage"> 上传图片 </view><vie…

机器视觉项目流程和学习方法

机器视觉项目流程&#xff1a; 00001. 需求分析和方案建立 00002. 算法流程规划和业务逻辑设计 00003. 模块化编程和集成化实现 00004. 调试和优化&#xff0c;交付客户及文档 学习机器视觉的方法&#xff1a; 00001. 实战学习&#xff0c;结合项目经验教训 00002. 学习…

c++参数传递

函数的参数传递 指的是形参与实参结合的过程&#xff0c;其基本方式包括值传递和引用传递两种。 值传递 该方法把参数的实际值复制给函数的形式参数。在这种情况下&#xff0c;修改函数内的形式参数对实际参数没有影响 #include<iostream> using namespace std;void swap…

NAS搭建指南二——影视资源中心

1. 刮削 这一部分是利用 tinyMediaManager 进行影视资源的评分、简介以及图片的搜集工作tinyMediaManager 官方网站地址下载及安装过程&#xff1a;略我的主要修改的设置项如下所示&#xff1a; 使用方法&#xff1a; a. 点击更新媒体库 b. 选择影片–>右键单击–>…

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BiLST…

C++中的回调函数

1.普通函数作为回调函数 #include <iostream>void programA_FunA1() { printf("Iam ProgramA_FunA1 and be called..\n"); }void programA_FunA2() { printf("Iam ProgramA_FunA2 and be called..\n"); }void programB_FunB1(void (*callback)()) {…

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…

04.利用Redis国逻辑过期实现缓存功能---解决缓存击穿

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis逻辑过期实现添加缓存功能解决缓存击穿 学习产出&#xff1a; 缓存击穿讲解图&#xff1a; 解决方案&#xff1a; 采用互斥锁采用逻辑过期 1. 准备pom环境 <dependency><groupId>org.springframework…

⑤ Axios网络请求

Axios安装 cnpm install --save axios post请求需要用到的&#xff1a; cnpm install --save querystring(用来转换格式的) 引入 一般是全局引入&#xff0c;在main.js中引入 全局引入后的get和post方式使用 get请求方式 post请求方式 先引入&#xff1a; axios封装…

STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别

ARR是啥 自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器&#xff0c;也可以在每次发生更新事件 (UEV) 时传送到影子寄存器&#xff0c;这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 …

Go和Java实现中介者模式

Go和Java实现中介者模式 下面通过一个同事之间相互通信的例子来说明中介者模式的使用。 1、中介者模式 中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类&#xff0c;该类通常处理不同类之间的 通信&#xff0c;并支持松耦合&#xff0c;使代码…

1.作用域

1.1局部作用域 局部作用域分为函数作用域和块作用域。 1.函数作用域: 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。 总结&#xff1a; (1)函数内部声明的变量&#xff0c;在函数外部无法被访问 (2)函数的参数也是函数内部的局部变量 (3)不同函数…

Redis——三个特殊的数据类型+事务

概述 全称为远程字典服务。 Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客 Redis能干什么&#xff1f; 1.内存存储、持久化&#xff0c;内存中是断电即失&#xff0c;因此持久化很重要&#xff…

【LVS-NAT配置】

配置 node1&#xff1a;128&#xff08;客户端&#xff09; node2&#xff1a;135&#xff08;调度器&#xff09; RS&#xff1a; node3&#xff1a;130 node4&#xff1a;132 node2添加网络适配器&#xff08;仅主机模式&#xff09; [rootnode2 ~]# nmtui[rootnode2 ~]#…

ETLCloud+MaxCompute实现云数据仓库的高效实时同步

MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用…

欧拉公式之证明

首先&#xff0c;我们考虑复数函数的泰勒级数展开式。对于任意一个复数函数f(z)&#xff0c;我们可以将其在za处进行泰勒级数展开&#xff1a; f(z) f(a) f(a)(z-a) f(a)(z-a)^2/2! f(a)(z-a)^3/3! ... 其中f(a)表示f(z)在za处的导数&#xff0c;f(a)表示f(z)在…

从零开始学Python(三)函数与lambda表达式

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Python的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.函数 1.函数与方法的区别 2.函数的定…