找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1676|回复: 15
收起左侧

51单片机通过步进电机驱动器控制两相步进电机问题

[复制链接]
ID:984161 发表于 2022-10-31 10:22 | 显示全部楼层 |阅读模式
请教一下各位大佬我现在目的是:步进电机的轴上接的一个套筒用来拧螺栓头,螺栓上带有一个扭力弹簧,通过51单片机给脉冲给步进电机驱动器,控制步进电机转动固定的角度,就给弹簧加了固定的扭力。(电机的力矩是13N*m,而我需要给弹簧预加的力矩是5N*m)

遇到的问题是:电机转动时和完全停止后我感觉力矩是足够用的,弹簧的力也不会使电机失步或者反转。但是在电机转动到设定的角度时,停止的一瞬间,感觉力矩会丢失一瞬间。导致弹簧的力会使电机回转1~2个步距角,就感觉电机的力矩不够一样,但是停止后就稳定了。请教一下这是什么问题?感谢赐教。
另外:①开关电源的电流选型是够了的,比电机的额定电流大。
                ②驱动器的电流开关是设置对了的,与电机匹配

回复

使用道具 举报

ID:984161 发表于 2022-10-31 10:27 | 显示全部楼层
程序如下,因为我接了一个脚踏开关,踩一下计数,并且数码管显示,所以7219各位可以忽略,只关注电机部分就可以了。
#include<reg52.h>

sbit PUL = P1^0;
sbit DIR = P1^1;
sbit Max7219_pinCLK = P1^6;
sbit Max7219_pinCS  = P1^5;
sbit Max7219_pinDIN = P1^4;
sbit KEY = P1^3;

unsigned int puls;

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

void Write_Max7219_byte(unsigned char DATA)         
{
            unsigned char i;   
                Max7219_pinCS=0;               
            for(i=8;i>=1;i--)
          {                  
            Max7219_pinCLK=0;
            Max7219_pinDIN=DATA&0x80;
            DATA=DATA<<1;
            Max7219_pinCLK=1;
           }                                 
}

void Write_Max7219(unsigned char address,unsigned char dat)
{
     Max7219_pinCS=0;
         Write_Max7219_byte(address);        
     Write_Max7219_byte(dat);               
         Max7219_pinCS=1;                        
}

void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xFF);
Write_Max7219(0x0a, 0x03);      
Write_Max7219(0x0b, 0x07);      
Write_Max7219(0x0c, 0x01);      
Write_Max7219(0x0f, 0x00);      
}



void StepMotorRun();
void Delay200us();
void DesplayLed();

unsigned char LED[8] = {0,0,0,0,0,0,0,0};
unsigned char code LedChar[] = {  //数码管显示字符转换表
    0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,0x8,0x9
};

unsigned long sec=0;
bit flag = 1;

void main()
{
        DIR = 1;
        Delay_xms(50);
        Init_MAX7219();
        Delay_xms(2000);
        Write_Max7219(0x0f, 0x00);         //显示测试:1;测试结束,正常显示:0
        while(1)
        {
                DesplayLed();
                if(KEY != flag)
                {
                        flag = KEY;
                        Delay_xms(10);
                        if(KEY == 0)
                        {
                                sec++;
                                StepMotorRun();
                        }
                }       
        }
}

void StepMotorRun()
{
        puls = 1600;
        while(puls--)
        {
                PUL = 0;
                Delay200us();
                PUL = 1;
                Delay200us();
        }

}

void Delay200us()                //@12.000MHz
{
        unsigned char i, j;

        i = 3;
        j = 82;
        do
        {
                while (--j);
        } while (--i);
}



void DesplayLed()
{
        unsigned char j;
        LED[0] = LedChar[sec%10];
        LED[1] = LedChar[sec/10%10];
        LED[2] = LedChar[sec/100%10];
        LED[3] = LedChar[sec/1000%10];
        LED[4] = LedChar[sec/10000%10];
        LED[5] = LedChar[sec/100000%10];
        LED[6] = LedChar[sec/1000000%10];
        LED[7] = LedChar[sec/10000000%10];
        for(j=7;j>=1;j--)
        {
                if(LED[j] == 0)
                        LED[j] = 0xF;
                else
                        break;
        }
        Write_Max7219(1,LED[0]);
        Write_Max7219(2,LED[1]);
        Write_Max7219(3,LED[2]);
        Write_Max7219(4,LED[3]);
        Write_Max7219(5,LED[4]);
        Write_Max7219(6,LED[5]);
        Write_Max7219(7,LED[6]);
        Write_Max7219(8,LED[7]);
}

