⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor.c

📁 通过DSP2407的可用此程序实现对电机的操作
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************
*  MOTOR.C	v1.00   SEED-DTK APD的MOTOR 实验主程序	                             *
*  版权(c) 	2004-		北京合众达电子技术有限责任公司			                 *
*  设计者:	耿升辉								                                 *
**********************************************************************************/
#include "string.h"
#include "UART_func.h"
#include "SEED-DEC2407.h"
#include "motor.h"
#include "comm.h"
/*帧长度的设定*/
#define  FRAMLONGTH    0x104
#define  DataLongth   0x100

#define  DCMOTORFORWARD   0x2
#define  DCMOTORINVESE    0x1
#define  DCMOTORBRAKE     0x03
#define  DCMOTORHALT		0x0

typedef struct _UartForDec5416{
	unsigned int Length;
	unsigned int Type;
	unsigned int Mutul;
	unsigned int Data[DataLongth];
	unsigned int Check;
}UartForDec5416, *PuartForDec5416;

PuartForDec5416 precieve =0;	
unsigned long i= 0;
unsigned int k= 0;
int uart_s=0,uart_err=0,fifostatus=0;
unsigned long flashbaddr=0;
unsigned long flashaddr = 0;
PuartForDec5416 psend=0;
PMotorConfig pmotor = 0;
unsigned int errorsend = 0;
unsigned int step = 0;
unsigned int steplong = 0;
unsigned int steplongsave = 0;
unsigned int localstep =0;
unsigned int dcmotorrun = 0;
volatile unsigned int dcdircontrl = 0;
unsigned int stepruncode = 0;
unsigned int stepspeed = 10;
unsigned int stepspeedsave = 0;
unsigned int dcruncode = 0;
unsigned int stepnumber = 0;

#define MOTORBUFF      0
#define MPLUSCHANGE    1
#define MPLUSSET       2
#define MPLUSCOUNT     3
#define MRATEBASE      4
#define MOTOPWMC       5
#define MOTORPWMZ      6

#pragma DATA_SECTION(p_stepportaddr,".mysect")
volatile unsigned int* p_stepportaddr=(volatile unsigned int *)0x8001;

#pragma DATA_SECTION(p_cntlbaseaddr,".mysect")
volatile unsigned int* p_cntlbaseaddr=(volatile unsigned int *)0x8003;


#pragma DATA_SECTION(write_data,".mysect")
volatile unsigned int write_data =0;

//#pragma DATA_SECTION(motorset,".mysect")
volatile unsigned int motorset[6] ={0,0,0,10,0,0};

//#pragma DATA_SECTION(motorstatus,".mysect")
volatile unsigned int motorstatus[10];
	
/*电机驱动码*/
/*全步正转*/
unsigned int motorstepall[48] ={8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1,\
								8,2,4,1};
/*全步反转*/
unsigned int motorstepalln[48]={8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2,\
								8,1,4,2};								
/*半步正转*/								
unsigned int motorstephalf[96] ={8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9,\
								 8,0xa,2,6,4,5,1,9};
/*半步反转*/
unsigned int motorstephalfn[96]={8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa,\
								 8,9,1,5,4,6,2,0xa};							 
								 
/*电机设置*/

unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};
void stepdelay(unsigned int dcmotorrun);

void SystemInit(void);
void PHANTOM(void);
void init_UART(void);
void timer_dcmotor(void);
int uart_recive(void);
unsigned int uart_send(void);
void change_time_dcmotor(void);

unsigned int temp;
void sys_reset(void); 



