📄 motor.c
字号:
/*********************************************************************************
* 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 + -