驱动器

驱动器

开关电源

开关电源

整体图片

整体图片
回复

使用道具 举报

ID:984161 发表于 2022-10-31 11:45 | 显示全部楼层
另外驱动器SW4打开了,设置的是停转时全流
回复

使用道具 举报

ID:984161 发表于 2022-10-31 11:46 | 显示全部楼层
另外驱动器SW4已经打开,设置为停转时全流
回复

使用道具 举报

ID:883242 发表于 2022-10-31 12:03 | 显示全部楼层
代码里面看不到ENA。

按说停止的时候不撤销ENA,步进电机还是有力量的。
回复

使用道具 举报

ID:955673 发表于 2022-10-31 12:03 | 显示全部楼层
用了细分?细分是虚的
回复

使用道具 举报

ID:984161 发表于 2022-10-31 13:15 | 显示全部楼层
Hephaestus 发表于 2022-10-31 12:03
代码里面看不到ENA。

按说停止的时候不撤销ENA,步进电机还是有力量的。

我采用的共阳接法,ENA+接的5V,ENA-接的IO口,程序里面没有动ENA+,接的IO口默认是高电平。ENA一直没有通,按理说不管任何时候电机的力矩应该都满足我需求了,但就是感觉停止的一瞬间好像力不够了,会回转几个步距角一样。
回复

使用道具 举报

ID:984161 发表于 2022-10-31 13:32 | 显示全部楼层
冰火风轮 发表于 2022-10-31 12:03
用了细分?细分是虚的

用的细分1600,但是最小的细分400也是这种情况。请问脉冲宽度对力矩有影响吗?是不是脉冲200us的影响?
回复

使用道具 举报

ID:883242 发表于 2022-10-31 14:17 | 显示全部楼层
细分只是噪音低,力矩是不如不细分的。
回复

使用道具 举报

ID:123289 发表于 2022-11-1 15:22 | 显示全部楼层
照你说的现象。
建议再多转1~2步。
回复

使用道具 举报

ID:984161 发表于 2022-11-2 16:40 | 显示全部楼层
Hephaestus 发表于 2022-10-31 14:17
细分只是噪音低,力矩是不如不细分的。

我把细分调到400,再试试看,谢谢
回复

使用道具 举报

ID:984161 发表于 2022-11-2 16:41 | 显示全部楼层
yzwzfyz 发表于 2022-11-1 15:22
照你说的现象。
建议再多转1~2步。

好的,多谢建议,我把细分调到最小,再把脉冲宽度加大,转速降低试试看。
回复

使用道具 举报

ID:1044091 发表于 2022-11-2 18:00 来自手机 | 显示全部楼层
你是不是一直没用使能信号?根据我的经验,步进电机使能时若无脉冲是锁定状态,有脉冲就转,不使能就是自由状态,当然没力了。如果还不行建议考虑机构自锁,如蜗轮蜗杆机构。
回复

使用道具 举报

ID:844772 发表于 2022-11-3 09:27 | 显示全部楼层
弄好了吗?我想问这个系统是不是对旋转角度特别敏感啊?因为我认为可能是机械原因:1、步进电机每步转的角度并不一样;2、要考虑旋转的角动量,所以我也建议多走两步,如果软件调不出来就要考虑加减速齿轮了。
回复

使用道具 举报

ID:984161 发表于 2022-11-10 17:19 | 显示全部楼层
ningsy 发表于 2022-11-2 18:00
你是不是一直没用使能信号?根据我的经验,步进电机使能时若无脉冲是锁定状态,有脉冲就转,不使能就是自由 ...

使能接口不进行任何操作的时候就是电机不接收脉冲的时候仍然保持力矩,我现在就是这样设定的。不然到最后弹簧的力肯定会使电机轴回转的。
回复

使用道具 举报

ID:984161 发表于 2022-11-10 17:22 | 显示全部楼层
glinfei 发表于 2022-11-3 09:27
弄好了吗?我想问这个系统是不是对旋转角度特别敏感啊?因为我认为可能是机械原因:1、步进电机每步转的角 ...

因为我需要的状态是每次转动固定的角度,这样才能给弹簧预加相同的预紧力,最后产品才能一致。多走两步倒容易实现,多几个脉冲就好了,但是停止的一瞬间还是会遇到这样的问题。问题主要出现在脉冲停止的瞬间,仿佛电机的保持力矩不够一样,弹簧力会使轴回转一两步。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表