怎样用51单片机接两相步进电机驱动器来控制步进电机?

怎样用51单片机接两相步进电机驱动器来控制步进电机?,第1张

脉冲信号就是像流水灯差不多,用两个口。

例如:

用到P1^0和P1^1;把P10制低电平,P11制高电平,延时一段时间后,P10制高电平 P11制低电平,如此循环,看程序:

#include "reg52h"

sbit P10=P1^0;

sbit P11=P1^1;

void delay(unsigned int x)

P10=0;P11=1;

delay(1000);

P10=1;P11=0;

delay(1000);

}

}1-B1-B1A0;

两相四线程序  接P1口

#include "reg52h"

#define uint unsigned int

#define uchar unsigned char

uchar code tab[]={0xfd,0xfb,0xf7,0xef};

uint i;

void delay(uint x)

{

uint y;

for(;x>0;x--)

{

for(y=0;y<124;y++);

void main()

while(1)

P1=tab[i];

i++;

if(i==4)

{

i=0;

}

delay(20);

扩展资料:

同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等;

常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

参考资料来源:百度百科-步进电机

51单片机驱动直流电机程序(用的是l298n芯片):

#include<reg51h>

#include<mathh>

#define uint unsigned int

#define uchar unsigned char

#define N 100

sbit s1=P1^0; //电机驱动口

sbit s2=P1^1; //电机驱动口

sbit s3=P1^2; //电机驱动口

sbit s4=P1^3; //电机驱动口

sbit en1=P1^4; //电机使能端

sbit en2=P1^5; //电机使能端

sbit LSEN=P2^0; //光电对管最左

sbit LSEN1=P2^1; //光电对管左1

sbit LSEN2=P2^2; //光电对管左2

sbit RSEN1=P2^3; //光电对管右1

sbit RSEN2=P2^4; //光电对管右2

sbit RSEN=P2^5; //光电对管最右

uint pwm1=0,pwm2=0,t=0;

void delay(uint xms)

{

uint a;

while(--xms)

{

for(a=123;a>0;a--);

}

}

void motor(uchar speed1,uchar speed2)

{

if(speed1>=-100&&speed1<=100)

{

pwm1=abs(speed1);

if(speed1>0)

{

s1=1;

s2=0;

}

if(speed1==0)

{

s1=1;

s2=1;

}

if(speed1<0)

{

s1=0;

s2=1;

}

}

if(speed2>=-100&&speed2<=100)

{

pwm2=abs(speed2);

if(speed2>0)

{

s3=1;

s4=0;

}

if(speed2==0)

{

s3=1;

s4=1;

}

if(speed2<0)

{

s3=0;

s4=1;

}

}

}

void go_forward(uint speed)

{

s1=1;

s2=0;

s3=1;

s4=0;

pwm1=speed;

pwm2=speed;

}

void go_back(uint speed)

{

s1=0;

s2=1;

s3=0;

s4=1;

pwm1=speed;

pwm2=speed;

}

void stop()

{

s1=1;

s2=1;

s3=1;

s4=1;

pwm1=0;

pwm2=0;

}

void turn_right(uint P1,uint P2) //右转函数

{

s1=1;

s2=0;

s3=0;

s4=1;

pwm1=P1;

pwm2=P2;

}

void turn_left(uint P1,uint P2) //左转函数

{

s1=0;

s2=1;

s3=1;

s4=0;

pwm1=P1;

pwm2=P2;

}

void tracking()

{

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //没有检测到

{

go_forward(100);

}

if((LSEN1==1)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //左一检测到

{

turn_left(40,80); //左转 右轮 》左轮

delay(N);

}

if((LSEN1==0)&&(LSEN2==1)&&(RSEN1==0)&&(RSEN2==0)) //左二检测到

{

turn_left(40,60); //左转 右轮 》左轮

delay(N);

}

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==1)&&(RSEN2==0)) //右一检测到

{

turn_right(60,4); //右转 左轮 》右轮

delay(N);

}

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==1)) //右二检测到

{

turn_right(80,40); //右转 左轮 》右轮

delay(N);

}

if((LSEN1==1)&&(LSEN2==1))

{

turn_left(0,100);

delay(1000);

}

if((RSEN1==1)&&(RSEN2==1))

{

turn_right(100,0);

delay(1000);

}

}

void avoidance()

{

}

void init()

{

TMOD=0x02; //timer0 同时配置为模式2, 8自动重装计数模式

TH0=156; //定时器初值设置100us中断

TL0=156;

ET0=1;

EA=1;

TR0=1; //开启总中断

}

void main()

{

init();

while(1)

{

tracking();

}

}

void timer0() interrupt 1 //电机驱动 提供PWM信号

{

if(t<pwm1)

en1=1;

else

en1=0;

if(t<pwm2)

en2=1;

else

en2=0;

t++;

if(t>100)

t=0;

}

扩展资料

L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是25-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。

参考资料来源:百度百科-l298n

1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是怎么回事呢,可以先作一些了解,再来知道有征对性地提问就好了。]

同学,老实说,不用伺服驱动器基本不可能,因为单片机要直接驱动一部交流伺服电机需要大量数字信号处理(乘除,三角变换)
如果系统里包含伺服驱动器,你有两个办法
一让伺服驱动器工作在位置模式(CP脉冲/DIR方向接口),单片机只要能用定时器产生脉冲就可以了,硬件上用光耦,集电机开路输出给伺服驱动器
二让伺服驱动器工作在速度模式(ANALOG模拟量接口),单片机+DAC产生-10v~+10V模拟量控制电机方向(模拟量极性)和速度(模拟量幅值) 速度控制上还有2种方法,可以用软件来做PID控制,缺点速度慢,受单片机速度影响大,也可以用运放电路来做PID缺点,Kp Ki Kd参数一旦固定,不易改变,但速度最快

这个并不难啊。
如图,左边接单片机控制IO,用一路就可以了,如用IN1。右边接直流电机,对应接OUT1即可。直流电机一端接在OUT1上,另一端接一个电源。这样,当IN1为高电平时,OUT1输出低电平,此时可让电机转动。要停止时,IN1输入0即可。

第一步:先在Proteus软件中设计仿真电路原理图。

第二步:再在Keil C51软件中编写且编译程序,程序后缀必须是c。然后在打开的“Option for Target‘Target 1’”选项卡,“Target”标签下频率设置为“110592”, “Output”标签下,将“Creat HEX File”项打勾选中,设置生成一个hex文件。

第三步:接着将hex文件导入原理图中U1芯片。双击U1,打开Edit Component对话框,选择生成的hex文件。

第四步:最后观察设计的电路图是否能得到预想的效果,若不能,进行检查,找到毛病且纠正。

运行结果:

附:原程序

#include <REG52H> #include <INTRINSH>

unsigned char ucMotorDrvPuls;

#define OUTPUT P2 #define INPUT P1

sbit STARTUP=P1^7; sbit FORREV=P1^6;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13131382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-08
下一篇 2023-06-08

发表评论

登录后才能评论

评论列表(0条)

保存