stm32自动步进电机窗帘系统

本片文章主要介绍一下光敏电阻自动检测光照,当光亮时关闭窗帘(步进电机顺时针一定角度),当光暗时关闭窗帘功能(步进电机逆时针一定角度)

单片机使用st32c8t6

步进电机使用ULN2003

先上视频效果

代码

motor.c

#include "motor.h"
#include "gpio.h"


#define STEP_MOTOR_A_PIN          GPIO_PIN_3     /*橙色*/
#define STEP_MOTOR_B_PIN          GPIO_PIN_4     /*黄色*/
#define STEP_MOTOR_C_PIN          GPIO_PIN_5     /*粉色*/
#define STEP_MOTOR_D_PIN          GPIO_PIN_6     /*蓝色*/

#define STEP_MOTOR_SPEED          2

#define STEP_MOTOR_DIRE_FOREWARD  1     /*步进电机正向转:顺时针*/
#define STEP_MOTOR_DIRE_ROLLBACK  2     /*步进电机正向转:逆时针*/

unsigned char MotorStepCount = 0;


//uint8_t motor_number(void)
//{
//	uint8_t motor_flag1 = 2;
// if(motor_flag1==0)
//	 {
//    Walkmotor_ON();
//		 motor_flag1=2;
// }
// else if(motor_flag1==1)
//	 {
//      Walkmotor_OFF();
//	  motor_flag1=2;
//}
//	 else
//	 {
//	 step_motor_stop();
//	 } step_motor_stop();
//	 return motor_flag1;
//	 }

void Motorcw(void)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
	HAL_Delay(1);
	
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
	HAL_Delay(1);
	
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
	HAL_Delay(1);
	
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
	HAL_Delay(1);
	
}

//========================================================================
// 简述: 步进电机驱动
// 参数: dire:步进电机方向   speed:步进电机转速
// 返回: 无
// 详述: 
//========================================================================

