meiforsai 2024-09-22 15:05 采纳率: 0%
浏览 4

步进电机位置偏移问题

关于51单片机控制步进电机位置偏移的问题;写了步进电机正转和反转两个函数,单独运行正转或反转角度都是没有问题的,但先执行正转某个角度,然后再执行反转相同角度却回不到原来的位置,搞不明白什么情况,请大家指点一下,万分感谢!程序代码如下:

#include "Public.h"

sbit MA=P3^3; 
sbit MC=P3^2;
sbit MB=P3^1;
sbit MD=P3^0;

u8 step1=0,step2=0;

//busu为步数,0.9度每步。
//speed为速度,单位n*10微秒每步。
void motor_R(u16 busu,u16 speed)
{
u16 i=0;

    for(i=0;i<busu;i++)
    {
    if(step1==8)step1=0;
    switch(step1)
    {        
    case 0:MA=1;MB=0;MC=0;MD=0;break;
    case 1:MA=1;MB=1;MC=0;MD=0;break;
    case 2:MA=0;MB=1;MC=0;MD=0;break;        
    case 3:MA=0;MB=1;MC=1;MD=0;break;        
    case 4:MA=0;MB=0;MC=1;MD=0;break;        
    case 5:MA=0;MB=0;MC=1;MD=1;break;    
    case 6:MA=0;MB=0;MC=0;MD=1;break;
    case 7:MA=1;MB=0;MC=0;MD=1;break;        
    }    
    step1++;
    delay_10us(speed);
    }
    MA=0;MB=0;MC=0;MD=0;
}

void motor_L(u16 busu,u16 speed)
{
u16 i=0;

    for(i=0;i<busu;i++)
    {
    if(step2==8)step2=0;
    switch(step2)
    {        
    case 0:MA=1;MB=0;MC=0;MD=1;break;
    case 1:MA=0;MB=0;MC=0;MD=1;break;
    case 2:MA=0;MB=0;MC=1;MD=1;break;        
    case 3:MA=0;MB=0;MC=1;MD=0;break;        
    case 4:MA=0;MB=1;MC=1;MD=0;break;        
    case 5:MA=0;MB=1;MC=0;MD=0;break;    
    case 6:MA=1;MB=1;MC=0;MD=0;break;
    case 7:MA=1;MB=0;MC=0;MD=0;break;    
    }    
    step2++;
    delay_10us(speed);
    }
    MA=0;MB=0;MC=0;MD=0;
}


void main()
{
    u8 i=0;
    P3M0 |= 0x0f; P3M1 &= ~0x0f; 

    P5M0 = (P5M0 & ~0x20) | 0x10; P5M1 = (P5M1 & ~0x10) | 0x20; 
    delay_ms(1);

    P54=1;
    

    motor_R(800,100);
    delay_ms(1000);
    motor_L(800,100);
    delay_ms(1000);    


    while(1)
    {

    }
}

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-22 15:06
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码来看,步进电机的正反转控制逻辑是正确的,每次转动一定的步数(这里假设是8步完成一个完整旋转),然后延时一段时间。问题可能出在以下几个地方:

    1. 位置反馈:步进电机位置偏移的问题可能是由于没有准确的位置反馈机制。步进电机通常需要一个编码器或者其它位置传感器来反馈其当前位置。如果没有这样的反馈机制,那么在反转时,电机可能无法准确地回到起始位置。
    2. 步进电机的力矩和惯性:电机转动时存在惯性,尤其是在高速运行时,直接反向转动可能导致电机在物理上无法立刻改变方向,从而产生位置偏移。此外,电机的力矩也可能影响精确控制。
    3. 延时准确性:代码中使用了延时来控制电机的运动速度和运动时间。如果延时函数的准确度不够,会导致电机的运动时间和距离出现偏差。你可以考虑使用定时器或者其他更准确的时间控制方式。

    解决方案建议如下:

    1. 添加位置反馈机制:使用编码器或位置传感器来获取电机的实时位置,并在控制算法中加以利用。当电机转动到目标位置时,可以通过反馈信号来精确控制其停止位置。
    2. 调整电机参数和算法:考虑电机的力矩、惯性和运动速度等因素,调整电机的转动参数和算法,使其能够更好地适应不同的应用场景和需求。
    3. 优化延时函数:使用定时器或其他更准确的时间控制方式,以提高运动的精确度。

    希望这些建议能帮助你解决问题。如果还有其他疑问或需要进一步的帮助,请随时提问。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月22日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?