【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

相关文章

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin