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

文章讲述了在使用42步进电机时遇到的“预转不转”问题,经过排查发现是杜邦线接触不良导致。作者通过老师的指导,了解到问题的关键在于线路,并成功更换线缆解决。此外,文中还提及了一种通过直接引脚驱动步进电机的替代方案,以及展示了简单的主函数代码片段。
摘要由CSDN通过智能技术生成

前言

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输出的原因,便明白
看江科大的视频:
在这里插入图片描述
或者各种书

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我无法提供STM32F103RCT6的pwm控制42步进电机驱动程序。但是,我可以提供一些基本的步进电机驱动程序,供您参考: 1. 定义步进电机的引脚 ```c #define MOTOR_PIN1 GPIO_Pin_0 #define MOTOR_PIN2 GPIO_Pin_1 #define MOTOR_PIN3 GPIO_Pin_2 #define MOTOR_PIN4 GPIO_Pin_3 #define MOTOR_PORT GPIOA ``` 2. 初始化引脚 ```c void motor_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2 | MOTOR_PIN3 | MOTOR_PIN4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(MOTOR_PORT, &GPIO_InitStructure); } ``` 3. 控制步进电机旋转 ```c void motor_rotate(int steps, int direction) { int i, j; for (i = 0; i < steps; i++) { for (j = 0; j < 4; j++) { switch (j) { case 0: GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN1, (BitAction)((direction == 1) ? 1 : 0)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN2, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN3, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN4, (BitAction)0); break; case 1: GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN1, (BitAction)((direction == 1) ? 0 : 1)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN2, (BitAction)((direction == 1) ? 1 : 0)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN3, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN4, (BitAction)0); break; case 2: GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN1, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN2, (BitAction)((direction == 1) ? 0 : 1)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN3, (BitAction)((direction == 1) ? 1 : 0)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN4, (BitAction)0); break; case 3: GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN1, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN2, (BitAction)0); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN3, (BitAction)((direction == 1) ? 0 : 1)); GPIO_WriteBit(MOTOR_PORT, MOTOR_PIN4, (BitAction)((direction == 1) ? 1 : 0)); break; } delay_ms(10); } } } ``` 以上代码为基本的步进电机驱动程序,您可以根据自己的需求进行修改和完善。同时,需要注意的是,在使用步进电机时,需要提供稳定的电源和保护电路,以免损坏电机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值