131 1300 0010
电机伺服
当前位置: 首页>> 电源技术>>电机伺服>>
  • 导航栏目
  • 逆变电源
  • 开关电源
  • 电机伺服
  • 其他电源
  • 如何使用脉冲加方向方式对步进电机进行位置的自由控制
    如何使用脉冲加方向方式对步进电机进行位置的自由控制
  • 如何使用脉冲加方向方式对步进电机进行位置的自由控制
  •   发布日期: 2022-10-15  浏览次数: 1,127

    总体介绍

    步进电机的控制通常使用PWM控制,改变频率来控制速度,然后统计脉冲个数知道电机当前位置,可以很容易实现加减速规划,或者不考虑加减速平稳性,直接以小于最大启动速度的速度启动,发完给定个脉冲后直接关闭定时器。以上控制方式都没实现对步进电机的位置的自由控制,即让步进电机跟随任意位置曲线运动,此项目是为了实现步进电机的自由控制,能准确定位。可以使用编码器或者电位器作为控制器,用手拧编码器,步进电机可跟随一起运动,也可以按照函数曲线运动。

    步进电机驱动

    步进电机驱动器有很多种,如A4988、TMC2208等,常用的驱动方式是脉冲加方向,有的高端点的使用can、串口等方式控制。本篇介绍如何使用脉冲加方向方式对步进电机进行位置的自由控制!

    控制原理

    使用通信协议方式控制步进电机,可周期性同步位置到驱动器,实现位置的自由控制,脉冲加方向方式也可抽象为使用通信协议在与驱动器通信,只不过是使用增量方式在通信,通过对脉冲的累计得到目标位置。

    程序使用两个定时器,一个中断频率为1k,用于周期采样目标位置,并计算当前速度,当前速度值用于修改另一个定时器中断频率,所以在第二个定时器中判断目标位置与当前位置的偏差,然后翻转电平,实现对脉冲发送,同时判断方向,对应控制方向控制IO电平。

    在其他函数中可给定任意形式的位置变化,根据采样定理,应该位置变化频率不大于500Hz的都能被1k的定时器中断正常采样,由于发送脉冲需要以一定的频率发送,所以第二个定时器频率根据目标位置变化率而改变,可以让速度平滑,也可以减小CPU带宽占用。以此方式可实现对步进电机的自由控制,可使用编码器或函数随意控制电机!

    代码分析

    此程序可实现对多个步进电机的控制,以下是步进电机类

    /*步进电机控制类*/

    typedef struct 

    {

        volaTIle unsigned long  *gpio_dir; //电机方向控制GPIO

        volaTIle unsigned long  *gpio_pluse; //电机脉冲GPIO

        int pluse_count;

        int goal_posiTIon;

        int last_posiTIon;

        int cur_position;

        int pos_bias;

        int speed;

        uint8_t status;

    }stepMotor;

    步进电机控制核心函数,由一个简易状态机组成,此函数放上面提到的第二个中断函数执行,先得到当前偏差,状态转换,再发脉冲

    void StepMotorCtrl(stepMotor *motor)

    {

    switch(motor->status)

    {

    case 0:

    if(motor->goal_position != motor->cur_position)  //扫描

    {

    motor->pos_bias = motor->goal_position - motor->cur_position; //得到偏差

    motor->status = 1;

    }

    break;

    case 1:

    if(motor->pos_bias > 0)

    {

    motor->pluse_count ++;

    *(motor->gpio_dir) = 1;  //正方向

    *(motor->gpio_pluse) = !*(motor->gpio_pluse);

    if(motor->pluse_count == (motor->pos_bias * 2))

    {

    motor->cur_position += motor->pos_bias;

    motor->pluse_count = 0;

    motor->status = 0;

    }

    }

    else

    {

    motor->pluse_count ++;

    *(motor->gpio_dir) = 0;  //负方向

    *(motor->gpio_pluse) = !*(motor->gpio_pluse);

    if(motor->pluse_count == ((-motor->pos_bias) * 2))

    {

    motor->cur_position += motor->pos_bias;

    motor->pluse_count = 0;

    motor->status = 0;

    }

    }

    break;

    default:

    break;

    }

    }


  • ·上一篇:
    ·下一篇:
  • 其他关联资讯
    深圳市日月辰科技有限公司
    地址:深圳市宝安区松岗镇潭头第二工业城A区27栋3楼
    电话:0755-2955 6626
    传真:0755-2978 1585
    手机:131 1300 0010
    邮箱:hu@szryc.com

    深圳市日月辰科技有限公司 版权所有:Copyright©2010-2023 www.szryc.com 电话:13113000010 粤ICP备2021111333号