一、电机类型及驱动方法
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.3
GpioCtrlRegs.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.5
GpioCtrlRegs.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就跳出电机运行,结果编译出错,求有看到这儿的大神解答