直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
1.1 TC1508S电机驱动芯片介绍
查找芯片手册绘制真值表,电机的两个引脚没有正反之分,如果按照真值表输出后发现本应该前进的状态变成了后退,可以将接在电机两端的接线反过来接,或者改变代码,配合当前电机运行状态。
J2显示可以接两组电机,但是如果将两组电机接上,会出现两组电机都不能转动,原因是电压不足,此原理图只能单独驱动一组电机,若想驱动两组,则需要外加直流电压源。
本章所要实现的功能是:通过K1、K2、K3键控制电机的正反转和停止,并且控制LED1指示灯不断闪烁,提示系统正在运行。
#define DC_MOTOR_INA_SETH (GpioDataRegs.GPASET.bit.GPIO2=1)
#define DC_MOTOR_INA_SETL (GpioDataRegs.GPACLEAR.bit.GPIO2=1)
#define DC_MOTOR_INB_SETH (GpioDataRegs.GPASET.bit.GPIO3=1)
#define DC_MOTOR_INB_SETL (GpioDataRegs.GPACLEAR.bit.GPIO3=1)
#define DC_MOTOR_INC_SETH (GpioDataRegs.GPASET.bit.GPIO4=1)
#define DC_MOTOR_INC_SETL (GpioDataRegs.GPACLEAR.bit.GPIO4=1)
#define DC_MOTOR_IND_SETH (GpioDataRegs.GPASET.bit.GPIO5=1)
#define DC_MOTOR_IND_SETL (GpioDataRegs.GPACLEAR.bit.GPIO5=1)
void DC_Motor_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//DC_MOTOR 第1路端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
GpioCtrlRegs.GPADIR.bit.GPIO2=1; //输出
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
GpioCtrlRegs.GPADIR.bit.GPIO3=1;
//DC_MOTOR 第2路端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
GpioCtrlRegs.GPADIR.bit.GPIO5=1;
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO2=1;
GpioDataRegs.GPACLEAR.bit.GPIO3=1;
GpioDataRegs.GPACLEAR.bit.GPIO4=1;
GpioDataRegs.GPACLEAR.bit.GPIO5=1;
}
void main()
{
int i=0;
char key=0;
InitSysCtrl();
LED_Init();
KEY_Init();
DC_Motor_Init();
while(1)
{
key=KEY_Scan(0);
switch(key)
{
case KEY1_PRESS: DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;break; //正转
case KEY2_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETH;break; //反转
case KEY3_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETL;break; //停止
}
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。
步进电机主要分为以下几类:
(1)永磁式(PM)
(2)反应式(VR)
(3)混合式(HB)
步进电机主要技术指标如下:
(1)相数
(2)步距角
(3)拍数
(4)保持转矩
1.1 步进电机工作原理
(1)工作原理
步进电机有三线式、 四线式、 五线式和六线式, 但其控制方式均相同, 都要以脉冲信号电流来驱动。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8° 。 其旋转角度与脉冲的个数成正比。 步进电动机的正、 反转由励磁脉冲产生的顺序来控制。 六线式四相步进电机是比较常见的, 它的控制等效电路如下图所示:
(2)励磁方式
步进电机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电动机前进 1.8°(360/200=1.8)。
简要介绍如下:
①一相励磁:在每一瞬间, 步进电机只有一个线圈导通.每送一个励磁信号, 步进电机旋转 1.8, 这是三种励磁方式中最简单的一种。 其特点是:精确度好、 消耗电力小,但输出转矩最小, 振动较大。 如果以该方式控制步进电机正转
②二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号, 步进电机旋转 1.8。 其特点是: 输出转矩大, 振动小, 因而成为目前使用最多的励磁方式。 如果以该方式控制步进电机正转, 对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。
③一二相励磁:为一相励磁与二相励磁交替导通的方式。 每送一个励磁信号, 步进电机旋转 0.9。 其特点是:分辨率高, 运转平滑, 故应用也很广泛。 如果以该方式控制步进电机正转,对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。
1.2 ULN2003芯片介绍
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对的集电极电流是500mA。达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。ULN2003的每对达林顿管都有一个2.7k串联电阻,可以直接和TTL或5V CMOS装置。(输入低电平,输出高电平)
本章所要实现的功能是:通过K1、K2键控制四线双极性步进电机的正反转,并且控制LED1指示灯不断闪烁,提示系统正在运行。(步进电机采用一相励磁方式)
#define STEP_MOTOR_4LINE2
//#define STEP_MOTOR_5LINE4
#define MOTO_OUTA_SETH (GpioDataRegs.GPASET.bit.GPIO2=1)
#define MOTO_OUTA_SETL (GpioDataRegs.GPACLEAR.bit.GPIO2=1)
#define MOTO_OUTB_SETH (GpioDataRegs.GPASET.bit.GPIO3=1)
#define MOTO_OUTB_SETL (GpioDataRegs.GPACLEAR.bit.GPIO3=1)
#define MOTO_OUTC_SETH (GpioDataRegs.GPASET.bit.GPIO4=1)
#define MOTO_OUTC_SETL (GpioDataRegs.GPACLEAR.bit.GPIO4=1)
#define MOTO_OUTD_SETH (GpioDataRegs.GPASET.bit.GPIO5=1)
#define MOTO_OUTD_SETL (GpioDataRegs.GPACLEAR.bit.GPIO5=1)
void Step_Motor_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//Step_MOTOR端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
GpioCtrlRegs.GPADIR.bit.GPIO2=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
GpioCtrlRegs.GPADIR.bit.GPIO3=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
GpioCtrlRegs.GPADIR.bit.GPIO5=1;
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO2=1;
GpioDataRegs.GPACLEAR.bit.GPIO3=1;
GpioDataRegs.GPACLEAR.bit.GPIO4=1;
GpioDataRegs.GPACLEAR.bit.GPIO5=1;
}
HEX | GPIO7 | GPIO6 | GPIO5(3B) | GPIO4(3A) | GPIO3(2B) | GPIO2(2A) | GPIO1 | GPIO0 |
0xf7 |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
0xdf | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
0xfb | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
0xef | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
HEX | GPIO7 | GPIO6 | GPIO5(3B) | GPIO4(3A) | GPIO3(2B) | GPIO2(2A) | GPIO1 | GPIO0 |
0xef |
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
0xfb | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
0xdf | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
0xf7 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
#ifdef STEP_MOTOR_5LINE4
unsigned char Step_table_ZTurn[]={0xfff7,0xfffb,0xffdf,0xffef};
unsigned char Step_table_FTurn[]={0xffef,0xffdf,0xfffb,0xfff7};
#endif
#ifdef STEP_MOTOR_4LINE2
unsigned char Step_table_ZTurn[]={0xfff7,0xffdf,0xfffb,0xffef};
unsigned char Step_table_FTurn[]={0xffef,0xfffb,0xffdf,0xfff7};
#endif
void main()
{
int i=0;
char key=0;
short cnt=0;
char j=0;
InitSysCtrl();
LED_Init();
KEY_Init();
Step_Motor_Init();
while(1)
{
key=KEY_Scan(0);
#ifdef STEP_MOTOR_4LINE2
if(key==KEY1_PRESS)
{
cnt=1024; //为了让电机旋转一定的时间,方便看出现象
while(cnt--)
{
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
DELAY_US(5000); //延时是为了控制输出频率,频率太小,旋转慢,会出现抖动;频率太高,会出现电机不旋转,并且发出滋滋声
}
}
}
else if(key==KEY2_PRESS)
{
cnt=1024;
while(cnt--)
{
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
DELAY_US(5000);
}
}
}
#endif
#ifdef STEP_MOTOR_5LINE4
if(key==KEY1_PRESS)
{
cnt=1024;
while(cnt--)
{
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
DELAY_US(5000);
}
}
}
else if(key==KEY2_PRESS)
{
cnt=1024;
while(cnt--)
{
for(j=0;j<4;j++)
{
GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
DELAY_US(5000);
}
}
}
#endif
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}