📄 motor.c
字号:
#include <hidef.h>
#include <MC9s12H256.h>
#include <stdlib.h>
#include "Motor.h"
#include "Motor_includes.h"
#define STEP0 0
#define STEP01 8
#define STEP1 16
#define STEP2 32
#define STEP23 40
#define STEP3 48
#define STEP34 56
#define STEP4 64
#define STEP5 80
#define STEP56 88
#define STEP6 96
#define S0_DTC 0x80
#define S1_DTC 0x80
/*定义全局变量*/
unsigned int MotorFinalStep[4],MotorCurStep[4];
unsigned int MotorMaxStep[4],MotorMinStep[4];
int MotorSpeedIndex[4],MaxSpeedIndex[4];
char MotorMoveStatus[4];
char MotorStatus[4];
const char SinTbl4[96]={77,84,91,97,102,107,112,116,119,121,123,125,126,127,128,128,\
128,128,128,127,126,125,123,121,119,116,112,107,102,97,91,84,\
77,70,62,54,46,35,24,13,2,9,20,31,42,52,62,70,\
77,84,91,97,102,107,112,116,119,121,123,125,126,127,128,128,\
128,128,128,127,126,125,123,121,119,116,112,107,102,97,91,84,\
77,70,62,54,46,35,24,13,2,9,20,31,42,52,62,70};
const char CosTbl4[96]={77,70,62,54,46,35,24,13,2,9,20,31,42,52,62,70,\
77,84,91,97,102,107,112,116,119,121,123,125,126,127,128,128,\
128,128,128,127,126,125,123,121,119,116,112,107,102,97,91,84,\
77,70,62,54,46,35,24,13,2,9,20,31,42,52,62,70,\
77,84,91,97,102,107,112,116,119,121,123,125,126,127,128,128,\
128,128,128,127,126,125,123,121,119,116,112,107,102,97,91,84};
byte resetback0=0; //回零标志
extern unsigned int mt2;
extern unsigned int mt3;
void delay(unsigned int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<t;j++)
;
}
/****************************************************************************************
@函数名称 : void init_motor1(void);
@参数 : void
@返回值 : 无
@描述 : 步进电机1初始化
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
void init_motor1(void)
{
MCCTL0 = 0x0; //fbus(Eclock)=0, FAST=0 (slow mode)
MCCTL1 = 0x80; //RECIRC =1 (low side), disable interrupt for PWM motor
MCPER = 0x0080; //0x80=128 resoultion frequency = fbus
MCCC0 = 0xd0; //Dual Full H-bridge mode,left aligned
MCCC1 = 0xd0; //Dual Full H-bridge mode,left aligned
MCDC0 = 0x40; //;Duty cycle channel 0 for micro-stepping initialization
MCDC1 = 0x40; //;Duty cycle channel 1 for micro-stepping initialization
MotorFinalStep[PRES] = 0;
MotorCurStep[PRES] = 0;
MotorMaxStep[PRES] = PRESMAXSTEP; //motor end limit
MotorMinStep[PRES] = 0; //motor head limit
MotorMoveStatus[PRES] = IDLE;
MotorStatus[PRES] = OFF;
}
/****************************************************************************************
@函数名称 : void init_motor2(void);
@参数 : void
@返回值 : 无
@描述 : 步进电机2初始化
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
void init_motor2(void)
{
MCCC2 = 0xd0; //Dual Full H-bridge mode,left aligned
MCCC3 = 0xd0; //Dual Full H-bridge mode,left aligned
MCDC2 = 0x40; //;Duty cycle channel 0 for micro-stepping initialization
MCDC3 = 0x40; //;Duty cycle channel 1 for micro-stepping initialization
MotorFinalStep[TEMP] = 0;
MotorCurStep[TEMP] = 0;
MotorMaxStep[TEMP] = TEMPMAXSTEP; //motor end limit
MotorMinStep[TEMP] = 0; //motor head limit
MotorMoveStatus[TEMP] = IDLE;
MotorStatus[TEMP] = OFF;
}
/****************************************************************************************
@函数名称 : void init_motor3(void);
@参数 : void
@返回值 : 无
@描述 : 步进电机3初始化
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
void init_motor3(void)
{
MCCC4 = 0xd0; //Dual Full H-bridge mode,left aligned
MCCC5 = 0xd0; //Dual Full H-bridge mode,left aligned
MCDC4 = 0x40; //;Duty cycle channel 0 for micro-stepping initialization
MCDC5 = 0x40; //;Duty cycle channel 1 for micro-stepping initialization
MotorFinalStep[SPEEDOMETER] = 0;
MotorCurStep[SPEEDOMETER] = 0;
MotorMaxStep[SPEEDOMETER] = SPEEDOMAXSTEP; //motor end limit
MotorMinStep[SPEEDOMETER] = 0; //motor head limit
MotorMoveStatus[SPEEDOMETER] = IDLE;
MotorStatus[SPEEDOMETER] = OFF;
}
/****************************************************************************************
@函数名称 : void init_motor4(void);
@参数 : void
@返回值 : 无
@描述 : 步进电机3初始化
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
void init_motor4(void)
{
MCCC6 = 0xd0; //Dual Full H-bridge mode,left aligned
MCCC7 = 0xd0; //Dual Full H-bridge mode,left aligned
MCDC6 = 0x40; //;Duty cycle channel 0 for micro-stepping initialization
MCDC7 = 0x40; //;Duty cycle channel 1 for micro-stepping initialization
MotorFinalStep[TACHOMETER] = 0;
MotorCurStep[TACHOMETER] = 0;
MotorMaxStep[TACHOMETER] = TACHOMAXSTEP; //motor end limit
MotorMinStep[TACHOMETER] = 0; //motor head limit
MotorMoveStatus[TACHOMETER] = IDLE;
MotorStatus[TACHOMETER] = OFF;
}
/****************************************************************************************
@函数名称 : void back0_motor(void);
@参数 : void
@返回值 : 无
@描述 : 回零函数,初始化时调用(main.c),回零范围0--300度
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
void back0_motor(void)
{
char result1;
char result2;
char result3;
char result4;
resetback0 = 1;
MotorFinalStep[PRES] = 1;
MotorCurStep[PRES] = Back0Step;
result4 = motor_move(PRES,0);
MotorFinalStep[TEMP] = 1;
MotorCurStep[TEMP] = Back0Step;
result3 = motor_move(TEMP,0);
MotorFinalStep[SPEEDOMETER] = 1;
MotorCurStep[SPEEDOMETER] = Back0Step;
result1 = motor_move(SPEEDOMETER,0);
MotorFinalStep[TACHOMETER] = 1;
MotorCurStep[TACHOMETER] = Back0Step;
result2 = motor_move(TACHOMETER,0);
delay(1000);
resetback0 = 0;
}
/****************************************************************************************
@函数名称 : char check_pos(char channel,unsigned int position);
@参数 : char channel,unsigned int position
@返回值 : OK or ...
@描述 : 检查步进电机移动位置
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
char check_pos(char channel,unsigned int position)
{
char flag;
if(position == MotorFinalStep[channel])
{
flag = STEPNOT;
}
else if(position > MotorMaxStep[channel])
{
if(MotorFinalStep[channel] == MotorMaxStep[channel])
{
flag = STEPNOT;
}
else
{
flag = STEPHIG;
}
}
else if(position < MotorMinStep[channel])
{
if(MotorFinalStep[channel] == MotorMinStep[channel])
{
flag = STEPNOT;
}
else
{
flag = STEPLOW;
}
}
else
{
flag = OK;
}
return flag;
}
/****************************************************************************************
@函数名称 : char motor_move(char channel,unsigned int position)
@参数 : char channel,unsigned int position
@返回值 : ENABLE or DISABLE
@描述 : 步进电机步进到指定位置
@最后编辑时间 : 2006-02-23
@版本 : V1.0
@修改
*****************************************************************************************/
char motor_move(char channel,unsigned int position)
{
unsigned int data;
char flag;
data = 0;
mt2=0;
mt3=0;
if(channel == SPEEDOMETER)
{
if(MotorStatus[channel] == OFF)
{
flag = check_pos(channel,position);
if(flag == OK)
{
MotorFinalStep[channel] = position;
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC2 = TCNT - 20;
TIE |= 4;
}
else if(flag == STEPHIG)
{
MotorFinalStep[channel] = MotorMaxStep[channel];
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC2 = TCNT - 20;
TIE |= 4;
}
else if(flag == STEPLOW)
{
MotorFinalStep[channel] = MotorMinStep[channel];
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC2 = TCNT - 20;
TIE |= 4;
}
else if(flag == STEPNOT)
{
MotorStatus[channel] = OFF;
}
else
{
}
}
}
else if(channel == TACHOMETER)
{
if(MotorStatus[channel] == OFF)
{
flag = check_pos(channel,position);
if(flag == OK)
{
MotorFinalStep[channel] = position;
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC3 = TCNT - 20;
TIE |= 8;
}
else if(flag == STEPHIG)
{
MotorFinalStep[channel] = MotorMaxStep[channel];
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC3 = TCNT - 20;
TIE |= 8;
}
else if(flag == STEPLOW)
{
MotorFinalStep[channel] = MotorMinStep[channel];
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC3 = TCNT - 20;
TIE |= 8;
}
else if(flag == STEPNOT)
{
MotorStatus[channel] = OFF;
}
else
{
}
}
}
else if(channel == PRES)
{
if(MotorStatus[channel] == OFF)
{
flag = check_pos(channel,position);
if(flag == OK)
{
MotorFinalStep[channel] = position;
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
else {
data = MotorFinalStep[channel]-MotorCurStep[channel];
MotorSpeedIndex[channel] = abs(data)>>10;
}
MotorStatus[channel] = ON;
TC0 = TCNT - 20;
TIE |= 1;
}
else if(flag == STEPHIG)
{
MotorFinalStep[channel] = MotorMaxStep[channel];
MotorMoveStatus[channel] = CONST;
if(resetback0) {
MotorSpeedIndex[channel] = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -