❶ 怎样用单片机驱动手机里的马达驱动电路
兄弟,你p2.0和pnp之间加限流电阻了吗?不加限流没烧单片机,你捡了个大便宜。
我告诉你应该怎么接:p2.0串联1k的限流电阻接在pnp的b,同时在b上加10k上拉电阻。pnp的e接电源,c接npn的b,npn的c接电机,e接地。电机另一边接电源。
你的电路还有一个可能就是电机接错了,用npn管子的时候记住一定把负载放在c上,不能放在e,这点和pnp的管子正好是相反的,也就是说电机放在电源的那一边而不是地的那一边。
哦,补充一点,在npn的c和e之间反向并连一个1n4007二极管,用来保护npn.
❷ 如何用单片机控制直流电机
通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。
通过单片机产生PWM波控制直流电机程序
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)
sbit xiaoshudian=P0^7;
sbit wei1=P2^4; //数码管位选定义
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit beep=P2^3; //蜂鸣器控制端
sbit motor = P1^0; //电机控制
sbit s1_jiasu = P1^4; //加速按键
sbit s2_jiansu= P1^5; //减速按键
sbit s3_jiting=P1^6; //停止/开始按键
uint pulse_count; //INT0接收到的脉冲数
uint num=0; //num相当于占空比调节的精度
uchar speed[3]; //四位速度值存储
float bianhuasu; //当前速度(理论计算值)
float reallyspeed; //实际测得的速度
float vv_min=0.0;vv_max=250.0;
float vi_Ref=60.0; //给定值
float vi_PreError,vi_PreDerror;
uint pwm=100; //相当于占空比标志变量
int sample_time=0; //采样标志
float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数
void delay (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=20;y>0;y--);
}
void time_init()
{
ET1=1; //允许定时器T1中断
ET0=1; //允许定时器T0中断
TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1
TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时
TL1 = (65536-100)%6;
TR0 = 1; //开定时器
TR1 = 1;
IP=0X08; //定时器1为高优级
EA=1; //开总中断
}
void keyscan()
{
float j;
if(s1_jiasu==0) //加速
{
delay(20);
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
}
while(s1_jiasu==0);
if(s2_jiansu==0) //减速
{
delay(20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
while(s2_jiansu==0);
if(s3_jiting==0)
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
float v_PIDCalc(float vi_Ref,float vi_SpeedBack)
{
register float error1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack; //偏差的计算
d_error=error1-vi_PreError; //误差的偏差
dd_error=d_error-vi_PreDerror; //误差变化率
vi_PreError=error1; //存储当前偏差
vi_PreDerror=d_error;
bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return (bianhuasu);
}
void v_Display()
{
uint su;
su=(int)(reallyspeed*10); //乘以10之后强制转化成整型
speed[3]=su/1000; //百位
speed[2]=(su00)/100; //十位
speed[1]=(su0)/10; //个位
speed[0]=su; //小数点后一位
wei1=0; //第一位打开
P0=table[speed[3]];
delay(5);
wei1=1; //第一位关闭
wei2=0;
P0=table[speed[2]];
delay(5);
wei2=1;
wei3=0;
P0=table[speed[1]];
xiaoshudian=1;
delay(5);
wei3=1;
wei4=0;
P0=table[speed[0]];
delay(5);
wei4=1;
}
void BEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
void main()
{
time_init();
motor=0;
while(1)
{
v_Display();
BEEP();
}
if(s3_jiting==0) //对按键3进行扫描,增强急停效果
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
void timer0() interrupt 1
{
}
void timer1() interrupt 3
{
TH1 = (65536-100)/256; //1ms定时
TL1 = (65536-100)%6;
sample_time++;
if(sample_time==5000) //采样时间0.1ms*5000=0.5s
{
TR0=0; //关闭定时器0
sample_time=0;
pulse_count=TH0*255+TL0; //保存当前脉冲数
keyscan(); //扫描按键
reallyspeed=pulse_count/(4*0.6); //计算速度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm>100)pwm=100;
TH0=TL0=0;
TR0=1; //开启定时器0
}
num++;
if(num==pwm) //此处的num值,就是占空比
{
motor=0;
}
if(num==100) //100相当于占空比调节的精度
{
num=0;
motor=1;
}
}
❸ 51单片机驱动5v直流马达应该用什么驱动
控制转速就用单管(mos场效应管可以直接驱动),如果是三极管驱动,需要2级放大;驱动程序就用最简单的pwm控制原理吧。单片机内部程序可以固化一固定驱动频率比如0.5k-1k,只需要手动按钮调节占空比,或(占空比数组);最后最后在电机电源端并联上100uf直流电容滤波效果会比较好哦;
❹ 单片机驱动小型马达用什么驱动电路
小型的马达可以用三极管(不知道会不会小了点,不知道具体有多小,不好说,你试一下吧),达林顿管驱动稍大应该可以。
如果上面的都不行,那就用专门的电机驱动芯片吧,比如L298。
❺ 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;
}
(5)单片机驱动马达扩展阅读
L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
❻ 单片机驱动马达
除非在程序反复的对i/o口写"1",才能维持电机运转,不是很正常.这说明给脉冲信号才可以运转,请问你用的是什么马达,型号?
❼ 51单片机,L298N驱动小马达,怎么写函数可以让电机转的慢一些
首先你想要通过单片机控制这个马达就要首先明白为什么控制或者说这个单片机是通过怎样的方式来控制这个马达的转速的?
马达工作的原理是因为给了它一个高电平,所以我们可以用pwm这个波来控制电动马达的转速。也就是占空比的大小,可以直接影响马达的转速。
你想要控制马达的转速就是控制程序上面的占空比。占空比越高,那么马达的转速就会越快。反之占空比越低,马达的转速就会随之减慢。你如果用程序函数控制的话,可以写一个占空比。而用51单片机写一个马达转速控制函数,可以使用定时器来,做一个真空比。
你可以通过一个按键来调节占空比的大小这样你就可以通过按键调节电机的转速,所以这样来说比较好控制,而且现象更直观,便于观察。
❽ 用stc51单片机控制uln2003驱动直流马达,为啥马达只抖动一下代码没问题,在开发板能用
uln2003是达林顿驱动芯片,一路输入一路输出一一对应。如果确定程序没有问题,建议使用单片机控制MOS管或三极管,看电机是否正常运转,其原理和用2003一个样。
如果用MOS管可以转,则是2003的问题,如果也不转,再检查程序吧。
❾ 怎么用单片机控制马达
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低.
2、当然单片机的I/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片.像LG9110、CMO825等.马达驱动IC可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来.
3、你要是不清除PWM是怎么回事呢,可以先作一些了解,再来知道有征对性地提问就好了.