4.DSP学习记录之直流电机和步进电机驱动
基于TI 28335
- 一、电机类型及驱动方法
- 1.直流电机及驱动电路
- 2.步进电机及驱动电路
- (1)简介
- (2)励磁驱动方式
- (3)驱动电路
- 二、软件实现
- 1.直流电机
- 2.步进电机
一、电机类型及驱动方法
1.直流电机及驱动电路
(1)简介
直流电机的驱动较为简单,需要注意的是通常不建议用IO口直接驱动电机,因为电流较小,难以驱动,而且有可能会烧毁IO,故通常使用一个驱动芯片进行驱动
关于电机调速部分后面介绍
(2)驱动芯片:TC1508S(双通道直流马达驱动器)
驱动逻辑:
芯片管脚定义
该芯片可驱动两路电机:通过INA、INB(GPIO2、GPIO3)驱动电机1;INC、IND(GPIO4、GPIO5)驱动电机2
与控制芯片电路连接:
2.步进电机及驱动电路
(1)简介
步进电机不能直接接上电压就驱动,步进电机是靠脉冲电流信号来驱动的
举例:某步进电机旋转一圈需要200个脉冲信号,则每个脉冲信号能够使得步进电机旋转1.8°
步进电机的正反转由脉冲信号灯的方向控制
步进电机有三线式四线式等,根据每次励磁脉冲的个数区分控制方式:一相励磁、二相励磁等
(2)励磁驱动方式
a.一相励磁(每次只有一相有脉冲)的实现:
b.二相励磁(最常用):在每一瞬间,步进电动机有两个线圈同时导通:
每送一个信号,电机旋转1.8°
c.一二相励磁(分辨率高, 运转平滑):为一相励磁与二相励磁交替导通
每送一次励磁信号, 步进电机旋转 0.9°
注意:以上三种励磁驱动方式,若要反向旋转,则反向送脉冲即可
(3)驱动电路
驱动芯片:ULN2003(上一篇中介绍的反相器)
电路连接和直流电机一样,控制端口为:GPIO2、GPIO3、GPIO4、GPIO5
而硬件电路的连接如下图:
二、软件实现
1.直流电机
功能:通过三个按键控制电机正转反转停车
dc_moter.c文件:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "beep.h"
#include "beep.h"void DC_Moter_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;//2.3GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;GpioCtrlRegs.GPADIR.bit.GPIO2=1;GpioCtrlRegs.GPAPUD.bit.GPIO2=0;GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;GpioCtrlRegs.GPADIR.bit.GPIO3=1;GpioCtrlRegs.GPAPUD.bit.GPIO3=0;GpioDataRegs.GPACLEAR.bit.GPIO2=1;GpioDataRegs.GPACLEAR.bit.GPIO3=1;EDIS;
}void Moter_Forward(void)
{GpioDataRegs.GPASET.bit.GPIO2=1;GpioDataRegs.GPACLEAR.bit.GPIO3=1;
}void Moter_Backward(void)
{GpioDataRegs.GPACLEAR.bit.GPIO2=1;GpioDataRegs.GPASET.bit.GPIO3=1;
}void Moter_Stop(void)
{GpioDataRegs.GPASET.bit.GPIO2=1;GpioDataRegs.GPASET.bit.GPIO3=1;
}
main.c文件:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "beep.h"
#include "Key.h"
#include "LED.h"
#include "dc_moter.h"void main()
{InitSysCtrl();Key_Init();DC_Moter_Init();char key_num = 0;while(1){key_num = Key_Scan(0);switch(key_num){case 1:Moter_Forward();break;case 2:Moter_Backward();break;case 3:Moter_Stop();break;}}
}
2.步进电机
编程思路:
本实验采用二相励磁来驱动步进电机
步进电机的驱动需要持续的输出电平,因为考虑到对四个IO口进行操控,可以使用对整个GPIOA的32位寄存器进行all位写入来控制
首先,定义步进电机前进和后退的励磁逻辑数组
然后在按键控制下在循环中进行连续写入实现连续脉冲,间隔时间用完成
状态编码如下图关系:
step_Moter.c文件:(在直流基础上改的,原来代码没删)
//该代码为步进电机代码;未命名为step_Moter
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "beep.h"
#include "dc_moter.h"//定义所需变量
char cnt;
int i =0;
char j = 0;//定义GPIOA的状态
unsigned char Forward_Array[] = {0xfff7,0xffdf,0xfffb,0xffef};
unsigned char Backword_Array[] = {0xffef,0xfffb,0xffdf,0xfff7};//该步进电机为四线双极性电机
void Step_Moter_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;//2.3.4.5GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;GpioCtrlRegs.GPADIR.bit.GPIO2=1;GpioCtrlRegs.GPAPUD.bit.GPIO2=0;GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;GpioCtrlRegs.GPADIR.bit.GPIO3=1;GpioCtrlRegs.GPAPUD.bit.GPIO3=0;GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;GpioCtrlRegs.GPADIR.bit.GPIO4=1;GpioCtrlRegs.GPAPUD.bit.GPIO4=0;GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;GpioCtrlRegs.GPADIR.bit.GPIO5=1;GpioCtrlRegs.GPAPUD.bit.GPIO5=0;GpioDataRegs.GPACLEAR.bit.GPIO2=1;GpioDataRegs.GPACLEAR.bit.GPIO3=1;GpioDataRegs.GPACLEAR.bit.GPIO4=1;GpioDataRegs.GPACLEAR.bit.GPIO5=1;EDIS;
}//步进电机
void Step_Moter_Forward(void)
{cnt = 256;while(cnt--){for(j=0;j<4;j++){GpioDataRegs.GPADAT.all = Forward_Array[j];DELAY_US(5000);}}
}void Step_Moter_Backward(void)
{cnt = 256;while(cnt--){for(j=0;j<4;j++){GpioDataRegs.GPADAT.all = Backword_Array[j];DELAY_US(5000);}}
}void Step_Moter_Stop(void)
{GpioDataRegs.GPADAT.all = 0xffff;
}//直流电机
void Moter_Forward(void)
{GpioDataRegs.GPASET.bit.GPIO2=1;GpioDataRegs.GPACLEAR.bit.GPIO3=1;
}void Moter_Backward(void)
{GpioDataRegs.GPACLEAR.bit.GPIO2=1;GpioDataRegs.GPASET.bit.GPIO3=1;
}void Moter_Stop(void)
{GpioDataRegs.GPASET.bit.GPIO2=1;GpioDataRegs.GPASET.bit.GPIO3=1;
}
main.c文件:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "beep.h"
#include "Key.h"
#include "LED.h"
#include "dc_moter.h"extern char key_num = 0;void main()
{InitSysCtrl();Key_Init();Step_Moter_Init();while(1){key_num = Key_Scan(0);switch(key_num){case 1:Step_Moter_Forward();break;case 2:Step_Moter_Stop();break;case 3:Step_Moter_Backward();break;}}
}
这儿留一点问题,原来用keil5的时候,在其他文件定义变量之后,在对应头文件声明为全局变量,然后就可以在主函数中调用,但是在CCS6中,我想要实现按下按键2就跳出电机运行,结果编译出错,求有看到这儿的大神解答