STM32驱动步进电机(附原工程)

一、引言

本文旨在分享STM32对步进电机的驱动方法和代码工程(文末附工程连接)。初衷是我刚开始学者使用STM32驱动步进电机时,在优快云上查阅了很多资料,好多都是只分享部分代码,有原工程的资源都需要付费!!!所以在我成功驱动步进电机后,我决定把驱动工程开源,以供和我一样的学者学习指导!

二、硬件准备 

1、单片机

这里我使用的是STM32F103C8T6,学者使用其他单片机也是可以的,关键看代码中的思路!

2、驱动模块

关于这个驱动模块的接线图,请看下图:

3、步进电机 

三、驱动的详细操作说明

这里我把搜集到的有关驱动如何使用的详细说明再列举一下,以方便大家加深理解,同时也是我对自己所学知识点的总结共享。

 四、关键代码

1、电机的初始化配置,相关引脚配置

#include "sm.h"

//num用于对引脚的索引,j用于计算步数,fx为电机旋转方向
unsigned short int num=0,j,fx;

void dj_GPIO_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB
 GPIO_ResetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);						 //PB.5/6/7/8 输出低电平
}

void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}

static uint8_t GPIO_list[] = {0x01,0x02,0x04,0x08};     //对应驱动器4引脚,即电机4相

void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
			if(judge == 0)
			{
			  judge=0;
			}
			if(judge == 1)
			{
				 if(fx == 0)  //fx为电机旋转方向,fx=0时电机正转,fx=1时电机反转
		     {
					 dj_GPIO1 = ~(GPIO_list[num]&GPIO_list[0])>>0;  //判断是否为引脚1,然后将其数值向右移动0位至第1位,得到unsigned int类型时的1或0
					 dj_GPIO2 = ~(GPIO_list[num]&GPIO_list[1])>>1;  //判断是否为引脚2,然后将其数值向右移动1位至第1位,得到unsigned int类型时的1或0
					 dj_GPIO3 = ~(GPIO_list[num]&GPIO_list[2])>>2;  //判断是否为引脚3,然后将其数值向右移动2位至第1位,得到unsigned int类型时的1或0
					 dj_GPIO4 = ~(GPIO_list[num]&GPIO_list[3])>>3;  //判断是否为引脚4,然后将其数值向右移动3位至第1位,得到unsigned int类型时的1或0
			 	 }
				 if(fx == 1)
				 {
					 dj_GPIO4 = ~(GPIO_list[num]&GPIO_list[0])>>0;  //上述的反转
					 dj_GPIO3 = ~(GPIO_list[num]&GPIO_list[1])>>1;
					 dj_GPIO2 = ~(GPIO_list[num]&GPIO_list[2])>>2;
					 dj_GPIO1 = ~(GPIO_list[num]&GPIO_list[3])>>3;
				 }
				 num += 1;  //num用于对引脚的索引
				 j += 1;  //j用于计算步数
				 if(num == 4)  //到第4个GPIO后回到第1个GPIO
				 {
				   num = 0;
				 }
		     if(j == 2048&fx == 0)  //走完一圈同时是正转结束,对参数进行修改
		     {
					 j = 0;
					 fx = 1;
					 num = 0;
		     }
				 if(j == 2048&fx == 1)  //走完一圈同时是反转结束,对参数进行修改
				 {
					 j = 0;
					 fx = 0;
					 start = 0;
					 num = 0;
				 }
			}
		}
}

 2、主函数

/*

硬件连接方式如下:
		驱动器ULN2003:IN1-->PB8
									 IN2-->PB7
									 IN3-->PB6
									 IN4-->PB5
									 +、-连接电源5-12v
									 连接电机
		CH340:TXD-->PA10
		       RXD-->PA9
					 GND-->单片机GND
					 5V-->单片机5V

*/

#include "usart.h"
#include "delay.h"
#include "sm.h"
#include "Decode.h"

u8 judge = 0;  //judge为1时电机开始旋转,为0时停止
u8 start = 0;  //start为1时启动电机程序,为0时关闭

void run(void)  //电机启动程序
{
	if(start == 1) {judge = 1;}
	else {judge = 0;}
}

int main(void)
{
	delay_init();	    	 // 延时函数初始化
  dj_GPIO_Init();      // 电机初始化
	
	uart_init(115200);  //串口初始化
	
	judge = 0;  //电机停止运作
	start = 0;  //电机启动程序停止运作
	TIM3_Int_Init(19,7199);   //电机运行使用的定时器,72MHz,时间: 2ms = 20*7200/72000000s

	while(1)
	{
	 if(USART_RX_STA&0x8000)  //USART_RX_STA标志最高位置1(接收完成了)
	 {
		 Code_Analysis((u8*)USART_RX_BUF);  //判断接收数据是否正确
	 }
    run();  //电机启动程序
  }
}

 五、工程分享

