📄 stepmotor.c
字号:
#include "StepMotor.h"
//*********************************步进电机的运行曲线表******
code INT8U StepMotorCurve[256]=
{
0, 2, 3, 5, 6, 8, 9, 11, 13, 14,
16, 17, 19, 20, 22, 24, 25, 27, 28, 30,
31, 33, 34, 36, 38, 39, 41, 42, 44, 45,
47, 48, 50, 51, 53, 55, 56, 58, 59, 61,
62, 64, 65, 67, 68, 70, 71, 73, 74, 76,
77, 79, 80, 82, 83, 85, 86, 88, 89, 91,
92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
107, 108, 109, 111, 112, 114, 115, 117, 118, 119,
121, 122, 123, 125, 126, 128, 129, 130, 132, 133,
134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
147, 149, 150, 151, 152, 154, 155, 156, 157, 159,
160, 161, 162, 164, 165, 166, 167, 168, 170, 171,
172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
183, 184, 185, 186, 188, 189, 190, 191, 192, 193,
194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
213, 214, 215, 215, 216, 217, 218, 219, 220, 220,
221, 222, 223, 224, 224, 225, 226, 227, 227, 228,
229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
235, 236, 237, 237, 238, 238, 239, 239, 240, 241,
241, 242, 242, 243, 243, 244, 244, 245, 245, 245,
246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
250, 250, 250, 251, 251, 251, 252, 252, 252, 252,
253, 253, 253, 253, 254, 254, 254, 254, 254, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255,
} ;
//*******************************延时一个us**************************
void Delay1us(void)
{
_nop_();
}
//*******************************延时n个us**************************
void DelayNus(INT16U us)
{
while(us--)
{
Delay1us();
_nop_();
_nop_();
}
}
//****************************SPI0串口发送一个字节***************
void SPI0SendOneByte(INT8U Value)
{
}
//******************************HC595移位两个字节*******************
void HC595Shift2Byte(INT8U ShiftData)
{
Load595Wait;
SPI0SendOneByte(ShiftData);
SPI0SendOneByte(ShiftData);//这里要发送2次,因为有两个一样的值
Load595Execuate; //更新数值
}
//****************************依次装入256个曲线值****************
void LoadCurveValue(void)
{
INT8U i;
for(i==0;i<0xff;i++)
{
HC595Shift2Byte(StepMotorCurve[i]);
DelayNus(StepMotorTurnSpeed);//延时越少电机转动得越快
}
for(i==0;i<0xff;i++)
{
HC595Shift2Byte(StepMotorCurve[0xff-i]);
DelayNus(StepMotorTurnSpeed);//延时越少电机转动得越快
}
//这里要进行半个正弦波的过程
}
//**************************步进电机走一步AB,A/B/,BA,B/A/,AB***********************
void StepMotorWalkOneStep(INT8U Direction)
{
if(Direction==0)//向右转过程为AB-B/A/- A/B/-AB-BA-A/B/-B/A/-BA
{
StepMotorPhase1H;//相位脚置高
StepMotorPhase2L;
LoadCurveValue();//执行了 AB,B/A/,
StepMotorPhase1H;
StepMotorPhase2H;
LoadCurveValue();//执行了 A/B/,AB
StepMotorPhase1L;//相位脚置高
StepMotorPhase2H;
LoadCurveValue();//执行了 BA,A/B/
StepMotorPhase1L;
StepMotorPhase2L;
LoadCurveValue();//执行了 B/A/,BA
}
else if(Direction==1)//向左转过程为AB-A/B/-B/A/-AB-BA-B/A-/A/B/-BA
{
StepMotorPhase1H;//相位脚置高
StepMotorPhase2H;
LoadCurveValue();//执行了 AB,B/A/,
StepMotorPhase1H;
StepMotorPhase2L;
LoadCurveValue();//执行了 A/B/,AB
StepMotorPhase1L;//相位脚置高
StepMotorPhase2L;
LoadCurveValue();//执行了 BA,A/B/
StepMotorPhase1L;
StepMotorPhase2H;
LoadCurveValue();//执行了 B/A/,BA
}
}
//********************** 步进电机走N步****************************
void StepMotorWalkNStep(INT8U Direction,INT16U NStep)
{
while(NStep--)
{
StepMotorWalkOneStep(Direction);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -