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