stepmotor备用

本文介绍如何使用STM32F103ZET6微控制器通过HAL库控制28BYJ-48步进电机,实现正转、反转及指定角度旋转的功能。文章详细展示了步进电机的接线方式、初始化过程以及控制函数的实现,适用于初学者理解和实践步进电机的驱动控制。

stepmotor.h

#ifndef __STEPMOTOR_H
#define __STEPMOTOR_H
#include “stm32f10x.h”

void motor_Init(void); //初始化引脚

extern void motor_F(int n); //反转,n 脉冲间隔时间 extern 可有可无 表明函数在其他地方有定义
void motor_Z(int n); //正转,n 脉冲间隔时间
void Motor_Off(void); //关闭电机
void Motor_Angle(int angle,int n); // angle 角度 n 脉冲间隔时间

#endif

stepmotor.c

#include “stepmotor.h”
#include “stm32f10x.h”
#include “delay.h”
/**********************************************
用正点原子战舰版 STM32F103ZET6
PC0–PC7是给OLED显示屏用的,现在显示屏不用,
使用PC0,PC1,PC2,PC3 给步进电机用
驱动板上接线
PC0 -------IN1
PC1 -------IN2
PC2 -------IN3
PC3 -------IN4
步进电机型号:28BYJ-48 5VDC
驱动芯片;ULN2003APG
在优快云找程序,改参数
2020/3/15 LZ完成
2020/3/17 修改注释
***********************************************/

#define orange_H GPIO_SetBits(GPIOC, GPIO_Pin_0); //橙色
#define orange_L GPIO_ResetBits(GPIOC, GPIO_Pin_0);

#define yellow_H GPIO_SetBits(GPIOC, GPIO_Pin_1); //黄色
#define yellow_L GPIO_ResetBits(GPIOC, GPIO_Pin_1);

#define pink_H GPIO_SetBits(GPIOC, GPIO_Pin_2); //粉色
#define pink_L GPIO_ResetBits(GPIOC, GPIO_Pin_2);

#define blue_H GPIO_SetBits(GPIOC, GPIO_Pin_3); //蓝色
#define blue_L GPIO_ResetBits(GPIOC, GPIO_Pin_3);

void motor_Init(void)//PC0,PC1,PC2,PC3
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);


GPIO_ResetBits(GPIOC, GPIO_Pin_0);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);

}

void motor_F(int n) //反转 逆时针
{
orange_H;
delay_ms(n);
blue_L;
delay_ms(n);
yellow_H;
delay_ms(n);
orange_L;
delay_ms(n);
pink_H;
delay_ms(n);
yellow_L;
delay_ms(n);
blue_H;
delay_ms(n);
pink_L;
delay_ms(n);
}

void motor_Z(int n) //正转 顺时针
{
blue_H;
delay_ms(n);
orange_L;
delay_ms(n);
pink_H;
delay_ms(n);
blue_L;
delay_ms(n);
yellow_H;
delay_ms(n);
pink_L;
delay_ms(n);
orange_H;
delay_ms(n);
yellow_L;
delay_ms(n);

}

void Motor_Off(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
}

void Motor_Angle(int angle,int n) //angle 角度 n 脉冲间隔时间
{
u16 j;
for(j=0;j<64*angle/45;j++) // 64 减速比 定子8个齿,正反转函数执行一次,转子转一个齿距角。360/45=8
{
motor_F(n); // 反转(逆时针),换成正转函数就正转(顺时针)
}
}

main.c

int main(void) //步进电机主函数 逆时针转360度 停止
{
motor_Init();
delay_init();

Motor_Angle(360,10);

Motor_Off();

while(1)
{	 
	delay_ms(1000); 
}

}

