前言
lmf老师来帮我解决42步进电机“预转不转”的问题,利用引脚模拟pwm波形驱动42步进电机,成功找到原因,还顺便给我留下了另一种驱动思路——直接引脚驱动。
解决问题
42电机原地不动的原因是:线接触不良(采用杜邦线拼接)
拟解决方案:重新换线
老师的解决流程:先测试代码是否有问题,检测电路板,检测接线,测试其他电机,怀疑线路、测试线路完好的电机,成功解决!!——线不行
我的流程也差不多,缺少了“怀疑线路"这一步,导致我一直找不到原因。当然我一开始也有怀疑过,只不过是因为它能成功运行过一段时间,所以我觉得很可能是定时器配置不对。导致我调了半个月!!!
简洁代码
过于简单,只显示主函数的一部分
while(1)
{
STEPMOTOR_DIR=0;
for(i=0;i<4000;i++)
{
LED88 =1;
delay_ms(1);//给足旋转时间
LED88 =0;
delay_ms(1);//给足旋转时间
}
delay_ms(5000);//给足旋转时间
STEPMOTOR_DIR=1;
for(i=0;i<4000;i++)
{
LED88 =1;
delay_ms(1);//给足旋转时间
LED88 =0;
delay_ms(1);//给足旋转时间
}
delay_ms(5000);//给足旋转时间
}
详细代码
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "beep.h"
#include "key.h"
#include "servomotor.h"
#include "stepmotor.h"
#include "waterpump.h"
#include "electromagnet.h"
步进电机调试
int main(void)
{
int i;
/************定义变量*********/
u8 key = 0;
/************优先级*********/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
/************初始化*********/
delay_init(168); //初始化延时函数
KEY_Init();
LED_Init();
Step_Motor_Init(); //电机1初始化
ServoMotor_Init();
/************变量赋值*********/
LED3 = 0;//绿灯亮,代码烧入正常
LED2 = 0;//红灯亮,接收到指令,设备开始工作
/************主体函数*********/
//按键调试步进电机
while(1)
{
LED1 = 0;
key = KEY_Scan(0);
switch(key)
{
case 1:
LED1 = 1;
Claw_Pos_Down(23200);//从顶点下降到壶盖
break;
case 2:
LED1 = 1;
Claw_Pos_Down(400);
LED1 = !LED1;
break;
case 3:
LED1 = 1;
Claw_Pos_Up(4000);
LED1 = !LED1;
break;
case 4:
LED1 = 1;
Claw_Pos_Up(400);
LED1 = !LED1;
break;
default:
break;
}
}
}
stepmotor.c
#include "stm32f4xx_tim.h"
#include "stepmotor.h"
#include "delay.h"
void Step_Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOC时钟
//C6------步进电机PWM
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//E5------DRIVER_DIR
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //DRIVER_DIR DRIVER_OE对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE5,6
STEPMOTOR_ENA=0;
STEPMOTOR_DIR=1;
}
void Claw_Pos_Up(long num) //相对定位函数
{
long i;
STEPMOTOR_DIR = 1;
for(i=0;i<num;i++)
{
STEPMOTOR_PWM = 1;
delay_ms(1);
STEPMOTOR_PWM = 0;
delay_ms(1);
}
delay_ms(500);//电机缓冲0.5秒
}
void Claw_Pos_Down(long num) //相对定位函数
{
long i;
STEPMOTOR_DIR = 0;
for(i=0;i<num;i++)
{
STEPMOTOR_PWM = 1;
delay_ms(1);
STEPMOTOR_PWM = 0;
delay_ms(1);
}
delay_ms(500);//电机缓冲0.5秒
}
stepmotor.h
#ifndef _STEPMOTOR_H
#define _STEPMOTOR_H
#include "sys.h"
#define STEPMOTOR_PWM PCout(6)
#define STEPMOTOR_DIR PEout(5)
#define STEPMOTOR_ENA PEout(6)
void Step_Motor_Init(void);
void Claw_Pos_Up(long num);
void Claw_Pos_Down(long num);
#endif
代码原理
理解PWM输出的原因,便明白
看江科大的视频:
或者各种书