FPGA:双线轨丝杠式升降台(及A4988与42步进电机原理)(同时包含51及32程序)


日常·唠嗑

3月份在做智能剥壳机的时候,就遇到了丝杠问题。想着通过挤压的方式把坚果的外壳压碎,但那时候对丝杠原理还不是很理解,最后不了了之。现在省电,需要给车子做一个升降台,再一次回到了曾经没有攻克的难题……


一、双线轨丝杆式升降

双线轨丝杆式升降一般由步进电机,T8丝杆,联轴器,上下轴承片,导轨及轴承座组成。这种组合,一般承重能力强,精度高。多用于3D打印机或者高精度机床等等。(汽修厂升降的升降机与这个结构也有异曲同工之妙)双线轨丝杆式升降台如下图所示:
在这里插入图片描述

某宝的上的配套升降台(有效行程1米)价格一般在400左右,较为昂贵,但是性能稳定,无需经过多次调试就可以直接用。我做的项目,升降距离不需要太长,且要求整个机构体积较小,所以我利用零件自己组装。
T8丝杆:
在这里插入图片描述
42步进电机(6线):
在这里插入图片描述
A4988驱动模块:
在这里插入图片描述
联轴器:
在这里插入图片描述
成果图: 有点丑,不过还好经过多次测试能用。
在这里插入图片描述

二、42步进电机

1、常见问题

初次接触步进电机肯定会有很多疑问,比如4线步进电机与6线步进电机的差别,该如何接线,步进电机的电压该怎么解决,12V可以吗(第一次接触,我朋友跟我说,电机功率很大,90W,并且电压要30V,比赛要带上电源器,我当场人就傻),像我第一次接触就一直在纠结用什么驱动模块(当时我了解的就只有TB6600,可是这东西太大了啊),后来了解到了拇指大的A4988一样可以实现驱动。

2.型号参数

(42BYGH) 两相四线步进电机,步距角为 1.8 °, 200 个脉冲转动一圈。(这个参数很重要!!!下面写程序需要用到)下图为电机与模块接线(这个图是与Arduino接线,但是与别的板卡接线是一样的):
在这里插入图片描述

三、A4988驱动模块

A4988 是一款带转换器和过流保护的 DMOS 微步驱动器,该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,输出驱动性能可达 35 V 及 ±2 ,A4988 包括一个固定关断时间电流稳压器,该稳压器可在慢或混合衰减模式下工作。转换器是 A4988 易于实施的关键。只要在“步进”输入中输入一个脉冲,即可驱动电动机产生微步。无须进行相位顺序表、高频率控制行或复杂的界面编程。A4988 界面非常适合复杂的微处理器不可用或过载的应用。

麻雀虽小五脏俱全,虽然模块只有拇指大,我对引脚做了笔记,下面看看每个引脚的名称及作用。

在这里插入图片描述

1、STEP 、 DIR 分别连接单片机的两个控制端口; EN 可以使用单片机端口控制,也可以直接连接 GND 使能;
2、 MS1 、 MS2 、MS3 按照上一节“步进模式设置”,接高低电平,设置步进模式,来选择不同的步距角。 设置脉冲的频率,来控制旋转速度。步进电机走一步是1.8度,一圈就是200步。例如使用1/16步进,则需要走3200步才等于一圈。
3、 2B 、2A 、 1A 、 1B 分别接步进电机红、蓝、黑、绿线。 VMOT 、 GND 接 12V
4、左右直流电源(电压大小更具步进电机不同,选择合适电压)。VDD 、 GND 接 3.3V 或 5V 。
5、 sleep,reset:通常短接;
长篇大论讲了一堆,主要是想让大家看懂这个模块的具体功能。但是实际运用中,如果,不是特别精细的控制,可以直接选择全步进的工作方式(MS1,MS2,MS3,三个引脚全部悬空,即为全步进模式,那样的话就只要控制STEP,DIR两个引脚即可)

四、程序设计

1、C语言(51单片机)

#include"reg52.h"
#include <intrins.h>
sbit dir=P1^0;
sbit step=P1^1;
#define uint  unsigned int
void Delay_xms(uint x);

void Delay1000us()		//@11.0592MHz
{
    
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
    
		while (--j);
	} while (--i);
}

void Delay_xms(uint x)
{
    
 uint i,j;
 for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}


void main()
{
    
	uint x,y;
	dir=1;//电机正转
	
 for( y = 0; y<6; y++) {
     //修改y值可以改变电机转的圈数
	 for( x = 0; x <=200; x++) {
         //一个圈200个脉冲
     step=1; 
     Delay1000us();
     step=0;
     Delay1000us(); 
  }
}	
 Delay_xms(1500);
	
	  dir=0;//电机反转
  for( y = 0; y<6; y++) {
     
	  for( x = 0; x <=200; x++) {
         
     step=1; 
     Delay1000us();//时间长短会影响电机运动
     step=0;
     Delay1000us(); 
  }
}
	 Delay_xms(1500);
	

2、Python(STM32)

from pyb import Pin, delay

p_dir = Pin('Y1', Pin.OUT_PP)
p_step = Pin('Y2', Pin.OUT_PP)

while True:

    p_dir.high

    for y in range(0, 6):
        for x in range(0, 201):
            p_step.high()
            pyb.udelay(1000)

            p_step.low()
            pyb.udelay(1000)

    pyb.delay(1500)
    p_dir.low

    for y in range(0, 6):
        for x in range(0, 201):
            p_step.high()
            pyb.udelay(1000)

            p_step.low()
            pyb.udelay(1000)

    pyb.delay(1500)

3、Verilog(FPGA)

module A4988(
    //input
    input        sys_clk,      //时钟信号50Mhz
    input        sys_rst_n,    //复位信号

 
    //output
	output  reg     dir,          // 电机转动方向
    output  reg  step          //电机脉冲信号

);



endmodule

注: 3点56分,实在太困了,Verilog的程序留着下次再更新(就当留个彩蛋,哈哈哈)。还有一些需要注意地方,可能一时没想到,也留着下次一起更新。

猜你喜欢

转载自blog.csdn.net/weixin_46423500/article/details/108571765