⑴ 如何用单片机控制直流电机
通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过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;
}
}
⑵ 怎样用单片机控制直流电动机
1,简单的开关控制,用单片机引脚输出高低电平,控制MOS管驱动电路。
2,正反转控制,需要两个单片机引脚,一个控制正反转,一个控制启动与否。
3,需要控制速度,(1)电压控制,(2)PWM(脉宽)控制。
4,需要控制转角,首先能够控制速度,然后增加一个编码器,单片机中加入PID控制,用以精确控制。
以上大概就是直流电机能够控制的东西。
⑶ 51单片机如何控制24V两相四电42步进电机
用单片机同时是不可能的,当然,时间间隔小到可以接受,跑几个任务,那也可以视为同时。要实现真正意义上的同时,用FPGA/CPLD是可以完成的。 话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电机,那就好办多了。 一个步进电机,比如4相5线那种,4个IO口可控制一个,四个步进电机就要16个,驱动芯片用ULN2003即可。 当然,如果你的IO口不允许使用这么多,那也可以通过串转并的方法,扩展IO口,比如用74HC595,三根IO口控制它,它可以级联,三根线可以控制很多片。一片为8位,两片就为16位,3片为24位 …… 只要加些三极管驱动那三根控制线,三个IO口可控制一串级联的74HC595,得到的扩展IO口,那是相当多的。我用三个IO口控制过5片74HC595,三个IO口一下子就扩展成了40个IO口!!!
⑷ 请问能用ULN2003A控制24V的步进电机吗控制器是AT889S52单片机。步进电机的工作电压是24V,
完全可以的哦 不用耦合的 ULN2003的 IN端接单片机的引脚 OUT步进电机 2003的公共端COM接到24v 这样就可以控制了的 2003本来是个复合的达林顿管子 内部就相当于耦合了 专门可以用来驱动低于50V的负载的 你找个ULN的数据手册看看典型应用就知道怎么用了
⑸ 如何让单片机pwm驱动24v直流电机呢
ULN2003 多口并用 保证电流
⑹ 如何用单片机5v控制24v电机的正反转
用单片机5v控制24v电机的正反转的电路,
我可以提供一个由两个继电器、两只PNP三极管和几个电阻、二极管组成的电路给你。
本来H桥电路,我也有,但调试过几次都不理想。
⑺ 求单片机控制直流电机正反转的电路图,直流电机的工作电压为24v。。。
可以用驱动芯片L298N!它的一般接法如图……至于它的管脚功能可以在网上找一下,推荐一下:www.ic37.com那里有很多芯片的官方资料。
⑻ 用51单片机控制14路24V直流电机
关键看你的输入信号(也就是控制信号)。
如果是通过逻辑及数学运算得到的话,那就要用芯片控制;如果你有14个信号的话,那就不用芯片。
如果用芯片控制,那就用扩展IO口,或者用两块51芯片;
如果不用芯片控制,那就直接用H桥驱动马达(正反转);
至于要精确控制马达,那就得用到芯片,而直流电机和步进电机都能做到。如果用直流电机的话要加霍尔感应开关如A44E来计数。
⑼ 如何用单片机5V输出驱动24V的电路需要简单保证能用的
如果是灯泡的话,没必要担心那么严重的后果,又不是感性负载。
简单的说,一两个三极管足够了。用MOSFET的话,一个管子就够了,比如常见的K1270等管子都可以,一般这种情况下用N沟道的。
从单片机IO出来接限流电阻进三极管基极或场效应管栅极,三极管若嫌倍数不够可组成达林顿或直接用达林顿管(如D633),发射极(或漏极)接地,集电集(或源极)通过一个适当的限流电阻接负载灯泡,灯的另一端接24V电源正极即可。
在使用场效应管时,如果单片机不是推挽输出的,最好在上边加一个下拉电阻,以防漏电流导通。
⑽ 用单片机通过L298N能控制24V直流电机正反转吗
完全可以的