【开源】STM32步进电机控制


前言

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

一、步进电机驱动

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

二、控制原理

使用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;
	}
}

四、 效果展示

用编码器手动控制步进电机效果,完整代码已开源到GitHub,点击下载
在这里插入图片描述

  • 18
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是一款常用的微控制器,步进电机是一种常见的电机,在许多领域都有广泛的应用,如机械臂、3D打印机、数码摄影等。步进电机的控制需要编写程序,下面我将介绍STM32步进电机程序的编写。 首先,我们需要了解步进电机的原理。步进电机是一种转动固定角度的电动机,它通过指令来旋转一定的角度。因此,我们需要编写程序控制步进电机的转动。 其次,我们需要选择一个合适的开发板,例如 STM32F103C8T6,它相对于其他开发板来说,价格便宜,性能好,可以满足步进电机控制的要求。 接着,我们需要选择合适的编程语言,STM32可使用多种编程语言,例如C语言、汇编语言、Python。其中,C语言是最常用的一种。 然后,我们需要学习STM32步进电机控制的开发库,例如HAL库、LL库等。HAL库是一种高级别的库,它提供了许多函数,简化了开发流程。LL库是一种低级别的库,它提供的函数更加底层,需要更多的代码实现。 最后,我们需要编写程序进行步进电机的控制。编写程序的步骤包括:初始化电机、设置速度、设置角度、启动电机等。通过对程序的调试,我们可以实现步进电机的控制。 总之,STM32步进电机程序的编写需要我们具有一定的电机控制知识、开发板选择、编程语言学习、开发库学习以及程序编写的能力。同时,我们需要通过实践来加深自己的掌握程度,从而更好地掌握步进电机的控制技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值