【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

相关文章

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

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

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

java学习,进阶,提升

http://how2j.cn/k/hutool/hutool-brief/1930.html?p=73689

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop