❶ 用单片机怎么使直流电机正反转
单片机控制直流电机正反转,最简单的方法是 两个I/O口 控制两个继电器(一组常开、常闭)的就可以,电机 两个极 接 两个继电器 的 动触点,两个继电器 的 常开点接+(电机电源),两个常闭点接-,就可以了。
单片机控制接通一个继电器 是正转,控制接通另一个继电器 是反转,两个继电器都不接通(或者都接通)电机不转。
❷ 如何用单片机控制直流电机
通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过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.区别 有刷无刷非常不一样。有刷的简单很多,给一个直流电压就可以转了。无刷的话需要功率电力电子设备来开通、关断电压,并且需要根据转子的位置判断开关的节奏,控制上要求比较复杂。说白了,无刷直流本质上是一个吃方波的交流电机。不过小型无刷电机的控制已经很成熟了,所有电脑里面的风扇都是无刷直流。 2.驱动 驱动的话,有刷电机需要的是直流DC-DC变换器。用buck,boost,半桥,都可以。只要是能调压的直流电压,都可以。甚至是220V-->可调变压器-->整流器都可以。500W的电机实在是小电机,不算大功率。所以只调压就可以控制转速。一般转速带宽在几秒钟时间里是可以调整的。 当然,如果要是5kW以上,或者你需要转矩控制,那就要控制电流了。电流控制就复杂一点,不过响应快,转矩调整用几个毫秒就足够了。转速调整的话带宽在几十毫秒。 无刷电机就复杂很多。一般至少需要一个三相h桥吧。控制分为有传感器控制和无传感器控制。有传感器控制,就是用传感器测得转子位置,然后给定子上相应的方波电压。不过传感器很贵,说不定比你电机便宜不了多少。无传感器控制,通过空闲的定子绕组上的电压来推算转子位置,需要一个控制算法。有很多硕士论文就是研究这个的,如果你想做的话肯定要看一看才能懂。 3. 隔离。 光耦隔离在任何功率电路里面都不是必要的。不过隔离会让电路变的非常稳定,不容易被过电压弄坏。而且还可以调整电平。所以还是推荐使用。单片机的信号出来用光耦隔离,然后送到门极驱动芯片,再之后送到功率开关上。当然,像AD这种公司还提供了隔离+驱动的集成芯片ADUM系列,性能极好,不过价格比较高。 隔离是电力电子驱动用的,和电机没啥关系。光耦毕竟要花钱,如果是30、50伏这种电路,只要电路设计合理,不用光耦是没问题的。如果电压再高,就要用光耦了。个人建议。 4. 其他。 500W的电路损耗大概在10-20瓦这个数量级,跟你的电压、电流等级有关系。如果要自己做的话,散热是要考虑好的。另外电路保护也要做好,电机上是电感和一个转动的转子。其中电感怕断路,有可能产生非常高的瞬间电压,而转子会产生一个持续的电压,比较怕短路,这两个上面的能量如果没控制好,电路是有可能会爆掉的。
❹ 单片机驱动直流电动机
你用的是12V电源,也就应该使用这个电路了。
问题是单片机输出高电平,提供的电流有限,虽经过8050放大,也难以达到使电机转动的需求。
可以再加一级放大,用8550即可,见图。
原来的1K电阻可以适当的减小,680~470欧姆左右即可。
此时,单片机输出低电平时,电机转动。
--------------------------
加那两个电阻,是进行电流限制,以免烧坏三极管和单片机引脚。
3.3K电阻,是控制8550的基极电流,在1mA左右就基本够用;
减小到1K也可,这时,电流将近5mA了,还可以的。
1K电阻,是控制8050的基极电流的,减小到470欧姆,基极电流就能达到8~10mA,电流再增大,8050有危险。
❺ 求用单片机和ULN2003A驱动直流电机的接法
电路图接法:
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。
ULN2003是高耐压、大电流达林顿系列,由七个硅NPN达林顿管组成。该电路的特点如下:ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
引脚1:CPU脉冲输入端,端口对应一个信号输出端。
引脚2:CPU脉冲输入端。
引脚3:CPU脉冲输入端。
引脚4:CPU脉冲输入端。
引脚5:CPU脉冲输入端。
引脚6:CPU脉冲输入端。
引脚7:CPU脉冲输入端。
引脚8:接地。
引脚9:该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。
引脚10:脉冲信号输出端,对应7脚信号输入端。
引脚11:脉冲信号输出端,对应6脚信号输入端。
引脚12:脉冲信号输出端,对应5脚信号输入端。
引脚13:脉冲信号输出端,对应4脚信号输入端。
引脚14:脉冲信号输出端,对应3脚信号输入端。
引脚15:脉冲信号输出端,对应2脚信号输入端。
引脚16:脉冲信号输出端,对应1脚信号输入端。