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

📄 stepper.c

📁 Motor & key & LED
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////
//
// Motor main function
//
//////////////////////////////////////////////////
// Includes //
#include <AT89X52.H>
#include <stdlib.h>
#include <stdio.h>
#include "Motor.h"

// Statics //
static STP_CONTROLLER sMotor;
static UI_CONTROLLER eUser;

// Prototype
void MS_DELAY(Uint8 N_ms);
void TempPause(void);
void BoardInit(void);
void UserInterfaceInit(void);
/* Motor functions */
void MotorSystemInit(void);
void MotorStateReset(void);
void Step_Driver_Start(void);
void StepStateMachine(void);
void Switch2DetectPhase(void);
void SendCurPhaseTable(void);
void UpdatePhaseIndex(void);
void StepMoveStart(STP_MOV_INFO moveInfo);
void ValidateStepParameters(STP_MOV_INFO moveInfo);

Uint16 DecelGetNextSpeed(void);
Uint16 AccelGetNextSpeed(void);

// UI
Boolean IsMotorRunning(void);
Uint8 GetButtonTable(Uint8 fRow, Uint8 fCol);
void MotorDecelNow(void);
void MotorMoveStart(void);
void AddSelectNextIndexSpeed(void);
void DecSelectNextIndexSpeed(void);
void DisplayRemainSteps(void);
void DisplayCurrentSpeed(void);
void LED_Flush(void);
void LED_Display(void);
void LED_Initialize(void);
//void UI_ScanKey(void);
void DispatchKey(void);
void ProcessKey(Uint8 row, Uint8 col);
void ClrNeverStopFlag(void);
void SetNeverStopFlag(void);
void UpdateLedParameter(void);
void LedDecParameter(void);
//void keypress(void);

// Externs
//extern char *ultoa(unsigned long value,char *string,int radix);
//extern char *itoa(Uint16 value,char *string,int radix);
int myitoa(char *s,Uint16 n);
// Globals //
//code
static Uint8 counter;
//Uint8 t1,t2;

Uint8 a_val;
Uint8 b_val;
Uint8 c_val;
Uint8 d_val;
Uint8 e_val;

STP_MOV_INFO TestMotorMove = {
	                        STP_MOV_FWD,
	                        STP_MOV_ONLY,
	                        HALF_MODE,
	                        0x0FFF,
	                        0xD8F0,
	                        0xEC78
	                        //0x0010,
	                        //0x0000
	                     };