完整的代码驱动工程,大家可以到微信公众号中获取,微信公众号中回复:“stm32步进电机”

六、结语

如果有疑问,大家可以下方评论或者私信我,收到后我会第一时间回复大家!

### 回答1: STM32F103步进电机控制推杆,可以通过设置GPIO引脚和定时器来实现。 首先,需要配置GPIO引脚作为控制步进电机的接口。可以选择适当的引脚,例如PA0、PA1、PA2和PA3等作为控制步进电机的四个相位线IN1、IN2、IN3和IN4。使用STM32的GPIO库函数,可以将这些引脚设置为输出模式。 其次,需要使用一个定时器来生成控制步进电机的脉冲信号。可以选择一个合适的定时器,例如TIM2或TIM3等。配置定时器的计数模式为向上计数,并设置合适的计数值和分频系数,以确定生成脉冲的频率。 然后,编写步进电机控制程序。可以使用循环控制语句来不断改变GPIO引脚的输出状态,以产生步进电机的旋转。具体可以依照步进电机的工作理,按照相应的顺序控制四个相位线的输出状态。 最后,将步进电机控制程序与定时器中断绑定。当定时器计数到一定值时,触发定时器中断,并在中断函数中调用步进电机控制程序,从而实现步进电机的控制和推杆的运动。 综上所述,通过配置GPIO引脚和定时器,并编写相应的控制程序,可以实现对STM32F103步进电机控制推杆的功能。 ### 回答2: 为了使用STM32F103控制步进电机推杆,我们需要采用适当的电路连接和编程实现。步进电机是一种用于精确控制位置和速度的设备。 首先,我们需要将STM32F103与步进电机连接起来。我们可以通过一个适当的电路连接步进电机的控制信号引脚(如步进脉冲和方向脉冲)到STM32F103的GPIO引脚。同时,我们还需要将步进电机的电源引脚连接到适当的电源电压。 接下来,我们需要编写相应的程序来控制步进电机推杆的运动。首先,我们需要配置STM32F103的GPIO引脚作为输出,并设置相应的引脚状态和电平。然后,我们可以使用适当的控制算法来生成适当的脉冲序列,以控制步进电机的转动。 控制算法可以根据需求选择,例如可以使用简单的全或无的策略控制步进电机的转动,也可以使用更复杂的微调算法来实现更精准的控制。 最后,我们需要将程序烧录到STM32F103的存储器中,并确保正确运行。我们可以使用适当的开发工具和编程语言(如C或C++)来编写和烧录程序。 总结来说,要使用STM32F103控制步进电机推杆,需要进行适当的电路连接和编程实现。通过配置GPIO引脚和编写相应的控制算法,我们可以实现对步进电机推杆的精确控制。这种控制可以用于许多应用,例如机械臂、数控机床等。 ### 回答3: STM32F103可以用于控制步进电机控制推杆。步进电机是一种特殊的电机,可以按照固定的角度或者步数旋转。推杆是一种直线运动装置,可以通过步进电机的旋转来实现线性推动。 首先,我们需要将步进电机连接到STM32F103的适当引脚上。步进电机通常有两个相位,每个相位有两个线圈。我们将线圈的两端连接到STM32F103的输出引脚,并使用合适的电源和电流限制器为步进电机供电。 接下来,我们需要编写STM32F103的代码来控制步进电机。可以利用STM32F103的GPIO功能来设置输出引脚。通过改变输出引脚的状态(高电平或低电平),我们可以控制步进电机的旋转方向和速度。 为了实现步进电机控制推杆,我们需要采用适当的步进电机驱动方式。最常见的步进电机驱动方式是全步进驱动和半步进驱动。全步进驱动提供更大的扭矩和准确度,而半步进驱动提供更高的分辨率和平滑度。 在代码中,我们可以通过改变输出引脚的状态来控制步进电机的旋转方向和速度。可以使用定时器来生成适当的脉冲信号,从而驱动步进电机旋转。通过控制脉冲数量和频率,可以控制步进电机的旋转角度和速度。 最后,我们可以使用编程语言(如C语言)编写代码来实现步进电机控制推杆的逻辑。我们可以编写一些函数或者类来控制步进电机的旋转和推动。通过调用这些函数或者类的方法,我们可以实现步进电机控制推杆的功能。 总结起来,利用STM32F103可以通过控制步进电机的旋转来实现推杆的线性推动。通过编写适当的代码和配置合适的硬件连接,我们可以灵活地控制步进电机的旋转方向和速度,实现步进电机控制推杆的应用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小_扫地僧

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值