步进电机的一点收获

举报
ReCclay 发表于 2022/02/22 00:25:16 2022/02/22
【摘要】 型号:17HD40007-22B 步进电机 两相四拍,步距角为1.8° 最终代码: #include <reg52.h> sbit LeftA1 = P1^0; sbit LeftA...

型号:17HD40007-22B 步进电机
两相四拍,步距角为1.8°

最终代码:

#include <reg52.h>


sbit LeftA1 = P1^0;
sbit LeftA2 = P1^1;
sbit LeftB1 = P1^2;
sbit LeftB2 = P1^3;
sbit EnLeft = P2^3;

sbit RightA1 = P1^4;
sbit RightA2 = P1^5;
sbit RightB1 = P1^6;
sbit RightB2 = P1^7;
sbit EnRight = P2^4;

unsigned char T0RH;
unsigned char T0RL;
signed long LeftBeats = 0;
signed long RightBeats = 0;

void ConfigTimer0(unsigned int ms);
void StartLeftMotor(signed long angle);
void StartRightMotor(signed long angle);


unsigned char code BeatCode[8] = {//不同的引脚驱动代码不一样
    0xE,0xA,0xB,0x9,0xD,0x5,0x7,0x6
};

void main()
{
    EA = 1; 
    EnLeft = 0;
    EnRight = 0;
    ConfigTimer0(3);//此值越大,转的越慢
    StartLeftMotor(360*25);//调整转的角度
    StartRightMotor(360*25);

    while (1);
}

void StartRightMotor(signed long angle)
{
    EnRight = 1;
    EA = 0;
    RightBeats = (angle*400)/360;
    EA = 1;
}

void StartLeftMotor(signed long angle)
{
    EnLeft = 1;
    EA = 0;
    LeftBeats = (angle*400)/360;
    EA = 1;
}

void LeftMotor()
{
    unsigned char tmp; 
    static unsigned char index = 0; 


    if(LeftBeats != 0)
    {
        if(LeftBeats > 0)
        {        
            index++;                   
            index = index & 0x07;
            LeftBeats--;       
        } 
        else
        {
            index--;
            index = index & 0x07;
            LeftBeats++;
        } 

        tmp = P1;                   
        tmp = tmp & 0xF0;            
        tmp = tmp | BeatCode[index];
        P1  = tmp;               
    }
    else
    {
        P1 = P1 | 0x0F;
    }  
}

void RightMotor()
{
    unsigned char tmp;
    static unsigned char index = 0;

    if(RightBeats != 0)
    {
        if(RightBeats > 0)
        {
            index--;
            index = index & 0x07;
            RightBeats--;
        }
        else
        {
            index++;
            index = index &0x07;
            RightBeats++;
        }
        tmp = P1;
        tmp &= 0x0F;
        tmp |= (BeatCode[index]<<4);
        P1 = tmp;
    }
    else
    {
        P1 = P1 | 0xF0;
    }
}

void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;

    tmp = 12000000/12;
    tmp = (tmp * ms)/1000;
    tmp = 65536 - tmp;
    tmp = tmp + 2;
    T0RH = (unsigned char)(tmp >> 8);
    T0RL = (unsigned char)tmp;
    TH0 = T0RH;
    TL0 = T0RL;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    ET0 = 1;
    TR0 = 1;        
}
void InterruptTimer0() interrupt 1
{   
    TH0 = T0RH;
    TL0 = T0RL;
    LeftMotor();
    RightMotor();                                                                                                                                              
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143

注意启动频率,不要那么快,不然会跟不上,出现乱颤的情况。

如果没有细分,那么步进电机每接受一个脉冲,就会转动一个步距角。.当我们不细分的时候,假如步进电机是1.8度的话,那就是二百个脉冲每转360度,二个细分就是四百个,总之就是再次细分的意思,精度更高

很明显,在此处我是进行了细分。变成了二相八拍,步距角更加精确变为0.9

附一张关于步进参数图:
这里写图片描述

驱动数组书写原理:

这里写图片描述

对比教程28BYJ

常见的5线4相的步进电机 24BYJ48
因为24BYJ48 步进电机是自带 1/64 减速比的步进电机,也就是内部转64圈外部齿轮转一圈,所以步距角相对别的步进电机而言,更加精确

步距角:5.625 / 64 = 0.087度 (也就是说理论上,你给一个脉冲,电机外部轴转动0.087度) 减速比 :1/64

步进电机的 扭矩 和 其驱动方式 驱动频率 输入电压 有着直接的关系,以28BYJ48为例

输入电压(V) 频率(HZ) 转矩(gf.cm) 5 100

= 250 12 100 >=500 驱动方式:四相八拍驱动

一个电机你所采用的励磁方式不同,你所得到的步进角也是不一样的,参数上所说的步进角,表示的是用四相八拍这种励磁方式的所能达到的最大精度。

这里写图片描述

28BYJ有减速比1:64,也就是里面转64圈,外面转一圈。而里面转一圈需要64节拍,转64圈需要4096拍。
而由于制造误差实际大概为4076拍

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/75738264

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。