7. 步进电机

您所在的位置:网站首页 stm32驱动电机原理 7. 步进电机

7. 步进电机

2023-12-13 13:35| 来源: 网络整理| 查看: 265

7.6. 步进电机基础旋转控制¶

在本章前几个小节对步进电机的工作原理、特点以及驱动器的进行了详细的讲解, 本小节将对最基本的控制方法进行例举和讲解;

7.6.1. 硬件设计¶

介绍步进电机的电路与接线方法

隔离电路

步进电机光耦隔离部分电路

上图为原理图中的隔离电路,其中主要用到的是高速的光耦进行隔离,在这里隔离不仅可以防止外部电流倒灌, 损坏芯片,还有增强驱动能力的作用;并且在开发板这端已经默认为共阳极接法了,可以将步进电机的所有线按照对应的顺序接在端子上, 也可以在驱动器一端实现共阴或者共阳的接法。

接线方法

接线的方法可以查看 模块引脚说明 章节,里面有详细的介绍。

7.6.2. 软件设计¶

这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。 对于步进电机的基础控制部分,共使用了四种方式进行控制,层层递巩固基础。分别为:使用GPIO延时模拟脉冲控制、 使用GPIO中断模拟脉冲控制、使用PWM比较输出和使用PWM控制匀速旋转。

7.6.2.1. 第一种方式:使用GPIO延时模拟脉冲控制¶

编程要点

通用GPIO配置

GPIO结构体GPIO_InitTypeDef配置

封装stepper_turn()函数用于控制步进电机旋转

在main函数中编写轮询按键控制步进电机旋转的代码

宏定义

功能引脚相关宏定义¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34//引脚定义 /*******************************************************/ //Motor 方向 #define MOTOR_DIR_PIN GPIO_PIN_1 #define MOTOR_DIR_GPIO_PORT GPIOE #define MOTOR_DIR_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE() //Motor 使能 #define MOTOR_EN_PIN GPIO_PIN_0 #define MOTOR_EN_GPIO_PORT GPIOE #define MOTOR_EN_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE() //Motor 脉冲 #define MOTOR_PUL_PIN GPIO_PIN_5 #define MOTOR_PUL_GPIO_PORT GPIOI #define MOTOR_PUL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() /************************************************************/ #define HIGH GPIO_PIN_SET //高电平 #define LOW GPIO_PIN_RESET //低电平 #define ON LOW //开 #define OFF HIGH //关 #define CW HIGH //顺时针 #define CCW LOW //逆时针 //控制使能引脚 /* 带参宏,可以像内联函数一样使用 */ #define MOTOR_EN(x) HAL_GPIO_WritePin(MOTOR_EN_GPIO_PORT,MOTOR_EN_PIN,x) #define MOTOR_PLU(x) HAL_GPIO_WritePin(MOTOR_PUL_GPIO_PORT,MOTOR_PUL_PIN,x) #define MOTOR_DIR(x) HAL_GPIO_WritePin(MOTOR_DIR_GPIO_PORT,MOTOR_DIR_PIN,x)

使用宏定义非常方便程序升级、移植。如果使用不同的GPIO,修改这些宏即可。

步进电机引脚初始化

步进电机引脚初始化¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40/** * @brief 引脚初始化 * @retval 无 */ void stepper_Init() { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStruct; /*开启Motor相关的GPIO外设时钟*/ MOTOR_DIR_GPIO_CLK_ENABLE(); MOTOR_PUL_GPIO_CLK_ENABLE(); MOTOR_EN_GPIO_CLK_ENABLE(); /*选择要控制的GPIO引脚*/ GPIO_InitStruct.Pin = MOTOR_DIR_PIN; /*设置引脚的输出类型为推挽输出*/ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull =GPIO_PULLUP;// GPIO_PULLDOWN GPIO_PULLUP /*设置引脚速率为高速 */ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /*Motor 方向引脚 初始化*/ HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct); /*Motor 脉冲引脚 初始化*/ GPIO_InitStruct.Pin = MOTOR_PUL_PIN; HAL_GPIO_Init(MOTOR_PUL_GPIO_PORT, &GPIO_InitStruct); /*Motor 使能引脚 初始化*/ GPIO_InitStruct.Pin = MOTOR_EN_PIN; HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct); /*关掉使能*/ MOTOR_EN(OFF); }

步进电机引脚使用必须选择相应的模式和设置对应的参数,使用GPIO之前都必须开启相应端口时钟。 初始化结束后可以先将步进电机驱动器的使能先关掉MOTOR_EN(OFF),需要旋转的时候,再将其打开即可。

封装步进电机旋转函数

由于脉冲为模拟产生的所以必须使用模拟的方式来产生所需的特定脉冲

步进电机旋转函数¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35/** * @brief 步进电机旋转 * @param tim 方波周期 单位MS 周期越短频率越高,转速越快 细分为1时最少10ms * @param angle 需要转动的角度值 * @param dir 选择正反转(取值范围:0,1) * @param subdivide 细分值 * @note 无 * @retval 无 */ void stepper_turn(int tim,float angle,float subdivide,uint8_t dir) { int n,i; /*根据细分数求得步距角被分成多少个方波*/ n=(int)(angle/(1.8/subdivide)); if(dir==CLOCKWISE) //顺时针 { MOTOR_DIR(CLOCKWISE); } else if(dir==ANTI_CLOCKWISE)//逆时针 { MOTOR_DIR(ANTI_CLOCKWISE); } /*开使能*/ MOTOR_EN(ON); /*模拟方波*/ for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3