标题:
单片机步进电机程序问题
[打印本页]
作者:
马涛
时间:
2021-3-2 12:34
标题:
单片机步进电机程序问题
请问这里unsigned int MotorDelay,Speed=1,TIM,CT;中的TIM和CT分别代表什么意思?还有A = 0; //0xf1
b = 1;
C = 1;
D = 1;
A=0,B=1表示什么意思?0XF1是怎么来的求求大神
单片机源程序如下:
/*************************************************************************************
* 标题: 步进电机试验一 *
* *
* 通过本例程了解步进马达使用及驱动程序编写 *
*; 单双八拍工作方式: *
*; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度) *
* J14短路冒需断开 *
* 请学员一定要消化掉本例程 *
*
**************************************************************************************/
#include "reg52.h"
//Motor
sbit A = P1^0; //定义管脚
sbit b = P1^1;
sbit C = P1^2;
sbit D = P1^3;
///////////////////////////////////////
//步进电机驱动
unsigned char MotorStep=0;
unsigned int MotorTimer = 0;
unsigned int MotorDelay,Speed=1,TIM,CT;
#define speed 8 // 调整速度 数值不要设的太低 低了会引起震动。
/*****************************************************
* 初始化马达 *
******************************************************/
void InitMotor()
{
A = 1;
b = 1;
C = 1;
D = 1;
}
void SetMotor()
{
// if(Speed == 0) return;
MotorDelay=Speed; //调整速度
switch(MotorStep)
{
case 0:
if(TIM) // A
{
A = 0; //0xf1
b = 1;
C = 1;
D = 1;
MotorStep = 1;
TIM=0;
}
break;
case 1: // AB
if(TIM)
{
A = 0; //0xf3
b = 0;
C = 1;
D = 1;
MotorStep = 2;
TIM=0;
}
break;
case 2: //B
if(TIM)
{
A = 1;
b = 0; //0xf2
C = 1;
D = 1;
MotorStep = 3;
TIM=0;
}
break;
case 3: //BC
if(TIM)
{
A = 1;
b = 0; //0xf6
C = 0;
D = 1;
MotorStep = 4;
TIM=0;
}
break;
case 4: //C
if(TIM)
{
A = 1;
b = 1; //0xf4
C = 0;
D = 1;
MotorStep = 5;
TIM=0;
}
break;
case 5: //CD
if(TIM)
{
A = 1;
b = 1; //0xfc
C = 0;
D = 0;
MotorStep = 6;
TIM=0;
}
break;
case 6: //D
if(TIM)
{
A = 1;
b = 1; //0xf8
C = 1;
D = 0;
MotorStep = 7;
TIM=0;
}
break;
case 7: //DA
if(TIM)
{
A = 0;
b = 1; //0xf9
C = 1;
D = 0;
MotorStep = 0;
TIM=0;
}
break;
}
}
void system_Ini()
{
TMOD|= 0x11;
TH0=0xDC; //11.0592M
TL0=0x00;
IE = 0x8A;
TR0 = 1;
}
main()
{ system_Ini();
InitMotor();
while(1)
{
SetMotor();
}
}
/************************************************
* *
* 定时中断延时 *
************************************************/
void Tzd(void) interrupt 1
{
TH0 = 0xfe; //11.0592
TL0 = 0x33;
if( CT++==speed)
{TIM=1;
CT=0;
}
}
复制代码
作者:
Penpen123
时间:
2021-3-3 09:04
首先你要理解四线两相步进电机控制原理哈。ABCD代表四线,一般AB为1相,CD为2相。分别按顺序置位A-AB-B-BC-C-CD-D-DA,一共八步骤位。这是背景。
然后看回代码第13行,ABCD分别对应P1端口的0~3bit,而4~7bit并没用。
再看代码39行整个SetMotor函数
步骤1置位A: 则是P1口:11110001,转为16进制就是0xF1
步骤2置位AB:则是P1口:11110011,转为16进制就是0xF3
步骤3置位B: 则是P1口:11110010,转为16进制就是0xF2
后面如此类推。
而TIM只是一个标志位,=1:可以控制电机执行下一个步骤位 =0:不允许执行
CT则是记录时间用的,>speed:可以置位TIM1,<speed:未可以置位TIM
也就是说,CT和speed控制了电机步骤位转移的频率,TIM决定电机在while循环里是否可以转到下一步骤位。
作者:
ZXWPL
时间:
2021-3-3 09:46
TIM是你自己定义的变量,就是用来计时的,每speed个中断TIM=1;电机就走一步 MotorStep步数+1,8步走完。 A-AB-B-BC-C-CD-D-DA 。一共ABCD,4根线,按照这个顺序,你程序写的第一步A就是只有A=0(低电平),BCD没写出来的就是1(高电平),此时P1=11111110=0xfe才对。 至于后面备注了0xf1则是因为,步进电机初始化为P1=0xF0,这个时候第一步就是A写1,即P1=11110001=0xf1。实际上后面的备注与你的程序并不符合
作者:
design003
时间:
2021-3-3 09:50
楼上解答的非常好,做单片机系统需要对被控对象很熟悉的,我一直认为单片机系统开发的重点在硬件 程序是处理事情的C语言具现 所以 还是 回过头来再补学 一些基础的好,重来一次手边有实物容易太多了
作者:
wulin
时间:
2021-3-3 11:20
A、B、C、D已被定义为P1口的低4位,只要按A-AB-B-BC-C-CD-D-DA顺序输出驱动信号即可。由于IO口与电机之间有驱动管反相放大,当P1口的低4位输出1110,经反相就成0001,原作者只是用16进制的方式注释表示电机端的电平状态。其高4位的实际状态是0或f不必过于纠结。其余7个注释同理不赘述。
作者:
robinsonlin
时间:
2021-3-3 12:03
步进电机驱动的问题。关于步进电机的驱动可以简单分为两类。
1,通过控制芯片驱动,这时,只用对驱动芯片发送脉冲信号(脉冲的快慢决定电机的运行速度,当然还要看你的细分),发送方向信号dir,发送使能信号en,控制芯片就会给步进电机功率驱动信号。 这个功率驱动信号的原型,就是你程序中的a,b,c,d对应的电平逻辑值。
2,通过单片机io口和放大电路驱动。 步进电机的驱动是需要节拍的, 你程序中switch(MotoStep)语句,就是在产生节拍, 然后通过定时器控制CT自加来控制产生节拍的速度。这种驱动方式是很早期的,现在基本上不用了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1