void step_motor_drive(unsigned char dire,unsigned char speed)
{
   switch(dire)
	 {
		 case STEP_MOTOR_DIRE_FOREWARD:
		 {
			  step_motor_foreward(speed);
		    break;
		 }
		 case STEP_MOTOR_DIRE_ROLLBACK:
		 {
			  step_motor_rollback(speed);
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机停止
// 参数: 无
// 返回: 无
// 详述: (ULN2003有反向功能)
//========================================================================
void step_motor_stop(void)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}

//========================================================================
// 简述: 步进电机正转
// 参数: 无
// 返回: 无
// 详述: 顺时针转
//========================================================================
void step_motor_foreward(unsigned char speed)
{ 
	 if((MotorStepCount++) > 7) MotorStepCount = 0;
   step_motor_foreward_output(MotorStepCount);
	 HAL_Delay(speed);
}

//========================================================================
// 简述: 步进电机反转
// 参数: 无
// 返回: 无
// 详述: 逆时针转
//========================================================================
void step_motor_rollback(unsigned char speed)
{
	 if((MotorStepCount++) > 7) MotorStepCount = 0;
   step_motor_rollback_output(MotorStepCount);
	 HAL_Delay(speed);
}

//========================================================================
// 简述: 步进电机正向输出
// 参数: 无
// 返回: 无
// 详述: 
//========================================================================
void step_motor_foreward_output(unsigned char step)
{
   switch(step)
	 {
		 case 0:
		 {
			  step_motor_a_output();
		    break;
		 }
		 case 1:
		 {
			  step_motor_ab_output();
		    break;
		 }
		 case 2:
		 {
			  step_motor_b_output();
		    break;
		 }
		 case 3:
		 {
			  step_motor_bc_output();
		    break;
		 }
		 case 4:
		 {
			  step_motor_c_output();
		    break;
		 }
		 case 5:
		 {
			  step_motor_cd_output();
		    break;
		 }
		 case 6:
		 {
			  step_motor_d_output();
		    break;
		 }
		 case 7:
		 {
			  step_motor_da_output();
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机反向输出
// 参数: 无
// 返回: 无
// 详述: 
//========================================================================
void step_motor_rollback_output(unsigned char step)
{
   switch(step)
	 {
		 case 0:
		 {
			  step_motor_a_output();
		    break;
		 }
		 case 1:
		 {
			  step_motor_da_output();
		    break;
		 }
		 case 2:
		 {
			  step_motor_d_output();
		    break;
		 }
		 case 3:
		 {
			  step_motor_cd_output();
		    break;
		 }
		 case 4:
		 {
			  step_motor_c_output();
		    break;
		 }
		 case 5:
		 {
			  step_motor_bc_output();
		    break;
		 }
		 case 6:
		 {
			  step_motor_b_output();
		    break;
		 }
		 case 7:
		 {
			  step_motor_ab_output();
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机A相输出(ULN2003有反向功能)
//========================================================================
void step_motor_a_output(void)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机AB相输出(ULN2003有反向功能)
//========================================================================
void step_motor_ab_output(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机B相输出(ULN2003有反向功能)
//========================================================================
void step_motor_b_output(void)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机BC相输出(ULN2003有反向功能)
//========================================================================
void step_motor_bc_output(void)
{
//	STEP_MOTOR_A_PIN = 0;
//	STEP_MOTOR_B_PIN = 1;
//	STEP_MOTOR_C_PIN = 1;
//	STEP_MOTOR_D_PIN = 0;
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}
//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机C相输出(ULN2003有反向功能)
//========================================================================
void step_motor_c_output(void)
{
//	STEP_MOTOR_A_PIN = 0;
//	STEP_MOTOR_B_PIN = 0;
//	STEP_MOTOR_C_PIN = 1;
//	STEP_MOTOR_D_PIN = 0;
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机CD相输出(ULN2003有反向功能)
//========================================================================
void step_motor_cd_output(void)
{
//	STEP_MOTOR_A_PIN = 0;
//	STEP_MOTOR_B_PIN = 0;
//	STEP_MOTOR_C_PIN = 1;
//	STEP_MOTOR_D_PIN = 1;
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机D相输出(ULN2003有反向功能)
//========================================================================
void step_motor_d_output(void)
{
//	STEP_MOTOR_A_PIN = 0;
//	STEP_MOTOR_B_PIN = 0;
//	STEP_MOTOR_C_PIN = 0;
//	STEP_MOTOR_D_PIN = 1;
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机DA相输出(ULN2003有反向功能)
//========================================================================
void step_motor_da_output(void)
{
//	STEP_MOTOR_A_PIN = 1;
//	STEP_MOTOR_B_PIN = 0;
//	STEP_MOTOR_C_PIN = 0;
//	STEP_MOTOR_D_PIN = 1;
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); 
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
}

void Walkmotor_ON(void)
{
	int i;
	for(i=0; i<512; i++)
	{
		step_motor_a_output();HAL_Delay(3);
		step_motor_b_output();HAL_Delay(3);
		step_motor_c_output();HAL_Delay(3);
		step_motor_d_output();HAL_Delay(3);
	}step_motor_stop();
}
	
void Walkmotor_OFF(void)
{
	int i;
	for(i=0; i<512; i++)
	{
		step_motor_d_output();HAL_Delay(3);
		step_motor_c_output();HAL_Delay(3);
		step_motor_b_output();HAL_Delay(3);
		step_motor_a_output();HAL_Delay(3);
	}step_motor_stop();
}

motor.h

#ifndef __MOTOR_H_
#define __MOTOR_H_	
/*函数声明*/
#include "main.h"
void step_motor_a_output(void);
void step_motor_ab_output(void);
void step_motor_b_output(void);
void step_motor_bc_output(void);
void step_motor_c_output(void);
void step_motor_cd_output(void);
void step_motor_d_output(void);
void step_motor_da_output(void);
void step_motor_foreward_output(unsigned char step);
void step_motor_rollback_output(unsigned char step);
void step_motor_foreward(unsigned char speed);
void step_motor_rollback(unsigned char speed);
void step_motor_drive(unsigned char dire,unsigned char speed);
void Motorcw(void);
uint8_t motor_number(void);
void Walkmotor_ON(void);
void Walkmotor_OFF(void);
void step_motor_stop(void);
#endif

main.c

uint8_t motor_flag=2;
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(motor_flag == 2) 
	   {
	    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11)==0)
	       {
	       motor_flag = 0;
		   }
	   }
	else if(motor_flag == 3)
	  {    
	     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11)==1)
	      {
	      motor_flag = 1;
		  }
	  }
	 if (motor_flag == 0)
	  {
	      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
		  OLED_ShowStr(0,0,"open ",2);
		  Walkmotor_ON();
		  motor_flag=3;
	  }
	  else if(motor_flag == 1)
	  {
	      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
		  OLED_ShowStr(0,0,"close",2);
		  Walkmotor_OFF();
		  motor_flag=2;
	  }
  }

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值