上节代码问题
传送门:STM32控制ULN2003驱动步进电机28BYJ-48最基础方法
上节代码应该是能搜到的控制ULN2003驱动步进28BYJ-48最通用的方法了,但是上节代码的执行会导致整个系统进行阻塞。如果电机运转10圈可能导致41s的阻塞时间,这对于任何系统工程都是致命的。
在这41s中整个cpu都在改变IO口状态和delay_ms中循环,主要流程如下:
A相 --> delay_us(1000) --> AB相 --> delay_us(1000) --> B相 --> delay_us(1000) --> BC相 --> delay_us(1000) --.... --> delay_us(1000) --> A相 --> ....
其他任务得不到及时执行,这对于CPU是一种浪费,同时极大的影响系统及时性。
分析原因主要是由于delay_us(1000)造成的。
改进改进
本节将仍然采用八拍(天龙八步),即1-2相驱动方式驱动,电机旋转函数中将不再使用delay_us(1000),而是将每步相位的保持时间放在定时器函数中进行,基本可以实现异步控制步进电机,同时执行其他程序进行。本教程采用STM32F103驱动ULN2003控制步进电机28BYJ-48运转。传送门:STM32控制ULN2003步进电机最基础方法
改进步进电机程序
- 在step_motor.h中进行端口宏定义:
/* 步进电机1参数宏 */
#define LA PAout(1) /* A相 */
#define LB PAout(2) /* B相 */
#define LC PAout(3) /* C相 */
#define LD PAout(4) /* D相 */
/* A相 */
#define LA_GPIO_PORT GPIOA
#define LA_GPIO_PIN GPIO_Pin_1
#define LA_GPIO_CLK RCC_APB2Periph_GPIOA
/* B相 */
#define LB_GPIO_PORT GPIOA
#define LB_GPIO_PIN GPIO_Pin_2
#define LB_GPIO_CLK RCC_APB2Periph_GPIOA
/* C相 */
#define LC_GPIO_PORT GPIOA
#define LC_GPIO_PIN GPIO_Pin_3
#define LC_GPIO_CLK RCC_APB2Periph_GPIOA
/* D相 */
#define LD_GPIO_PORT GPIOA
#define LD_GPIO_PIN GPIO_Pin_4
#define LD_GPIO_CLK RCC_APB2Periph_GPIOA
- 在step_motor.c中初始化端口,代码如下:
/**
* @name: Step_Motor_Init
* @description: 步进电机初始化端口
* @param {*}
* @return {*}
*/
void Step_Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LA_GPIO_CLK | LB_GPIO_CLK | LC_GPIO_CLK | LD_GPIO_CLK, ENABLE);
/* A相端口初始化 */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = LA_GPIO_PIN;
GPIO_Init(LA_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LB_GPIO_PIN;
GPIO_Init(LA_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LC_GPIO_PIN;
GPIO_Init(LA_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LD_GPIO_PIN;
GPIO_Init(LA_GPIO_PORT, &GPIO_InitStruct);
GPIO_ResetBits(LA_GPIO_PORT, LA_GPIO_PIN);
GPIO_ResetBits(LB_GPIO_PORT, LB_GPIO_PIN);
GPIO_ResetBits(LC_GPIO_PORT, LC_GPIO_PIN


5631

被折叠的 条评论
为什么被折叠?



