步进电机的一点收获

型号: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.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拍

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值