void main(void)
{
   	ONLED;
   	for(i = 0; i<6; i++)
	{
		motorset[i] =0;
	}
   	DINT;
   	SystemInit(); 
   	init_UART();
   	*IFR = 0x3f;
	*IMR = 0x01;     	
   	EINT;    
    	
   	/*实验主控程序*/
   	psend =  (PuartForDec5416)(&uarts[0]);
	precieve = (PuartForDec5416)(&uart[0]);
	pmotor = (PMotorConfig)(&motorset[0]);
	
	/*通知主机,系统准备好*/
	psend->Length = FRAMLONGTH;
	psend->Type = UARTCOMMAND;
	psend->Data[0] = INITOVER;
	psend->Mutul = UARTCONT;
	uart_send();
	
	for(;;)
	{			
		uart_s =uart_recive();
/* 返回值          0:接受完成  				        				          */
/*                 1:数据未准备好                                            */
/*                 -1:串口接受错误                                        */
/*                 2:中断超时错误                                            */
/*                 3: 较验出错                                                */
		
		/*串口出错*/
		
		
		
		
		
        /*接收从主机的数据*/
		precieve = (PuartForDec5416)(&uart[0]);
		switch(precieve->Data[0])
		{	
			/*电机设置*/
			case MTRCONFIG:
				for( i = 1; i<7 ; i++)
				{
					motorset[i-1] = precieve->Data[i];
				}
				precieve->Data[0] = 0;
				if(dcruncode == 1)
				{
					precieve->Data[0] = DCMTRRUN;
					break;	
				}
				if(stepruncode == STPMTRRUN)
				{
					precieve->Data[0] = STPMTRRUN;	
				}
				break;
			
			/*直流电机运行*/
			case DCMTRRUN:
				/*设置电机的工作方式*/
				if(pmotor->DcDir == CLOCKWISE)
				{
					dcdircontrl = 1;	
				}
				else
				{
					dcdircontrl = 2;
				}

				write_data=dcdircontrl;
				CEPAGESELECT = SELECTCE3;				
				*p_cntlbaseaddr=write_data;
				CEPAGESELECT = SELECTSRAM;
				/*设置电机的转速*/
				motorstatus[MPLUSSET]=pmotor->DcSpd;
				motorstatus[MPLUSCOUNT]=pmotor->DcSpd;
				motorstatus[MOTORPWMZ]=0;
						
				
				/*启动电机*/			

				motorstatus[MRATEBASE]=500;	
				motorstatus[MOTOPWMC]=500;
				CNTLREG=3;//cntl0=1
			
				/*使能电机*/
				dcmotorrun = 1;
				precieve->Data[0] = 0;
				if(stepruncode == STPMTRRUN)
				{
					precieve->Data[0] = STPMTRRUN;	
				}
				dcruncode = 1;
				break;
			
			/*直流电机反向*/	
			case DCMTRRVS:
				/*设置电机的工作方式*/
				if(pmotor->DcDir == CLOCKWISE)
				{
					pmotor->DcDir = ANTICLOCKWISE;	
				}
				else
				{
					pmotor->DcDir = CLOCKWISE;
				}
				precieve->Data[0] = DCMTRRUN;
				break;					
			/*直流电机刹车*/	//命令有错位,这里是反向命令。	
			case DCMTRBRK:
				/*设置电机的工作方式*/
				if(pmotor->DcDir == CLOCKWISE)
				{
					pmotor->DcDir = ANTICLOCKWISE;	
				}
				else
				{
					pmotor->DcDir = CLOCKWISE;
				}
				precieve->Data[0] = DCMTRRUN;
				break;	
			/*直流电机停*/
			case DCMTRSLWDWN:
				write_data=DCMOTORHALT;
				CEPAGESELECT = SELECTCE3;				
				*p_cntlbaseaddr=write_data;
				CEPAGESELECT = SELECTSRAM;
				
				dcmotorrun = 0;
				dcruncode =0;
				precieve->Data[0] = 0;
				break;
			/*步进电机运行*/
			case STPMTRRUN:
				stepruncode = STPMTRRUN; 
				/*确定是旋转还是定位*/
				if(pmotor->StpMode == ROTATE )
				{
					/*确定是全长还是半长*/
					if(pmotor->StpHlfStp == HALFSTEP)
					{
						steplong = 96;
					}
					else
					{
						steplong = 48;
					}
					stepspeed = pmotor->StpSpdDgr;
					stepspeedsave = pmotor->StpSpdDgr;
					stepnumber = 0; 
					localstep = 0;
				}
				else
				{
					/*定位*/
					steplong = pmotor->StpSpdDgr;
					stepspeed = 10;
					stepspeedsave = 10;
					stepnumber = 0; 
					localstep = 1;
				}
				steplongsave = steplong;
				precieve->Data[0] = 0;
			    break;
			
			/*步进电机反向*/     
			case STPMTRRVS:
				if(pmotor->StpDir ==1)
				{
					pmotor->StpDir = 0;
				}
				else
				{
					pmotor->StpDir = 1;	
				}
				stepnumber = 0; 
				precieve->Data[0] = STPMTRRUN;
				break; 
				
			/*步进电机停止*/    	
			case STPMTRHALT:
				precieve->Data[0] = 0;
				steplong = 0;
				stepruncode = 0;
				break;		
				
			/*系统复位*/
			case SYSRESET:
				write_data=DCMOTORBRAKE;
				CEPAGESELECT = SELECTCE3;				
				*p_cntlbaseaddr=write_data;
				CEPAGESELECT = SELECTSRAM;
				
				dcmotorrun = 0;
				dcruncode =0;
				precieve->Data[0] = 0;
				steplong = 0;
				stepruncode = 0;
				sys_reset();					

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -