STM32F407ZGTE6利用模拟PWM驱动42步进电机(与pwm驱动led闪烁一样)

前言

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输出的原因,便明白
看江科大的视频:
STM32F407ZGTE6利用模拟PWM驱动42步进电机(与pwm驱动led闪烁一样)_第1张图片
或者各种书

你可能感兴趣的:(STM32单片机,stm32,单片机,嵌入式硬件)