如何用单片机控制直流电机

如题所述

通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过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 bianhuasudu; //当前速度(理论计算值)


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;


bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasudu);


}


void v_Display()


{


uint sudu;


sudu=(int)(reallyspeed*10); //乘以10之后强制转化成整型


speed[3]=sudu/1000; //百位


speed[2]=(sudu00)/100; //十位


speed[1]=(sudu0)/10; //个位


speed[0]=sudu; //小数点后一位


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个回答  推荐于2017-09-01
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。
2、当然单片机的I/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。
3、你要是不清除PWM是怎么回事呢,可以先作一些了解,再来知道有征对性地提问就好了。本回答被提问者采纳
第2个回答  2011-07-30
单片机控制直流电机驱动芯片就可以控制直流电机了,我一般用L298N驱动芯片有4个单片机的信号输入口 两个使能端口,使能端口高电平使能,如果用不到的话直接接高电平就可以了 用得到的话接单片机,控制4单片机信号输入口的高低电平就能控制电机的正反转。
第3个回答  2011-07-30
用PWM啊!一个引脚连续输出高低电平,通过驱动电路带动直流电机。PWM占空比越大,转速越快,越小转速越低。PWM用的很普遍,你去百度搜一下就知道了。

51单片机按键控制直流电机正反转和快慢
可以利用51单片机实现按键控制直流电机的正反转和速度调整。1. 按键与单片机的连接:首先,需要将按键连接到51单片机的I\/O端口。这些按键可以包括控制电机正转、反转和速度调整的按钮。每个按键对应单片机的一个或多个I\/O位,用于检测按键是否被按下。2. 电机控制逻辑编写:当单片机检测到特定按键被按下时...

如何用单片机控制直流电机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...

如何用单片机控制直流电机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...

怎样用单片机控制直流电动机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...

51单片机控制直流电机。(c语言控制)
第一种,通过PWM脉宽调制输出方法控制转速,控制占空比的大小可以实现调速!第二种,通过AD转换的方法控制直流电机的电压 第三种,用xtr115程控电流源来控制直流电机(类似第二种方法)如果以上的驱动能力不够的话再加上一个电压跟随器!程序方面就是一个寄存器的配置问题了,你查一下单片机的技术手册上面...

51单片机怎么让直流电机转动
一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难。这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动。下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速。

单片机驱动直流电动机
可以再加一级放大,用8550即可,见图。原来的1K电阻可以适当的减小,680~470欧姆左右即可。此时,单片机输出低电平时,电机转动。--- 加那两个电阻,是进行电流限制,以免烧坏三极管和单片机引脚。3.3K电阻,是控制8550的基极电流,在1mA左右就基本够用;减小到1K也可,这时,电流将近5mA了,还可以的...

51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):include<reg51.h> include<math.h> defineuintunsignedint defineucharunsignedchar defineN100 sbit s1=P1^0;\/\/电机驱动口 sbits2=P1^1;\/\/电机驱动口 sbits3=P1^2;\/\/电机驱动口 sbits4=P1^3;\/\/电机驱动口 sbiten1=P1^4;\/\/电机使能端 sbiten2...

如何让单片机驱动直流电机正反转
如上图所示包括单片机的最小系统,同时用到了4个PNP三极管,通过控制P1.3,P1.4和P2.2 P2.4的电平的高低从而分别控制三极管的导通和断开。当P1.3=1,P1.4=0时;三极管Q1导通,Q2断开;P2.2=1,P2.4=0;三极管Q3导通,Q4断开;此时直流电机正转。当P1.3=0,P1.4=1时;三极管Q1断开...

单片机控制 12V 0.3A的直流无刷电机(风扇) 如何驱动
单片机控制 12V 0.3A的直流无刷电机(风扇) 驱动分为高电平驱动和低电平驱动:电平驱动IO 口 经一个2K的电阻 ,接到一个三极管 b ,风扇正极接 12V+,风扇负极接三极管 c , 三极管 e接GND (三极管 用NPN 8050 )。电动机的转子上粘有已充磁的永磁体 ,为了检测电动机转子的极性,在电动机内装...

相似回答