#include "my_include.h" char dis0[25]; // 液晶显示暂存数组 char dis1[25]; // 液晶显示暂存数组 u16 adcx; #define F_SIZE 16 #define MyLCD_Show(m, n, p) LCD_ShowString(LCD_GetPos_X(F_SIZE, m), LCD_GetPos_Y(F_SIZE, n), p, F_SIZE, false) extern u16 ADC_convered[5]; // ADC光敏数据采集 float temp[5]; float value; float value1; char buf[5]; char buf1[5]; #define RONGCHAZHI_UD 100 // 容差值 #define RONGCHAZHI_LR 100 // 容差值 #define ZHUANDONG_ZZ 30 // 转动一个正角度 #define ZHUANDONG_FZ -30 // 转动另一个方向转动 int lighVla_left = 0; // ad采集结果 1 int lighVla_up = 0; // ad采集结果 int lighVla_right = 0; // ad采集结果 int lighVla_down = 0; // ad采集结果 float batteryVolt = 0; // 锂电池电压ad采集结果 float BatCap = 80; // 容量初始化 unsigned char disFlag = 0; // 更新显示 unsigned char setMode = 0; // 设置模式 unsigned char rememberMode = 0xff; // 记录上一次设置状态 int main(void) { unsigned char disYplace = 0; // 显示所在行递增变量 // USARTx_Init(USART1,9600); // My_LED_Init(); // My_RTC_Init(false); Adc_Init(); // ADC数据采集初始化 My_KEY_Init(); // 按键初始化 My_StepMotor_Init(); // 电机初始化 LCD_Init(); // tft初始化 // TP_Init(); //校准已经包括再此函数中 先执行LCD_Init(); 触摸校准调用显示 LCD_Clear(Color16_BLACK); // 清全屏 BACK_COLOR = Color16_BLACK; FRONT_COLOR = Color16_LIGHTGRAY; disYplace = 0; // 显示所在行递增变量 MyLCD_Show(2, disYplace++, "双轴追光系统"); // 显示 FRONT_COLOR = Color16_LIGHTBLUE; MyLCD_Show(1, disYplace++, "光照参数: "); // 显示 MyLCD_Show(4, disYplace++, "上: "); // 显示 MyLCD_Show(1, disYplace, "左: "); // 显示 MyLCD_Show(9, disYplace++, "右: "); // 显示 MyLCD_Show(4, disYplace++, "下: "); // 显示 MyLCD_Show(1, disYplace++, "设置: "); // 显示 while (1) { My_KeyScan(); // 按键扫描 if (KeyIsPress(KEY_5)) { setMode++; if (setMode >= 2) setMode = 0; // 自动模式 } switch (setMode) { case 1: // 自动模式 if ((lighVla_left - lighVla_right) > RONGCHAZHI_LR) // 调整向强光方向转动 { My_StepMotor_RotateAngle(0, ZHUANDONG_FZ); } else if ((lighVla_right - lighVla_left) > RONGCHAZHI_LR) // 调整向强光方向转动 { My_StepMotor_RotateAngle(0, ZHUANDONG_ZZ); } else { My_StepMotor_Stop(0); } if ((lighVla_up - lighVla_down) > RONGCHAZHI_UD) // 调整向强光方向转动 { My_StepMotor_RotateAngle(1, ZHUANDONG_FZ); } else if ((lighVla_down - lighVla_up) > RONGCHAZHI_UD) // 调整向强光方向转动 { My_StepMotor_RotateAngle(1, ZHUANDONG_ZZ); } else { My_StepMotor_Stop(1); } break; // case 1: //自动模式 // if((lighVla_left - lighVla_right)>RONGCHAZHI_LR ) //调整向强光方向转动 // {My_StepMotor_RotateAngle(0,ZHUANDONG_FZ);} // else if((lighVla_right - lighVla_left )>RONGCHAZHI_LR )//调整向强光方向转动 // {My_StepMotor_RotateAngle(0,ZHUANDONG_ZZ);} // else {My_StepMotor_Stop(0);} // // if((lighVla_up - lighVla_down)>RONGCHAZHI_UD ) //调整向强光方向转动 // {My_StepMotor_RotateAngle(1,ZHUANDONG_FZ);} // else if((lighVla_down - lighVla_up )>RONGCHAZHI_UD )//调整向强光方向转动 // {My_StepMotor_RotateAngle(1,ZHUANDONG_ZZ);} // else {My_StepMotor_Stop(1);} // break; case 0: // 手动模式 if (KeyIsPressed(KEY_2)) // 按键按下 { My_StepMotor_RotateAngle(0, ZHUANDONG_ZZ); // 转动 度数 正值一个方向 负值另一个方向 } else if (KeyIsPressed(KEY_4)) // 按键按下 { My_StepMotor_RotateAngle(0, ZHUANDONG_FZ); // 转动 度数 正值一个方向 负值另一个方向 } else { My_StepMotor_Stop(0); } if (KeyIsPressed(KEY_1)) // 按键按下 { My_StepMotor_RotateAngle(1, ZHUANDONG_ZZ); // 转动 度数 正值一个方向 负值另一个方向 } else if (KeyIsPressed(KEY_3)) // 按键按下 { My_StepMotor_RotateAngle(1, ZHUANDONG_FZ); // 转动 度数 正值一个方向 负值另一个方向 } else { My_StepMotor_Stop(1); } break; default: break; } lighVla_left = 1000 * (float)ADC_convered[0] / 4096; // 读取ad值 转化为0-1000 lighVla_up = 1000 * (float)ADC_convered[1] / 4096; // 读取ad值 转化为0-1000 lighVla_right = 1000 * (float)ADC_convered[2] / 4096; // 读取ad值 转化为0-1000 lighVla_down = 1000 * (float)ADC_convered[3] / 4096; // 读取ad值 转化为0-1000 if (disFlag == 1) // 更新显示 { disFlag = 0; FRONT_COLOR = Color16_LIGHTBLUE; disYplace = 2; // 显示所在行递增变量 sprintf(dis0, "上:%d ", lighVla_up); // 打印 MyLCD_Show(4, disYplace++, dis0); // 显示 sprintf(dis0, "%d ", lighVla_left); // 打印 MyLCD_Show(4, disYplace, dis0); // 显示 sprintf(dis0, "%d ", lighVla_right); // 打印 MyLCD_Show(12, disYplace++, dis0); // 显示 sprintf(dis0, "%d ", lighVla_down); // 打印 MyLCD_Show(7, disYplace++, dis0); // 显示 if (rememberMode != setMode) { rememberMode = setMode; // 记录设置模式 if (setMode == 0) MyLCD_Show(8, disYplace++, "手动 "); // 显示 // else if(setMode == 1)MyLCD_Show(8,disYplace++,"自动2 ");//显示 else if (setMode == 1) MyLCD_Show(8, disYplace++, "自动 "); // 显示 } adcx = (float)ADC_convered[4]; batteryVolt = (float)adcx * (3.3 / 4096 * 2); // 锂电池电压 if (batteryVolt > 4.15) { BatCap = 0.99; } else if (batteryVolt < 3.4) { BatCap = 0; } else { BatCap = (batteryVolt - 3.4) / (4.15 - 3.4); } // 正常情况下计算比例 if (batteryVolt < 0.30) { FRONT_COLOR = Color16_RED; } sprintf(dis0, "B:%3.1fv Q:%02d%% ", batteryVolt, (int)(BatCap * 100)); // 打印 // printf("%d",adcx); MyLCD_Show(1, 6, dis0); // 显示 } } } 解释此代码,并生成系统流程图
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值