脉冲信号就是像流水灯差不多,用两个口。
例如:
用到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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)