DSP 电机实验

一、直流电机实验

1.直流电机介绍

       直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。

DSP 电机实验_第1张图片

1.1 TC1508S电机驱动芯片介绍

DSP 电机实验_第2张图片

查找芯片手册绘制真值表,电机的两个引脚没有正反之分,如果按照真值表输出后发现本应该前进的状态变成了后退,可以将接在电机两端的接线反过来接,或者改变代码,配合当前电机运行状态。

DSP 电机实验_第3张图片 DSP 电机实验_第4张图片

      J2显示可以接两组电机,但是如果将两组电机接上,会出现两组电机都不能转动,原因是电压不足,此原理图只能单独驱动一组电机,若想驱动两组,则需要外加直流电压源。

2.软件设计

       本章所要实现的功能是:通过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.步进电机介绍

       步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。

步进电机主要分为以下几类:

(1)永磁式(PM)

(2)反应式(VR)

(3)混合式(HB)    

步进电机主要技术指标如下:

(1)相数

(2)步距角

(3)拍数

(4)保持转矩

1.1 步进电机工作原理

(1)工作原理    

        步进电机有三线式、 四线式、 五线式和六线式, 但其控制方式均相同, 都要以脉冲信号电流来驱动。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8° 。 其旋转角度与脉冲的个数成正比。 步进电动机的正、 反转由励磁脉冲产生的顺序来控制。 六线式四相步进电机是比较常见的, 它的控制等效电路如下图所示:

DSP 电机实验_第5张图片

(2)励磁方式    

       步进电机的励磁方式分为全步励磁半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电动机前进 1.8°(360/200=1.8)。

简要介绍如下:

一相励磁:在每一瞬间, 步进电机只有一个线圈导通.每送一个励磁信号, 步进电机旋转 1.8, 这是三种励磁方式中最简单的一种。 其特点是:精确度好、 消耗电力小,但输出转矩最小, 振动较大。 如果以该方式控制步进电机正转

DSP 电机实验_第6张图片

二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号, 步进电机旋转 1.8。 其特点是: 输出转矩大, 振动小, 因而成为目前使用最多的励磁方式。 如果以该方式控制步进电机正转, 对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。 

DSP 电机实验_第7张图片

一二相励磁:为一相励磁与二相励磁交替导通的方式。 每送一个励磁信号, 步进电机旋转 0.9。 其特点是:分辨率高, 运转平滑, 故应用也很广泛。 如果以该方式控制步进电机正转,对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。 

DSP 电机实验_第8张图片

1.2 ULN2003芯片介绍

      ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对的集电极电流是500mA。达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。ULN2003的每对达林顿管都有一个2.7k串联电阻,可以直接和TTL或5V CMOS装置。(输入低电平,输出高电平

DSP 电机实验_第9张图片

 2.硬件设计DSP 电机实验_第10张图片

 3.软件设计

        本章所要实现的功能是:通过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);
	}
}

你可能感兴趣的:(DSP,dsp)