⑴ 基于单片机的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,
//电机反方向旋转以最高速度
⑵ 基于单片机实现直流电机PWM调速系统
这个已经调试成功 ,你自己改下端口就可以了 O(∩_∩)O哈哈~
/******************************************************************************
* *
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms *
******************************************************************************/
#include <REGX51.H>
#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01
void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);
unsigned char ZKB1,ZKB2;
void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值设定*/
ZKB2=70; /*占空比初始值设定*/
while(1)
{
if (!P1_4) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P1_4)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if (!P1_5) //如果按了-键,减少占空比
{
Delay5Ms();
if (!P1_5)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click=0;
if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_0=0;
else
P1_0=1;
if (click<=ZKB2)
P1_1=0;
else
P1_1=1;
}
⑶ 51单片机实现直流电机PWM调速,为什么要用定时器
直流电机的PWM调速,就是改变在一个周期里的通电时间,通电时间和断电时间就是一个周期,这都是用时间来决定的,所以必须要用定时器。
51单片机是对所有兼容Intel
8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列。
⑷ 单片机直流电机调速系统的设计
单片机控制的直流电机调速系统
摘要:本文采用AT89C52作为主控芯片,设计了一种直流电机高速系统。AT89C52产生单极性工作制的定频PWM脉冲,配合驱动能力强大的L298,从而实现控制和调整直流电机转速和转向的功能。利用软件编程,能够设置多个占空比不同的脉冲,使得电机转速可以逐步增大或减小,同时在LCD上显示电机的工作状态,易于观察和识别。本设计主要由电机调速控制模块和LCD显示模块组成,具有电路简单,可靠性高,运行稳定的特点,是对于小型直流电机调速装置的一种探究。
关键词:AT89C52 定频PWM LCD 直流电机
目 录
1 绪论... 1
2 方案设计... 1
2.1 功能要求... 1
2.2 方案论证... 1
3 系统硬件的设计... 3
3.1 电机调速控制模块... 3
3.2 LCD显示模块... 6
3.3 硬件设计总原理图... 11
4 系统软件的设计... 12
4.1 主程序... 12
5 调试及性能分析... 14
5.1 调试与测试... 14
6 结论... 15
7 致谢... 15
参考文献... 17
附录... 18
⑸ 求单片机直流电机调速系统的设计的方案和意义
一.电机调速模块. 我们的设计思路是先产生占空比可调的方波(方法有多种,一是用555构成多谐振荡器.二可以利用单片机产生PWM方波)+4功率器件构成的H桥电路,用以驱动直流电机转动.当然还许多驱动方案,比如三极管-电阻作栅极驱动\低压驱动电路的简易栅极驱动,还有可以直接用个MCU产生PWM外加一个MOS管驱动也可以. 1.1直流电机驱动电路的设计目标 在直流电机驱动电路的设计中,主要考虑一下几点: 1. 功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动电机即可,当电机需要双向转动时,可以使用由4个功率元件组成的H桥电路或者使用一个双刀双掷的继电器。如果不需要调速,只要使用继电器即可;但如果需要调速,可以使用三极管,场效应管等开关元件实现PWM(脉冲宽度调制)调速。 2. 性能:对于PWM调速的电机驱动电路,主要有以下性能指标。 1)输出电流和电压范围,它决定着电路能驱动多大功率的电机。 2)效率,高的效率不仅意味着节省电源,也会减少驱动电路的发热。要提高电路的效率,可以从保证功率器件的开关工作状态和防止共态导通(H桥或推挽电路可能出现的一个问题,即两个功率器件同时导通使电源短路)入手。 3)对控制输入端的影响。功率电路对其输入端应有良好的信号隔离,防止有高电压大电流进入主控电路,这可以用高的输入阻抗或者光电耦合器实现隔离。 4)对电源的影响。共态导通可以引起电源电压的瞬间下降造成高频电源污染;大的电流可能导致地线电位浮动。 5)可靠性。电机驱动电路应该尽可能做到,无论加上何种控制信号,何种无源负载,电路都是安全的。 考虑到以上的因素我们采用555多谐振荡器产生占空比可调的方波+4功率器件构成的H桥来驱动直流电机.电路图如下: 1.2、电机调速模块的电路图功能分析 555通过可调电阻可以实现占空比可调的方波,即组成占空比可调的多谐振荡器。 多谐振荡器实现占空比可调的方波的功能分析: 电源接通瞬间,电容C2上的初始电压为0,施密特触发器输出电压为U为高电平,与此同时由于集电极开路输出端(7脚)对地断开,电源通过R5、R7开始对电容C充电,电路进入暂稳态I状态。此后电路按下列四个阶段周而复始地循环,产生周期性的输出脉冲。 (1) 暂稳态I阶段,VCC通过R5。R7向电容C充电,电容C的电压Uc按指数上升,在UC高于2/3VCC之前,定时器暂时维持‘1’的状态,输出为高电位。 (2) 翻转I阶段,电容C继续充电,当Uc高于2/3VCC后,定时器翻转为‘0’的状态,输出为低电位。此时,集电极开路输出端(7脚)由对地断开变为导通。 (3) 暂稳态II阶段,电容C开始经历R7、R6对地(7脚)放电,Uc按照指数下降,在Uc低于1/3VCC之前,定时器依然维持‘0’的状态。输出为低电位。 (4) 翻转II阶段,电容C继续放电,当Uc低于1/3VCC后,定时器翻转为‘1’状态,输出为高电位。此时,集电极开路输出端(7脚)由对地导通变为对地断开。此后,振荡器又回复到暂稳态I状态。 (5) 可以通过调节R6的大小来调节定时器输出方波的占空比。 Uln2003芯片是16脚七路电机驱动芯片,这块芯片在这里可以看作是七非门芯片,作用是保证10脚和14脚的输出SINGLE1和SINGLE2的输出为一高一低。芯片中的二极管起到分流的作用。电路图的右部分的作用是通过调节电机的正转与反转来调节电机的转速,当SINGLE1为高 SINGLE2为低时,三极管Q2,Q3,Q5导通,Q1,Q4,Q6截止,电机1端通过Q5接地,Vcc通过Q2直接押在电机2端,此时电机2端电位高于1端,电机反转;当SINGLE1为低SINGLE2为高时,电机正转。当某一时刻占空比大于50%时,电机呈现正转加速或是反转减速状态;某一时刻占空比小于50%时,电机呈现正转减速或是反转加速状态。电机就是通过矩形波占空比的不同来调节转速的,电机呈现出来的转速是平均速度。 二.电机测速模块电路以及功能分析 我们的设计思路是利用光电隔离器件以及BCD计数器实现直流电机测速模块电路.利用电机转动时带动纸片遮挡光耦,使其发光二极管发出的红外光被其中的光敏三极管所接收,通过BCD计数器最后将在单位时间内转动的转数给显示出来.电路图如下: 1.3、电机测速模块整个电路以及其他功能分析 1.3.1芯片功能分析 CD40192: 可预置BCD加/减计数器(双时钟) NSC\TI///J1J2J3J4是可以预设数字的输入,Q1Q2Q3Q4是加减计数的输出。C0是进位端接高位的UP(加计数器)。BO是借位端图上不接,为空脚。ENABLE是使能端。VSS接地,VCC接电源。DOWN是减计数器。 CD4511 BCD锁存、7段译码,驱动器: //A、B、C、D分别接BCD加减计数器的输出端,锁存数字。再7段译码将其输出到数码管。 CD40106 六施密特触发器: NSC\TI //输入信号为A,输出信号为A反,对输入的脉冲进行整形并取反,使高位计数器的加计数能够计数。 1.4、接受板子整个电路图功能分析 光电耦合器OPTOISO1,当其接受到光信号,LED放光,三极管饱和导通,晶体管Q1导通,因为电阻R3 为47K,大部分的电压分压在电阻上了,A为低电平。若没有接受到光的话,A为一高点平,这样在A端形成了一个负脉冲,再经过CD40106 六施密特触发器对脉冲进行整形并且取反,得到A的非为一正脉冲(指的是没有光的时候为低电平,有光信号的时候为高电平)。 经过六施密特触发器的脉冲信号再接到CD40192的UP端使BCD计数器件1为加计数器。又两个CD40192ENABLE是使能端一起接在enable信号上。 REST信号也相连一起通过按键S1接VCC高电平/通过R9 10K接地。这样只要按S1就可以实现REST重置清零。不按S1的就照常计数。 Enable使能信号的产生:是通过按键S1和555芯片以及相应的RC电路,实现一定时间的延时,也就是意味着一按S1,在定时T(由RC值确定)的时间内,计数器在计数,将光电耦合器接受到的恒定脉冲个人给计数,定时时间到的话就停止.这样的话可以将电机的速度给测出来.定时时间为0.5S~1.0S. 驱动CD40192工作,我们对照图2来分析这个定时器的功能。 当一上电的时候, 3 (OUT)脚输出一个高电平,
⑹ 如何用单片机控制直流电机
通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。
通过单片机产生PWM波控制直流电机程序
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管显示码(0-9)
sbitxiaoshudian=P0^7;
sbitwei1=P2^4;//数码管位选定义
sbitwei2=P2^5;
sbitwei3=P2^6;
sbitwei4=P2^7;
sbitbeep=P2^3;//蜂鸣器控制端
sbitmotor=P1^0;//电机控制
sbits1_jiasu=P1^4;//加速按键
sbits2_jiansu=P1^5;//减速按键
sbits3_jiting=P1^6;//停止/开始按键
uintpulse_count;//INT0接收到的脉冲数
uintnum=0;//num相当于占空比调节的精度
ucharspeed[3];//四位速度值存储
floatbianhuasu;//当前速度(理论计算值)
floatreallyspeed;//实际测得的速度
floatvv_min=0.0;vv_max=250.0;
floatvi_Ref=60.0;//给定值
floatvi_PreError,vi_PreDerror;
uintpwm=100;//相当于占空比标志变量
intsample_time=0;//采样标志
floatv_kp=1.2,v_ki=0.6,v_kd=0.2;//比例,积分,微分常数
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=20;y>0;y--);
}
voidtime_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;//开总中断
}
voidkeyscan()
{
floatj;
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);
}
floatv_PIDCalc(floatvi_Ref,floatvi_SpeedBack)
{
registerfloaterror1,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);
}
voidv_Display()
{
uintsu;
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;
}
voidBEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
voidmain()
{
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);
}
voidtimer0()interrupt1
{
}
voidtimer1()interrupt3
{
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单片机直流电机调速测速仿真原理
基于51单片机直流电机调速测速仿真原理是以STC90C52RC单片机为主控芯片,利用PWM的原理,通过按键对直流电机进行调速,实现正反转;采用霍尔传感器对直流电机的转动进行计数,并通过主控芯片将采集到的计数值转化为直流电机的当前速度值;利用LCD1602显示模块将计算得到的值进行实时显示。