一、电机类型及驱动方法

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就跳出电机运行,结果编译出错,求有看到这儿的大神解答

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