标题:
89c51控制42步进电机转动一定角度,转动角度不对,求指教!!!
[打印本页]
作者:
suellasun
时间:
2017-11-29 14:53
标题:
89c51控制42步进电机转动一定角度,转动角度不对,求指教!!!
本帖最后由 suellasun 于 2017-11-29 14:56 编辑
#include<reg51.h>
#define MotorTabNum 5
unsigned char T0_NUM;
unsigned char END_FLAG = 0;
sbit MotorEn = P2^1; // 使能
sbit FX = P2^0; // 方向
sbit CLK = P2^2; // 脉冲
unsigned char g_MotorSt = 0; // 启停
unsigned char g_MotorDir = 0; // 正反
unsigned int SET_MotorPulse = 0; //相应角度对应的脉冲数量
unsigned int CLK_OUT_NUM = 0; // 脉冲计数
signed int MotorSpedNum = 0; // 速度档
float CUR_MotorAngle = 0.0; // 当前角度
int MotorAngle;
unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime); //延时函数
void T0_Init();
unsigned char Recive();
void SecondPro();
// 串口接收主程序
void main(void)
{
unsigned char lsData = 0;
T0_Init(); // 定时器0 1 初始化
MotorEn = 0; // 使能关闭
FX = 0; // 方向
while(1)
{
lsData = Recive();
if(lsData == 'A')
{
MotorAngle=90;
SET_MotorPulse=(unsigned int)((MotorAngle/0.9)*8.0);
SecondPro();
}
}
}
void SecondPro()
{
if (END_FLAG) // 角度目标达到
{
END_FLAG = 0; // 清
g_MotorSt = 0; // 电机关闭标志
MotorEn = 0;
}
else
{
TR0 = 1; //开启定时器
g_MotorSt = 1;//开电机
MotorEn = 1; //电机使能
}
}
/********定时器初始化***********************************************************/
void T0_Init()
{
TMOD = 0x21; //定时器0 1
SCON |= 0x50;
PCON |= 0x00;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
TH1 = 0xf3; // 12MHZ 2400波特率
TL1 = 0xf3;
EA = 1;
ET0 = 1;
TR1 = 1;
REN = 1;
}
void Timer0_Init() ////////
{
TMOD = 0x20;
SCON = 0x50;
PCON = 0x00;
TH1 = 0xf3; // 12MHZ 2400波特率
TL0 = 0xf3;
TR1 = 1;
REN = 1;
}
unsigned char Recive() // 串口接收程序
{
unsigned char date;
while(RI == 0);
RI = 0;
date = SBUF;
return date;
}
/********定时器中断*****************/
void T0_time() interrupt 1
{
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum--
{
T0_NUM = 0;
CLK=CLK^0x01; // 输出脉冲
CLK_OUT_NUM++;
if(CLK_OUT_NUM >= SET_MotorPulse) // 达到角度目标
{
CLK_OUT_NUM = 0; // 脉冲清空
TR0 = 0; // 关闭定时器
END_FLAG = 1; // 目标达到标志
}
}
}
/********延时函数***********************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--)
;
}
作者:
lxa0
时间:
2017-11-29 22:31
很想帮你
可惜看不懂C语言
作者:
夜鹫
时间:
2019-12-26 10:35
楼主怎么解决的啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1