‘壹’ 51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):
#include<reg51.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define N 100
sbits1=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;
}
(1)51单片机控制直流电机扩展阅读
L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
‘贰’ 如何利用51系列单片机控制电机
小功率电机,玩具车上的,可用单片机接三极管来驱动。
‘叁’ 51单片机如何驱动12v直流电机
从现象看,接两个电机时,应该是电源不够提供所需的功率,所以电压被拉低了。也可以这么说,负载越多,电源输出的电流越大,那么电源内阻的压降就越大,输出电压自然被低了,电压太低,单片机也就可能运行不正常了。你可以用两个电源分别给电机和单片机供电,或改用输出功率更大的电源。
‘肆’ 如何用51单片机控制4个直流电机电机
俩L298N,一共4个H桥,能控制4个直流电机正反转,且能调速
如果只需要正转或者反转,用uln2003一片即可
注意一点:用298N的时候需要加续流二极管保护芯片,uln2003自带续流二极管
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机
‘伍’ 如何用at89c51单片机控制直流电机转速(三个档),越详细越好,求c语言程序,还有直流电机要用什么信号
不知道你怎么控制电机转速的,是靠直流电压还是PWM来控制,前者很简单,跟上条回答一样处理就可以,后者的话你设定三个占宽比的PWM就可以了。
‘陆’ 51单片机控制直流电机的速度
不知道你说的295是什么东西,猜想可能是成品PWM芯片吧,但可以不用,理论上,使用89C52或者89C51,应用里边的定时器,可以产生PWM波,从而控制点检转速,但目前51类型的单片机,有许多比较新的型号,价格也很低廉,内部带有PWM输出,例如STC12C5408,这样实现起来也比较简单。
‘柒’ 51单片机可以直接控制直流电机吗 在IO口上接个直流电机
不可以,电机工作电流很大,远远超过单片机的允许范围,直接控制,很容易烧坏单片机或者使系统无法正常工作,其他的问题还有一大把。
‘捌’ 用51单片机控制直流电机的转动
电路图就简单了,只要按照程序去连接就不会有问题。这里需要用到一个H桥电路,注意桥电路中Q1和Q3是PNP型三极管,负电导通。Q2和Q4是NPN型三极管,正电导通。Q1和Q4导通是正传,Q3和Q2导通是反转。
#include<stc.h>
#defineucharunsigndechar
#defineuintunsigndeint
sbitzheng=P3^0;//按键正转
sbitfan=P3^1; //按键反转
sbitting=P3^2;//按键停
sbitQ1=P3^4;//定义4个IO控制桥电路
sbitQ2=P3^5;
sbitQ3=P3^6;
sbutQ4=P3^7;
sbitled1=P0^0; //定义3个LED灯
sbitled2=P0^1;
sbitled3=P0^2;
voiddaley(ucharz);//延时函数
voidmain()
{
while()
{
if(zheng==0) //电机正转
{
delay(10);
if(zheng==0);
{
Q2=0;
Q3=1;//这两句是把反转关掉
Q1=0;
Q4=1;//这两句是打开正转
led1=0;//红灯亮
led2=1;//其他等关闭
led3=1;//其他等关闭
}
}
if(fan==0) //电机反转
{
delay(10);
if(fan==0)
{
Q1=1;
Q4=0;//把正转关掉
Q2=1;
Q3=0;//开反转
led1=1;//其他等关闭
led2=0;//绿灯亮
led3=1;//其他等关闭
}
}
if(ting==0) //关掉电机
{
delay(10);
if(ting==0)
{
Q1=1;
Q2=0;
Q3=1;
Q4=0;
led1=1;//其他等关闭
led2=1;//其他等关闭
led3=0;//黄灯亮
}
}
}
}
voiddaley(ucharz) //延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
‘玖’ 怎样用c51编写单片机控制直流电机
我有一程序,用STC5410单片机,可20档调光并用液晶屏显示级数,当然也可以控制直流电机用发光二极管试验过可正常工作液晶屏显示程序完全可以去掉
STC单片机单/双键控制LED亮度PWM调光程序 原创WanNengGong 2010/09/20
参考程序: 杜洋工作室PWM功能程序模块
输出口为P3.7(PWM0)
*************************************************/
#include<STC12C54.H>
#define uchar unsigned char
#define uint unsigned int
uchar vx=10;//vx=10 在上电时为半亮度状态,可根据自己的用途及要求任意设定 vx=20为最亮
sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
sbit s2=P3^2;
sbit s3=P3^3;
sbit led=P3^7;//可以不要
#define db P2
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void write_com(uchar com) //向LCD1602写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void write_date(uchar date)//向LCD1602写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);
Delay1ms(10);
write_com(0x0f);
Delay1ms(10);
write_com(0x06);
Delay1ms(10);
write_com(0x01);
Delay1ms(10);
}
void display_brightness (uchar temp1) //显示程序 显示当前调光工作级数
{
uchar A1,A2;
init2();
A1=temp1/10;
A2=temp1%10;
write_com(0x80);
Delay1ms(10);
write_date(0x30+A1);
write_com(0x81);
Delay1ms(10);
write_date(0x30+A2);
}
/*******************************************************************************/
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP0H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
/******************************************************************************/
void PWM1_set (uchar a){//PWM1占空比设置函数
CCAP0L=a; //设置值直接写入CCAP1L
CCAP0H=a; //设置值直接写入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延时函数 1mS/次(用于1T单片机)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
} }
/****************************************************************************/
void main(void)
{
s2= 1;
s3 = 1;
PWM_init ();
display_brightness (vx);
while(1)
{
PWM1_set(vx*12);//数字12是配合vx调试取得的,此时vx的赋值范围约为1-20对应最暗-最亮
if (s2 == 0 )//--------减调整---------//
{
DelayM(20); //延时20毫秒消抖动
if(s2 == 0) //如果20MS后 s2还是0状态则确认下调键是按下的
{
vx--;
if(vx<1) //如果设定vx=20,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
{
vx=10;
}
}
display_brightness (vx);
while(s2 == 0);//等待键松开
}
if (s3== 0 )//--------加调整---------//
{
DelayM(20);
if(s3 == 0)
{
vx++;
if(vx>20)
{
vx=10;
}
}
display_brightness (vx);
while(s3 == 0);
}
}
}
‘拾’ 用51单片机控制14路24V直流电机
关键看你的输入信号(也就是控制信号)。
如果是通过逻辑及数学运算得到的话,那就要用芯片控制;如果你有14个信号的话,那就不用芯片。
如果用芯片控制,那就用扩展IO口,或者用两块51芯片;
如果不用芯片控制,那就直接用H桥驱动马达(正反转);
至于要精确控制马达,那就得用到芯片,而直流电机和步进电机都能做到。如果用直流电机的话要加霍尔感应开关如A44E来计数。