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

📄 motor.c

📁 基于ucosSAEj1939的汽车组合仪表,硬件是MC9S12H128
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -