标题:
单片机程序编译没有问题,烧录后控制不了步进电机
[打印本页]
作者:
新手-菜鸟
时间:
2018-11-17 13:41
标题:
单片机程序编译没有问题,烧录后控制不了步进电机
#include "reg52.h"
void delay(unsigned int t);
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
sbit k1 =P3^0;
sbit k2=P3^1;
sbit RX=P0^6; //
sbit TX=P0^7;
sbit shuidi=P0^3;
sbit hongyai=P0^0;
sbit yali=P0^2;
bit flag1=0;
bit flag2=0;
signed int time=0;
unsigned int timer=0;
unsigned long S=0;
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S= (long)(time*0.17); //算出来是CM
if((S>=4000)||flag1==1) //
{
flag1=0;
}
}
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag1=1; //中断溢出标志
}
void panduan()
{
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //总中断
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
if(S<80)
flag2=0;
else
flag2=0;
}
//调节转速
}
void motor_FFW()
{
unsigned char i;
{
for (i=0; i<8; i++)
{
if(hongyai==0) P1 = FFW[i]&0x1f; //调取数据
if(k2==0) P1 = FFW[i]&0x1f;
if(yali==0) P1 = FFW[i]&0x1f;
if(flag2==0)P1 = FFW[i]&0x1f;
delay(1);
}
}
}
void motor_FFZ()
{
unsigned char i;
{
for (i=0; i<8; i++)
{
if(k1==0) P1 = FFZ[i]&0x1f;
if(shuidi==0) P1 = FFZ[i]&0x1f;
delay(1); //调节转速
}
}
}
void main()
{
while(1)
{
if(flag2==0)
motor_FFW();
if(shuidi==0)
motor_FFZ();
if(hongyai==0)
motor_FFW();
if(yali==0)
motor_FFW();
}
}
复制代码
编译没有问题,程序烧录后控制不了五线四相步进电机
求大神解决!
作者:
angmall
时间:
2018-11-17 21:23
你的程序有缺陷,我给你来个程序试试
/*-----------------------------------------------
名称:步进电机
内容:本程序用于测试4相步进电机常规驱动
使用1-2相励磁
1-2相激励功率增倍,步进角度减半,抖动减少
顺序如下 a-ab-b-bc-c-cd-d-da 又称4相8拍
------------------------------------------------*/
#include <reg52.h>
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned char Speed;
bit Flag;
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned int i=512;//旋转一周时间
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //1表示边沿触发
Speed=10;
while(1){
Coil_OFF
while((i--)&&Flag) //正向
{ Coil_A1
DelayMs(Speed);
Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
DelayMs(Speed); //改变这个参数可以调整电机转速 ,
//数字越小,转速越大,力矩越小
Coil_B1
DelayMs(Speed);
Coil_BC1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_CD1
DelayMs(Speed);
Coil_D1
DelayMs(Speed);
Coil_DA1
DelayMs(Speed);
}
Coil_OFF
i=512;
while((i--)&&(!Flag))//反向
{
Coil_A1
DelayMs(Speed);
Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
DelayMs(Speed); //改变这个参数可以调整电机转速 ,
//数字越小,转速越大,力矩越小
Coil_D1
DelayMs(Speed);
Coil_CD1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_BC1
DelayMs(Speed);
Coil_B1
DelayMs(Speed);
Coil_AB1
DelayMs(Speed);
}
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
if(!INT0)
{
DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
if(!INT0)
//while(!INT1);//等待按键释放
{
Flag=!Flag;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1