导航:首页 > 操作系统 > 基于单片机的直流电机控制

基于单片机的直流电机控制

发布时间:2023-08-05 23:09:51

❶ 用单片机怎么使直流电机正反转

单片机控制直流电机正反转,最简单的方法是 两个I/O口 控制两个继电器(一组常开、常闭)的就可以,电机 两个极 接 两个继电器 的 动触点,两个继电器 的 常开点接+(电机电源),两个常闭点接-,就可以了。
单片机控制接通一个继电器 是正转,控制接通另一个继电器 是反转,两个继电器都不接通(或者都接通)电机不转。

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

通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。

(2)基于单片机的直流电机控制扩展阅读:

通过单片机产生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;


}


}



❸ 基于单片机的pwm小功率直流电机调速

直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。

直流电机的调速方案一般有下列3种方式:

1、改变电枢电压;
2、改变激磁绕组电压;
3、改变电枢回路电阻。

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式

U=aVCC

其中:U为电枢电压;a为脉冲的占空比(0<a<1);VCC直流电压源,这里为5V。

电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。

因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B,

我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。

我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)

C语言代码:

#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;

uchar ZKB1,ZKB2;

void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基准延时程序
{
;
}
}

}

void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}

void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //产生脉冲
}
FMQ=1; //关闭蜂鸣器
delaynms(300);
}

void main(void)
{
TR0=0; //关闭定时器0
TMOD=0x01; //定时器0,工作方式1
TH0=(65526-100)/256;
TL0=(65526-100)%256; //100us即0.01ms中断一次
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器T0
ZKB1=50; //占空比初值设定
ZKB2=50; //占空比初值设定
while(1)
{
if(!K5)
{
delaynms(15); //消抖
if(!K5) //确定按键按下
{
beep();
ZKB1++; //增加ZKB1
ZKB2=100-ZKB1; //相应的ZKB2就减少
}
}
if(!K6)
{
delaynms(15); //消抖
if(!K6) //确定按键按下
{
beep();
ZKB1--; //减少ZKB1
ZKB2=100-ZKB1; //相应的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;

}
}

void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;

}

//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度

❹ 用单片机控制直流电机的正反转,停转。

用单片机控制直流电机的正反转,停转如图:

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

❺ 单片机如何控制大功率直流电机

1.区别 有刷无刷非常不一样。有刷的简单很多,给一个直流电压就可以转了。无刷的话需要功率电力电子设备来开通、关断电压,并且需要根据转子的位置判断开关的节奏,控制上要求比较复杂。说白了,无刷直流本质上是一个吃方波的交流电机。不过小型无刷电机的控制已经很成熟了,所有电脑里面的风扇都是无刷直流。 2.驱动 驱动的话,有刷电机需要的是直流DC-DC变换器。用buck,boost,半桥,都可以。只要是能调压的直流电压,都可以。甚至是220V-->可调变压器-->整流器都可以。500W的电机实在是小电机,不算大功率。所以只调压就可以控制转速。一般转速带宽在几秒钟时间里是可以调整的。 当然,如果要是5kW以上,或者你需要转矩控制,那就要控制电流了。电流控制就复杂一点,不过响应快,转矩调整用几个毫秒就足够了。转速调整的话带宽在几十毫秒。 无刷电机就复杂很多。一般至少需要一个三相h桥吧。控制分为有传感器控制和无传感器控制。有传感器控制,就是用传感器测得转子位置,然后给定子上相应的方波电压。不过传感器很贵,说不定比你电机便宜不了多少。无传感器控制,通过空闲的定子绕组上的电压来推算转子位置,需要一个控制算法。有很多硕士论文就是研究这个的,如果你想做的话肯定要看一看才能懂。 3. 隔离。 光耦隔离在任何功率电路里面都不是必要的。不过隔离会让电路变的非常稳定,不容易被过电压弄坏。而且还可以调整电平。所以还是推荐使用。单片机的信号出来用光耦隔离,然后送到门极驱动芯片,再之后送到功率开关上。当然,像AD这种公司还提供了隔离+驱动的集成芯片ADUM系列,性能极好,不过价格比较高。 隔离是电力电子驱动用的,和电机没啥关系。光耦毕竟要花钱,如果是30、50伏这种电路,只要电路设计合理,不用光耦是没问题的。如果电压再高,就要用光耦了。个人建议。 4. 其他。 500W的电路损耗大概在10-20瓦这个数量级,跟你的电压、电流等级有关系。如果要自己做的话,散热是要考虑好的。另外电路保护也要做好,电机上是电感和一个转动的转子。其中电感怕断路,有可能产生非常高的瞬间电压,而转子会产生一个持续的电压,比较怕短路,这两个上面的能量如果没控制好,电路是有可能会爆掉的。

❻ 单片机控制直流电动机

看你要求的是什么样的控制:是开环控制还是闭环控制?是控制其转速?还是扭矩?还是其他参数?

如果是开环控制,最简单,可以用PWM(即脉宽调制)来改变送给电动机的平均电压,达到调节的目的。如附图示意。

如果是闭环控制,则需要加传感器。例如要闭环控制转速,则需要加装一个转速传感器,将传感器信号送给单片机。单片机通过一定的软件算法测出转速,将实测转速和要求的转速比较,采用某种控制算法(例如PID控制)来确定输出的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是怎么回事呢,可以先作一些了解,再来知道有征对性轿吵清地提问就好了碰胡。]

阅读全文

与基于单片机的直流电机控制相关的资料

热点内容
内部排序的算法比较 浏览:177
服务器如何定期执行指令 浏览:931
python下载python脚本 浏览:297
台达plc远程编程 浏览:263
云计算的后台服务器 浏览:589
windows7的我的电脑咋创建文件夹 浏览:492
去视频水印的app哪个好用 浏览:384
doc转为pdf 浏览:48
华为加密壁纸怎么提取 浏览:52
曲线命令的描述 浏览:454
php模板怎么修改 浏览:999
单片机和微机编程的区别 浏览:642
金牛期货哪个app好 浏览:803
程序员越老越贬值吗 浏览:211
安卓手机用计算机如何隐藏应用 浏览:459
网吧服务器如何架设 浏览:322
垃圾压缩罐用电安全 浏览:621
b150能用什么服务器cpu 浏览:477
支付宝批量付款app哪个好 浏览:849
java开源社区源码 浏览:475