本片文章主要介绍一下光敏电阻自动检测光照,当光亮时关闭窗帘(步进电机顺时针一定角度),当光暗时关闭窗帘功能(步进电机逆时针一定角度)
单片机使用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;
}
}