1、按前述教程快速新建一个新工程,在工程文件中app文件夹下新建stepmotor子文件夹用于存放stepmotor.c/stepmotor.h文件(记得添加进头文件路径),在user/main.c编写主函数
2、stepmotor.c代码
#include "stepmotor.h"
void Step_Motor_Init(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//设置为普通IO口
GpioCtrlRegs.GPADIR.bit.GPIO2=1;//设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//设置为普通IO口
GpioCtrlRegs.GPADIR.bit.GPIO3=1;//设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//设置为普通IO口
GpioCtrlRegs.GPADIR.bit.GPIO4=1;//设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;//设置为普通IO口
GpioCtrlRegs.GPADIR.bit.GPIO5=1;//设置为输出
GpioDataRegs.GPACLEAR.bit.GPIO2=1;//清0
GpioDataRegs.GPACLEAR.bit.GPIO3=1;//清0
GpioDataRegs.GPACLEAR.bit.GPIO4=1;//清0
GpioDataRegs.GPACLEAR.bit.GPIO5=1;//清0
EDIS;
}
3、stepmotor.h代码
#ifndef STEP_MOTOR_H_
#define STEP_MOTOR_H_
#include "DSP2833x_Device.h"//包含所有的头文件,常用的宏定义 、F2833x 内核、 外设驱动的源文件对应的头文件
#include "DSP2833x_Examples.h"// 包含F2833x 通用文件的头文件。 比如中断、全局变量及函数声明、 IQmath 库等
void Step_Motor_Init(void);
#endif
4、main.c代码
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "key.h"
#include "leds.h"
#include "beep.h"
#include "relay.h"
#include "dcmotor.h"
#include "stepmotor.h"
void main()
{
InitSysCtrl();
LED_Init();
KEY_Init();
BEEP_Init();
Step_Motor_Init();
//步进电机工作顺序:1000,0100,0010,0001
//这里定义正反转的数组,根据上面给的图片推导出来的
Uint32 STEP_MOTOR_ZTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef
};
Uint32 STEP_MOTOR_FTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7
};
Uint16 i = 0;
static short flag_key1 = 0;//按键1按下标志
static short flag_key2 = 0;//按键2按下标志
static short flag_key4 = 0;//按键4按下标志
while(1)
{
i++;
if(i%5000==0)
{
LED2_TOGGLE;//LED2闪烁,表示处于运行状态
}
// BEEP_ON;//打开蜂鸣器
DELAY_US(200);
char key_scan = KEY_Scan(0);
//如果确定按键按的是1,标志为1
if(key_scan==1)
{
DELAY_US(15000);//15ms的消抖时间
if(key_scan==1)
{
flag_key1 = 1;
flag_key2 = 0;
flag_key4 = 0;
}
}
//如果确定按键按的是2,标志为2
if(key_scan==2)
{
DELAY_US(15000);
if(key_scan==2)
{
flag_key2 = 1;
flag_key1 = 0;
flag_key4 = 0;
}
}
//如果确定按键按的是4,标志为4
if(key_scan==4)
{
DELAY_US(15000);
if(key_scan==4)
{
flag_key2 = 0;
flag_key1 = 0;
flag_key4 = 1;
}
}
//按键1按下正转
if(flag_key1==1)
{
int j;
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all = STEP_MOTOR_ZTurn[j];//把时序送到GPADAT寄存器里,GPADAT是GpioDataRegs寄存器里的一组,包含GPIO0-31共32个GPIO口
DELAY_US(5000); //delay 5ms,通过此数可改变电机转速
}
}
//按键2按下反转
if(flag_key2==1)
{
int j;
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all = STEP_MOTOR_FTurn[j];
DELAY_US(5000); //delay 5ms
}
}
//按键4按下停止
if(flag_key4==1)
{
GpioDataRegs.GPACLEAR.all=1;
DELAY_US(5000);
}
}
}