资料下载:待更新。。。。
先驱动起来再说,干中学!!!
1、实现功能
STM32同时驱动4个步进电机,支持单独调速与正反转控制
需要资源:16个任意IO口+1ms定时器中断
【28BYJ-48】STM32同4个步进电机正反转与调速
一、28BYJ-48 步进电机
28BYJ-48 是一款常见的四相八拍式步进电机,它由定子和转子两部分组成。定子上有四组绕组,按照一定的顺序通电,就能产生旋转磁场,吸引转子转动。
其步距角通常为 5.625°/64(约 0.08789°,这里的 64 是八拍驱动方式下细分后的步数),这意味着电机每接收到一个脉冲信号,转子就会精确地转动一个微小的角度,通过连续不断地给脉冲,实现电机的连续旋转。
电机参数
工作电压:一般为 5V - 12V,常见的是 5V 供电,这使得它可以方便地与微控制器(如 STM32)直接配合使用,无需复杂的电压转换电路。
相电阻:每相绕组的电阻值在几十欧姆到上百欧姆不等,例如典型值约为 200Ω 左右,这个参数影响电机的电流和驱动电路的设计。
扭矩:它的扭矩相对较小,适用于一些对驱动力要求不高的轻载场合,如小型自动化设备的指针转动、简易机器人关节的微调等,一般启动力矩在 30 - 40gf.cm 左右。
二、ULN2003 驱动模块
功能概述
ULN2003 是一个高耐压、大电流达林顿阵列集成电路,主要用于驱动感性负载,如步进电机、继电器等。它内部集成了 7 个 NPN 达林顿复合晶体管,在驱动 28BYJ-48 步进电机时,通常只用其中 4 个通道对应电机的四相绕组。
工作原理
当微控制器(如 STM32)的引脚输出高电平信号给 ULN2003 的输入端时,对应的达林顿管导通,将电机绕组与电源接通;当输入低电平时,达林顿管截止,绕组断电。通过控制 4 个输入引脚的电平序列,按照特定的时序给电机绕组通电,就能驱动电机旋转。
它还具有续流二极管,当电机绕组断电时,为绕组产生的感应电动势提供泄放回路,保护驱动芯片和其他电路元件,防止反向电压击穿。
电气特性
输出电流能力:每路输出可承受最大 500mA 的电流,足以驱动 28BYJ-48 电机,因为该电机在正常运行时每相电流一般在几十毫安。
耐压值:集电极 - 发射极耐压可达 50V,这为电机在不同电压供电情况下提供了足够的电压裕量,确保可靠工作。
三、STM32 驱动代码实现
#include "stm32f10x.h" //STM32库函数的头文件
#include "timer.h" //STM32定时器
#include "step_motor.h" //步进电机驱动
int main(void) //主函数
{
SystemInit();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2组中断分
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE); //打开GPIO口时钟,先打开复用才能修改是否停用复用功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //能用PB3,PB4,PA15做普通IO,PA13&14用于SWD调试
TIM2_Int_Init(99,719); //72000000HZ/(99+1)/(719+1)=1000HZ 1ms中断
Step_Motor_Init1();
stepmotor_speed1 = 4; //5ms一个脉冲
stepmotor_set1 = -4096; //4096为一圈,设置电机反转一圈
Step_Motor_Init2();
stepmotor_speed2 = 3; //4ms一个脉冲
stepmotor_set2 = 4096;
Step_Motor_Init3();
stepmotor_speed3 = 2; //3ms一个脉冲
stepmotor_set3 = 4096;
Step_Motor_Init4();
stepmotor_speed4 = 1; //2ms一个脉冲//速度 360*1000/(1+1)*4096 = 43.965°/s
stepmotor_set4 = 4096;
while(1)
{
}
}
void TIM2_IRQHandler(void) //TIM2中断
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
stepmotor_run1();
stepmotor_run2();
stepmotor_run3();
stepmotor_run4();
}
}
3、修改引脚
通过宏定义快速修改引脚
/* 步进电机1参数宏 */
/* A相 */
#define LA_GPIO_PORT1 GPIOA
#define LA_GPIO_PIN1 GPIO_Pin_9
#define LA_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* B相 */
#define LB_GPIO_PORT1 GPIOA
#define LB_GPIO_PIN1 GPIO_Pin_10
#define LB_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* C相 */
#define LC_GPIO_PORT1 GPIOA
#define LC_GPIO_PIN1 GPIO_Pin_11
#define LC_GPIO_CLK1 RCC_APB2Periph_GPIOA
/* D相 */
#define LD_GPIO_PORT1 GPIOA
#define LD_GPIO_PIN1 GPIO_Pin_12
#define LD_GPIO_CLK1 RCC_APB2Periph_GPIOA