【CNC——第1篇】Arduino+MR2驱动42步进电机(进阶)

2023-11-23 20:00

本文主要是介绍【CNC——第1篇】Arduino+MR2驱动42步进电机(进阶),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

步进电机 42h2p6017 A4 ican 参数:http://www.ican-tech.com/product/detail/121.html
MR2数字步进驱动器:http://www.ican-tech.com/product/detail/138.html
电源及电机接线、控制信号接口接线、以及参数设定请参考网址以及技术手册。

例程一:实现转动
//例程一:实现转动
#define ENA 5
#define CLK 6   //脉冲
#define DIR 7
void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);Serial.begin(9600);
}
void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){digitalWrite(CLK,HIGH);//1000Hz的pwm波digitalWrite(CLK,LOW);delayMicroseconds(500);}
}

用法:官方 https://playground.arduino.cc/Main/MsTimer2/ ,所需库ide搜索安装即可。
参考:论坛建议 https://www.arduino.cn/thread-8412-1-1.html ,arduino有三个Timer: timer0, timer1, timer2

例程2:使用定时器,实现转动
// 例程2:使用定时器,实现转动
#include <MsTimer2.h>
#define ENA 5
#define CLK 6  //脉冲
#define DIR 7
void flash() {static boolean output = HIGH;digitalWrite(CLK, output);output = !output;
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}
}

如何让电机转特定圈数停下,即需要给多少个脉冲,驱动器参数如何设置?

  • 步距角: 输入一个电脉冲信号,步进电动机转子相应的角位移。它与控制绕组的相数、转子齿数和通电方式有关。步距角越小,运转的平稳性越好。
    查阅官网资料,此电机步矩角:1.8°,故转1圈需要 脉冲数 = 360° / 1.8° = 200个。

  • 细分倍数: 把电机步距角微分,减小每个脉冲走相对应得角位移,即减小脉冲当量,使得电机运行更平稳,在脉冲频率不变情况下,速度也就变慢了。比如当细分倍数为2时,转1圈需要 脉冲数 = 360° / (1.8°/2) = 400个。 脉冲当量 = 1.8°/2 = 0.9°
    驱动器细分倍数拨盘设置对应关系查阅技术手册:http://www.ican-tech.com/product/detail/138.html
    在这里插入图片描述

例程3: 细分倍数为2时,驱动电机转4
// 例程3,细分倍数为1时,驱动电机转`3`圈
#include <MsTimer2.h>
#define ENA 5
#define CLK 6  //脉冲
#define DIR 7
unsigned int t_CLK = 0; //记录脉冲个数
void flash() {static boolean output = HIGH;digitalWrite(CLK, output);output = !output;t_CLK+=1;if(t_CLK==200*2*4*2){ //细分倍数为1,因为中断时长为半个周期,所以*2MsTimer2::stop();}
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}}

改写成带参数子函数:

// 
#include <MsTimer2.h>
#define ENA 5
#define CLK 6  //脉冲
#define DIR 7
unsigned int t_CLK = 0; //记录脉冲个数
void run_42(unsigned char mul, unsigned int t_cycles)//细分倍数(对应的要在驱动器上设置),圈数
{if(mul*t_cycles<160){t_CLK+=1;if(t_CLK==400*mul*t_cycles){ //细分倍数为1,因为中断时长为半个周期,所以*2MsTimer2::stop();}else if(t_CLK==65534){t_CLK=0;}   }
}
void flash() {static boolean output = HIGH;digitalWrite(CLK, output);output = !output;run_42(2,4);  //细分倍数2,圈数4
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}}
例程4: 细分倍数为1时,驱动电机的转速为150r/min,即 2.5r/s, 转1分钟。

1圈 需要200个脉冲,每秒500个脉冲,每个脉冲2 ms。因为此定时器中断最小为1ms,所以使用定时器150也是最高速。

// 
#include <MsTimer2.h>
#define ENA 5
#define CLK 6  //脉冲
#define DIR 7
unsigned int t_CLK = 0; //记录脉冲个数
void run_42(unsigned char mul, unsigned int t_cycles)//细分倍数(对应的要在驱动器上设置),圈数
{if(mul*t_cycles<160){t_CLK+=1;if(t_CLK==400*mul*t_cycles){ //细分倍数为1,因为中断时长为半个周期,所以*2MsTimer2::stop();}else if(t_CLK==65534){t_CLK=0;}}   }
void run_300rpm()
{t_CLK+=1;if(t_CLK==1000*60){ //1分钟MsTimer2::stop();}}
void flash() {static boolean output = HIGH;digitalWrite(CLK, output);output = !output;//run_42(1,4);  //细分倍数2,圈数4run_300rpm(); //细分倍数1,转速300
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}}
例程5 细分倍数,转速。 采用延时微秒形式。
//例程5  细分倍数,转速,分钟
#define ENA 5
#define CLK 6   //脉冲
#define DIR 7
void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);Serial.begin(9600);
}
void run_rpm(unsigned char mul, unsigned int rpm)//细分倍数,转速
{float del_time=0;//60*1000*1000/mul//200/rpm/2del_time=5000/rpm*30/mul;while(1){digitalWrite(CLK,HIGH);//1000Hz的pwm波delayMicroseconds(del_time);digitalWrite(CLK,LOW);delayMicroseconds(del_time);}
}
void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){run_rpm(4,60);//细分倍数,转速}
}

在这里插入图片描述

后话:关于步进电机,其驱动万变不离其宗。

附美照一副:
在这里插入图片描述

这篇关于【CNC——第1篇】Arduino+MR2驱动42步进电机(进阶)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420390

相关文章

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys