一、環(huán)境介紹
二、硬件介紹
開(kāi)發(fā)板采用STM32F103ZET6 最小系統(tǒng)板
電機(jī)驅(qū)動(dòng)板采用的是ULN2003
步進(jìn)電機(jī)采用的是28BYJ4? (5V 4相5線步進(jìn)電機(jī))
三、驅(qū)動(dòng)代碼
3.1 motor.c
#include "motor.h"
//步進(jìn)電機(jī)正反轉(zhuǎn)數(shù)組1
u16 PositiveSequence[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A
u16 ReverseOrder[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.
void motor_delay_ms(u32 ms)
{
u32 i,j;
for(i=0;i<ms;i++)
for(j=0;j<112;j++);
}
void motor_stop(void)
{
MOTOR_1=0;
MOTOR_2=0;
MOTOR_3=0;
MOTOR_4=0;
}
void motor_init(void)
{
RCC->APB2ENR|=1<<4;
GPIOC->CRL&=0x00FFFFFF;
GPIOC->CRL|=0x33000000;
GPIOC->CRH&=0xFFFFFF00;
GPIOC->CRH|=0x00000033;
// IN4: PC9 d
// IN3: PC8 c
// IN2: PC7 b
// IN1: PC6 a
}
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)
{
GPIOx->ODR = PortVal;
}
void motor_just(int speed) //一個(gè)脈沖
{
uint8_t i;
for(i=0;i<4;i++)
{
GPIO_Write(GPIOC,PositiveSequence[i]);
motor_delay_ms(speed);
}
}
void motor_back(int speed)
{
uint8_t i;
for(i=0;i<4;i++)
{
GPIO_Write(GPIOC,ReverseOrder[i]);
motor_delay_ms(speed);
}
}
//由于 *一個(gè)脈沖* *輸出軸* 轉(zhuǎn)0.08789度(電機(jī)實(shí)轉(zhuǎn)0.08789*64=5.625度),即步進(jìn)角為5.625度。則轉(zhuǎn)完A-B-C-D為 *8個(gè)脈沖*
//,即0.08789*8=0.70312度。若稱(chēng)A-B-C-D為一個(gè)周期,則j為需要的轉(zhuǎn)完angle角度所需的周期數(shù)。
//步進(jìn)電機(jī)正轉(zhuǎn)角度函數(shù)
void motor_just_angle(int angle,int speed)
{
int i,j;
j=(int)(angle/0.70312);
for(i=0;i<j;i++)
{
motor_just(speed);
}
motor_stop();
}
//步進(jìn)電機(jī)反轉(zhuǎn)角度函數(shù)
void motor_back_angle(int angle,int speed)
{
int i,j;
j=(int)(angle/0.70312);
for(i=0;i<j;i++)
{
motor_back(speed);
}
motor_stop();
}
//步進(jìn)電機(jī)反轉(zhuǎn)圈函數(shù)
void motor_back_circle(int ring ,int speed)
{
int i;
for(i=0;i<ring;i++)
{
motor_back_angle(360,speed);
}
}
//步進(jìn)電機(jī)正轉(zhuǎn)圈函數(shù)
void motor_just_circle(int ring,int speed) //步進(jìn)電機(jī)正轉(zhuǎn)角度函數(shù)
{
int i;
for(i=0;i<ring;i++)
{
motor_just_angle(360,speed);
}
}
3.2? motor.h
#ifndef _MOTOR_H
#define _MOTOR_H
#include "sys.h"
void motor_delay_ms(u32 x);//延時(shí)函數(shù)
void motor_init(void); //步進(jìn)電機(jī)初始化
void motor_just(int speed); //步進(jìn)電機(jī)正轉(zhuǎn)函數(shù)
void motor_back(int speed); //步進(jìn)電機(jī)反轉(zhuǎn)函數(shù)
void motor_just_angle(int angle,int speed); //步進(jìn)電機(jī)正轉(zhuǎn)角度函數(shù)
void motor_back_angle(int angle,int speed); //步進(jìn)電機(jī)反轉(zhuǎn)角度函數(shù)
void motor_stop(void); //步進(jìn)電機(jī)停止函數(shù)
void motor_just_circle(int ring ,int speed); //步進(jìn)電機(jī)正轉(zhuǎn)圈函數(shù)
void motor_back_circle(int ring ,int speed);//步進(jìn)電機(jī)反轉(zhuǎn)圈函數(shù)
//IN
#define MOTOR_1 PCout(6)
#define MOTOR_2 PCout(7)
#define MOTOR_3 PCout(8)
#define MOTOR_4 PCout(9)
#endif
3.3 main.c
/*
ULN2003控制28BYJ-48步進(jìn)電機(jī)接線:
ULN2003接線:
IN4: PC9 d
IN3: PC8 c
IN2: PC7 b
IN1: PC6 a
+ : 5V
- : GND
*/
int main()
{
u8 time_cnt=0;
u8 key;
LED_Init();
KEY_Init();
USART1_Init(115200);
motor_init(); //步進(jìn)電機(jī)初始化
USART1_Printf("程序初始化.....rn");
while(1)
{
//按鍵可以測(cè)試開(kāi)鎖和關(guān)鎖
key=KEY_Scan(0);
if(key==1)
{
LED1=0; //亮燈--表示開(kāi)鎖
motor_just_circle(1,300); //電機(jī)正轉(zhuǎn)1圈
}
else if(key==2)
{
LED1=1; //滅燈--表示關(guān)鎖
motor_back_circle(1,300); //電機(jī)反轉(zhuǎn)1圈
}
DelayMs(10);
time_cnt++;
if(time_cnt>=50)
{
time_cnt=0;
LED2=!LED2;
}
}
}