STM32
直播中

niu!kf

12年用户 601经验值
私信 关注
[问答]

ULN2003APG芯片是如何驱动28BYJ-48步进电机的

ULN2003APG芯片是如何驱动28BYJ-48步进电机的?

回帖(1)

邹昀

2021-12-22 15:28:59
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
在CSDN找程序,改参数
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); } }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分