/*
STP_MOV_INFO RunMotorMove = {
	                        STP_MOV_FWD,
	                        STP_MOV_ONLY,
	                        HALF_MODE,
	                        0x0FFF,
	                        0xD8F0,
	                        0xEC78
	                        //0x0010,
	                        //0x0000
	                     };
*/
// Speed table
#if 0
				  `
#define MAX_TABLE_VALUE  94
code Uint16  StpSpeedTable[MAX_TABLE_VALUE + 1] = {
0xFD8F,0xEE3E,0xEFB9,0xF0F9,0xF20C,
0xF2FA,0xF3CB,0xF482,0xF526,0xF5B8,0xF63C,0xF6B3,0xF71F,0xF782,0xF7DC,
0xF830,0xF87C,0xF8C4,0xF906,0xF943,0xF97D,0xF9B3,0xF9E5,0xFA14,0xFA41,
0xFA6B,0xFA93,0xFAB8,0xFADC,0xFAFD,0xFB1E,0xFB3C,0xFB59,0xFB75,0xFB8F,
0xFBA8,0xFBC1,0xFBD8,0xFBEE,0xFC03,0xFC18,0xFC2B,0xFC3E,0xFC50,0xFC62,
0xFC72,0xFC83,0xFC92,0xFCA1,0xFCB0,0xFCBE,0xFCCC,0xFCD9,0xFCE6,0xFCF2,
0xFCFE,0xFD0A,0xFD15,0xFD20,0xFD2B,0xFD35,0xFD3F,0xFD49,0xFD53,0xFD5C,
0xFD65,0xFD6E,0xFD76,0xFD7E,0xFD87,0xFD8F,0xFD96,0xFD9E,0xFDA5,0xFDAC,
0xFDB3,0xFDBA,0xFDC1,0xFDC7,0xFDCE,0xFDD4,0xFDDA,0xFDE0,0xFDE6,0xFDEC,
0xFDF1,0xFDF7,0xFDFC,0xFE01,0xFE06,0xFE0C,0xFE0C,0xFE0C,0xFE0C,0xFE0C
};

#else

#define MAX_TABLE_VALUE  99
code Uint16  StpSpeedTable[MAX_TABLE_VALUE + 1] = {
0xD8F0,0xDF72,0xE419,0xE796,0xEA4C,0xEC78,0xEE3E,0xEFB9,0xF0F9,0xF20C,
0xF2FA,0xF3CB,0xF482,0xF526,0xF5B8,0xF63C,0xF6B3,0xF71F,0xF782,0xF7DC,
0xF830,0xF87C,0xF8C4,0xF906,0xF943,0xF97D,0xF9B3,0xF9E5,0xFA14,0xFA41,
0xFA6B,0xFA93,0xFAB8,0xFADC,0xFAFD,0xFB1E,0xFB3C,0xFB59,0xFB75,0xFB8F,
0xFBA8,0xFBC1,0xFBD8,0xFBEE,0xFC03,0xFC18,0xFC2B,0xFC3E,0xFC50,0xFC62,
0xFC72,0xFC83,0xFC92,0xFCA1,0xFCB0,0xFCBE,0xFCCC,0xFCD9,0xFCE6,0xFCF2,
0xFCFE,0xFD0A,0xFD15,0xFD20,0xFD2B,0xFD35,0xFD3F,0xFD49,0xFD53,0xFD5C,
0xFD65,0xFD6E,0xFD76,0xFD7E,0xFD87,0xFD8F,0xFD96,0xFD9E,0xFDA5,0xFDAC,
0xFDB3,0xFDBA,0xFDC1,0xFDC7,0xFDCE,0xFDD4,0xFDDA,0xFDE0,0xFDE6,0xFDEC,
0xFDF1,0xFDF7,0xFDFC,0xFE01,0xFE06,0xFE0C,0xFE0C,0xFE0C,0xFE0C,0xFE0C
};

#endif

// Micro Step Running table
code Uint8   LookUpPhaseTable[16] =
{
              0x3c,0x2c,0xb4,0x64,0xc4,0x44,0x94,0x0c,
              0x18,0x08,0x90,0x40,0xe0,0x60,0xb0,0x28
};

// Detent table
code Uint8   DetentLookUpPhaseTable[16] =
{
	            0x7C,0x6C,0x6C,0x6c,0xCC,0x4C,0x4C,0x4C,
	            0x58,0x48,0x48,0x48,0x5C,0x68,0x68,0x68
};

#if 0
#define NO_BUTTON     0x00
#define START_STOP    0x0C
#define ACCEL_SPEED   0x0A
#define DECEL_SPEED   0x09
#define STEP_MENU     0x14
#define SPEED_MENU    0x12
#define NEVER_STOP    0x11
#define Undefine      0x00

#else
#define NO_BUTTON     0x00
#define START_STOP    0x01
#define ACCEL_SPEED   0x02
#define DECEL_SPEED   0x03
#define STEP_MENU     0x04
#define SPEED_MENU    0x05
#define NEVER_STOP    0x06
#define Undefine      0x00

#endif
////////////////////////////////////////////
//    Simple Matrix Key value
//         2   1   0
//    3 ---|---|---|---
//    4 ---|---|---|---
//    5 ---|---|---|---
//there are 9 keys needed.when user press the accel_speed key at once,motor speed increase 10pps
////////////////////////////////////////////
/*
code Uint8 ButtonTable[] =
{
	      START_STOP, ACCEL_SPEED, DECEL_SPEED,
	      STEP_MENU,  SPEED_MENU,  NEVER_STOP,
	      Undefine,   Undefine,    Undefine
};
*/
code Uint8 ButtonTable[4][4] = {
	                               {START_STOP, ACCEL_SPEED, DECEL_SPEED, STEP_MENU},
	                               {SPEED_MENU, NEVER_STOP, Undefine, Undefine},
	                               {Undefine, Undefine, Undefine, Undefine},
	                               {Undefine, Undefine, Undefine, Undefine}
	                             };

//////////////////////////////////////////////////
//
//   Main Enry
//
//void main(int argc, char **argv)
void main()
{
	   BoardInit();
     MS_DELAY(100);
	   MotorSystemInit();
	   LED_Initialize();
	   UserInterfaceInit();


	   while(1)
	   {
	   	   // Waiting key & LED flush.
	   	   DispatchKey();
	   	   LED_Flush();
	   	   //... ;
	   }
}

// Wait function // Should adjust to 1ms
void MS_DELAY(Uint8 N_ms)
{
	         Uint8 i = 250;

           while(N_ms--)
           {
           	  while(i--);
           }
}

void LED_Initialize()
{
   EA   = 1;


   TH1  = 0xf4;
   TL1  = 0x48;

   counter = 0x00;
   a_val   = 0x00;
   b_val   = 0x00;
   c_val   = 0x00;
   d_val   = 0x00;

   startINT;
   startTim;
}

//////////////////////////////////////////////////
//
//   Hardware Initialization
//
void BoardInit(void)
{
   EA = 1;    //ENABLE INT
  // ET0=1;  //ENABLE INT
   P2 = 0x00;
   TH0 = 0x00;
   TL0 = 0x00;

   TMOD = T1_M0_ | T0_M0_;          //T0:mode 1 16bit timer capture
   //led display 0000
   /*
   P0=0x30;
   MS_DELAY(5);
   P0=0x20;
   MS_DELAY(5);
   P0=0X10;
   MS_DELAY(5);
   P0=0X00;
   MS_DELAY(5);
   */
   // LED display 8888
   // LED_Display(0x8888);
}
//////////////////////////////////////////////////
//
// Function UserInterfaceInit()
//
void UserInterfaceInit(void)
{
            eUser.newButton = 0;
            eUser.preButton = 0;
            eUser.dbcButton = 0;   // debounce button
            eUser.curMenu   = 0;
            eUser.ledValue  = 0;
}
//////////////////////////////////////////////////
//
// Function StepMotorInit();
// motor is in initial state,it will move several steps

void MotorSystemInit(void)
{
	    //sMotor.curStatus = TestMotorMove;
	    sMotor.state = STP_INIT;
	    sMotor.phaseIndex = 0;
	    sMotor.accelIndex = 0;
	    //sMotor.decelIndex = 0;
	    sMotor.accelSteps = 0;
	    sMotor.flag       = 0;

	    // Let motor move several steps in a low speed.
	    MotorStateReset();
}

//
void MotorStateReset(void)
{
	    StepMoveStart(TestMotorMove);
}

//
void StepMoveStart(STP_MOV_INFO moveInfo)
{
            ValidateStepParameters(moveInfo);
            Step_Driver_Start();
}

//
void Step_Driver_Start(void)
{
	    Switch2DetectPhase();

	    sMotor.curSpeed = StpSpeedTable[sMotor.accelIndex];
	    ENABLE_INTS;
	    sMotor.state = STP_START;
      SendCurPhaseTable();
}

//According vFinal & steps searching speed table value.
void ValidateStepParameters(STP_MOV_INFO moveInfo)
{
	    int i;

	    //sMotor.curStatus = moveInfo;
	    sMotor.curStatus.dir         = moveInfo.dir;
	    sMotor.curStatus.moveType    = moveInfo.moveType;
	    sMotor.curStatus.stepMode    = moveInfo.stepMode;
	    sMotor.curStatus.steps       = moveInfo.steps;
	    sMotor.curStatus.vInit       = moveInfo.vInit;
	    sMotor.curStatus.vFinal      = moveInfo.vFinal;
	    //sMotor.curStatus.smoothSteps = moveInfo.smoothSteps;

	    for(i = 0; i < MAX_TABLE_VALUE; i++)
	    {
	    	  if(sMotor.curStatus.vInit == StpSpeedTable[i])
	    	  {
	    	  	  sMotor.accelIndex = i;
	    	  }

	    	  if(sMotor.curStatus.vFinal > StpSpeedTable[MAX_TABLE_VALUE])
	    	  {
	    		    sMotor.curStatus.vFinal = StpSpeedTable[MAX_TABLE_VALUE];
	    		    sMotor.accelSteps = MAX_TABLE_VALUE - sMotor.accelIndex;
	    		    return;
	      	}
	       	else if(sMotor.curStatus.vFinal > StpSpeedTable[i])
	      	{
	      		  sMotor.accelSteps++;
	    	  }
	    	  else
	     	  {
	     	  	  sMotor.curStatus.vFinal = StpSpeedTable[i];
	     	  	  sMotor.accelSteps = sMotor.accelSteps - sMotor.accelIndex;
	    	      return;
	    	  }
	    }
}

/////////////////////////////////////////////////
//
// Function Step control ISR
//

timer_motor() interrupt 1 using 2
{
	 TF0 = 0;
   StepStateMachine();
}

void StepStateMachine(void)
{

            DISABLE_INTS;

            if(sMotor.curStatus.steps == 0)
            {
                Switch2DetectPhase();
                DISABLE_TIMER;
		            sMotor.state = STP_STOPPED;    //ADD REWRITE
		            sMotor.curSpeed = 0x0000;
                //ReleaseStepMotor();
            }
            else
            {
            	   /* Never stop flag */
            	   if(sMotor.flag != MOTOR_NEVER_STOP)
            	   { 
            	         sMotor.curStatus.steps--;
            	   }

            	   /* Never Stop */
            	   //if(sMotor.curStatus.steps == 0xFFFE)
            	   //{
            	   //      sMotor.curStatus.steps = 0xFFFF;
            	   //}

                 switch(sMotor.state)
                 {
                     case STP_INIT:
                             sMotor.curSpeed = sMotor.curStatus.vInit;
                             break;

                     case STP_START:
                             //if(sMotor.curStatus.smoothStep > 0 )
                             //{
                             //      sMotor.curStatus.smoothStep--;
                             //}
                             //else
                             //{
                                   sMotor.state = STP_ACCEL;
                             //}

                             sMotor.curSpeed = sMotor.curStatus.vInit;
                             break;

                     case STP_ACCEL:
                             if(sMotor.curSpeed >= sMotor.curStatus.vFinal)
                             {
                                   sMotor.curSpeed = sMotor.curStatus.vFinal;
                                   sMotor.state = STP_RUNNING;
                             }
                             else
                             {
                             	     sMotor.curSpeed =  AccelGetNextSpeed();
                             }
                             break;

                     case STP_RUNNING:
                             if(sMotor.curStatus.steps <= (sMotor.accelSteps + 1))
                             {
                             	     sMotor.state = STP_DECEL;
                             }
                             break;

                     case STP_DECEL:
                     	       if(sMotor.curSpeed <= sMotor.curStatus.vInit)
                             {
                                   sMotor.curSpeed = sMotor.curStatus.vInit;
                                   sMotor.state = STP_INIT;
                             }
                             else
                             {
                             	     sMotor.curSpeed =  DecelGetNextSpeed();
                             }
                             break;

                     case STP_STOPPED:

⌨️ 快捷键说明

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