PID直流电机调速课程设计报告解析Word下载.docx

上传人:b****3 文档编号:6236809 上传时间:2023-05-06 格式:DOCX 页数:21 大小:766.87KB
下载 相关 举报
PID直流电机调速课程设计报告解析Word下载.docx_第1页
第1页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第2页
第2页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第3页
第3页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第4页
第4页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第5页
第5页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第6页
第6页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第7页
第7页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第8页
第8页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第9页
第9页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第10页
第10页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第11页
第11页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第12页
第12页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第13页
第13页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第14页
第14页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第15页
第15页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第16页
第16页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第17页
第17页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第18页
第18页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第19页
第19页 / 共21页
PID直流电机调速课程设计报告解析Word下载.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

PID直流电机调速课程设计报告解析Word下载.docx

《PID直流电机调速课程设计报告解析Word下载.docx》由会员分享,可在线阅读,更多相关《PID直流电机调速课程设计报告解析Word下载.docx(21页珍藏版)》请在冰点文库上搜索。

PID直流电机调速课程设计报告解析Word下载.docx

七、参考文献12

附录一:

源程序13

一、设计任务、要求

1.1设计任务

设计一个基于51单片机的PID直流电机调速系统。

1.2设计要求

根据单片机原理及应用课程的要求,主要进行两个方面的设计,即单片机最小系统和存储器扩展设计、接口技术应用设计。

其中,单片机最小系统主要要求学生熟悉单片机的内部结构和引脚功能、引脚的使用、复位电路、时钟电路、4个并行接口和一个串行接口的实际应用,从而可构成最小应用系统,并编程进行简单使用。

具体的要求有以下几点:

✓系统采用DXP软件设计电路原理,设计布局必须合理美观;

✓实物采用洞洞板焊接,布局采用万能板专用绘图软件;

✓4位数据显示功能;

✓具有至少2个独立按键,通过按键可设置不同运行方式;

✓系统具有较好的模块化,功能、程序等分块合理;

二、方案总体设计

方案一:

用三极管搭H桥,实现电机正反转的控制。

电路部分较为复杂,焊接也显得更麻烦一点。

方案二:

以驱动芯片ULN2003作为电机驱动,ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽等特点。

UNL2003是是漏极开路输出,它的驱动能力为500mA,能够驱动直流电机、步进电机等。

由于这里不需正反转的控制,也为了使焊接更方便,提高成功率。

所以电机芯片驱动方案选择方案二。

总体设计:

图1整体硬件设计

总体方案工作原理:

使用STC89C52单片机作为主控制芯片,按键控制改变电机的设定值,通过红外对管进行转速的测量,与设定值进行比较,通过PID算法控制电机达到设定转速。

三、硬件设计

3.1单片机最小系统

单片机最小系统由51单片机,晶振电路,复位电路,电源组成。

大家都比较熟悉,这里不再赘述。

3.2四位数码管显示

在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。

本系统中前三位显示电压的整数位,最后一位显示转速的小数位。

4-LED显示器引脚如图2所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。

图2四位LED引脚

3.3电机驱动电路

电机驱动电中是采用ULN2003来驱动。

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。

该电路的特点:

ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据,输入5VTTL电平,输出可达500mA/50V。

图3ULN2003引脚图

图3为ULN2003的引脚图,其中IN1~IN7为输入控制端;

OUT1~OUT7为输出端;

8脚为芯片的接地端;

9脚为公共端,该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。

用于感性负载时,该脚接负载电源正极,实现续流作用。

如果该脚接地,实际上就是达林顿管的集电极对地接通。

图4一对达林顿管

图4为一对达林顿管示意框图,它反映了每一对输入与输出的内部结构。

从图中可看出,它内部实际就是由三极管组成,所以实际电机驱动用三极管搭H桥或其他驱动电路也是可以实现驱动电机的。

图5电机驱动电路

图5为本设计的直流电机驱动电路。

当P1.0中为高电平时,其内部三极管导通,使电机转动。

当P1.0为低电平时,内部三极管截止,电路断开,电机停止转动。

所以在程序中可以利用P1.0口输出PWM波来控制电机的转速。

3.4红外测速电路

图6红外对管测速

红外测速部分电路如图6所示,发射管工作时发出红外线,当接收管收到红外信号时,其电阻变小(本设计相当于从无穷大变到1k左右)。

利用其电阻变化,改变接收管分压情况。

挡片是利用圆盘上剪四个孔,当挡片随电机转动时,接收管两端电平发生变化,产生脉冲。

3.5整形电路

本设计的整形电路是用555定时器接成的施密特触发器。

图7整形电路

其电路如图7所示,其特性为,输入信号从0逐渐升高的过程:

当输入信号in<

1/3VCC,3引脚输出高电平;

当1/3VCC<

in<

2/3VCC,3引脚输出高电平保持不变;

当in>

2/3VCC,3引脚输出低电平。

当输入信号从高于2/3VCC开始下降的过程:

2/3VCC,3引脚输出低电平不变;

当in<

1/3VCC3引脚输出高电平。

整形效果如下图所示:

图8脉冲整形前后变化

3.6整体电路

图9整体电路原理图

四、软件设计

4.1算法实现

(1)PID算法

数字PID调节器结构简单,参数易于调整。

将其移植到单片机控制系统,通过软件编程实现,根据经验在线调整参数,灵活性强。

采用数字PID调节算法,根据经验和实践,在线整定参数,具有很强的灵活性。

PID控制的运算公式为:

因此要实现PID控制就必须在单片机上存在上述算法,其流程图如图所示:

图10PID算法流程图

(2)电机速度采集算法

本系统中电机速度采集是一个非常重要的部分,它的精度直接影响到整个控制的精度。

在设计中采用了红外传感器做为测速装置,其计算公式为:

这里主要是采集圆盘边缘上凹槽数的多少决定的,圆盘有4个凹槽,每转一圈便会产生4个脉冲,通过上面的等式就可得出电机的转速。

4.1主程序流程

主流程图如图11所示:

图11主程序流程图

其中中断初始化中设置为定时器TO计脉冲数,定时器T1为高优先级中断。

数码管显示的速度为三位整数,一位小数。

当测得的速度在设定速度的正负5的范围之外时,蜂鸣器响。

4.2定时器1中断流程

图12T1中断程序流程图

五、硬件设计

5.1软件介绍

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。

如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

5.2硬件调试

当认真的把板子焊接完成,之后也认真的检查了一下连接线路,确认无误后,将程序下载进去后。

发现数码管显示不正常,再次将与数码管连接的P0口线路认真检查一下后,发现与之连接的一个I/O口有虚焊的现象。

将虚焊点重新焊接后显示正常。

但单片机走程序时,第二位数码管显示变动很大,比电机速度的改变大很多。

最后认真检查程序,发现程序中显示的那一部分按错了一个符号,导致其运算结果不正确。

5.3软件调试

软件编写是在KEIL开发环境上编写的。

是采用模块化程序的方法,各个功能的程序都使用不同的子程序编写。

需要使用的时候,在主函数中进行调用即可。

当发现问题的时候,首先检查主函数的调用是否有问题,如果没有问题,就到相应的子函数中,对子函数进行检查。

可以使用Keil中的单步调试,查看程序运行是否流畅,同时还可以查看相应变量的值以及寄存器的值,这样就可以知道程序那里出现了问题。

而不应该认为是软件出现了问题。

或者认为是硬件连接的问题,因为之前的硬件都已经调试过没有问题了。

在软件调试的过程中就不应该去怀疑硬件。

其实软硬件的调试是相辅相成的,并没有非常明确的界限。

硬件的调试有时候需要通过软件的现象来检测,光看电路图是,或者只是单纯地用万用表检查有没有短路也是没有意义的。

六、设计总结、心得体会

设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。

下面我对整个设计的过程做一下简单的总结。

第一,接到任务以后进行选题。

选题是设计的开端,选择恰当的、感兴趣的题目,这对于整个设计是否能够顺利进行关系极大。

好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。

否则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的。

因此,选题时一定要考虑好了。

第二,题目确定后就是找资料了。

查资料是做设计的前期准备工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的方式,但也有可取之处的。

总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。

第三,通过上面的过程,已经积累了不少资料,对所选的题目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的分析题目。

第四,有了研究方向,就应该动手实现了。

其实以前的三步都是为这一步作的铺垫。

通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故知新,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。

在这次设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法我们更好的理解知识,所以在这里非常感谢帮助我的同学。

在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。

在整个设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心。

而且大大提高了动手的能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。

虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次设计的最大收获和财富,将使我终身受益。

七、参考文献

1.李朝青.单片机原理及接口技术(简明修订版).北京:

北京航空航天大学出版社,1999

2.李群芳,等.单片微型计算机与接口技术.北京:

电子工业出版社,2001

3.钱逸秋.单片机原理与应用.北京:

电子工业出版社,2002

4.朱定华,等.单片微型计算机原理与应用.北京:

清华大学出版社,2003

5.何立民.单片机高级教程.北京:

北京航空航天大学出版社,2004

源程序

#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];

//四位速度值存储

floatbianhuasudu;

//当前速度(理论计算值)

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;

//比例,积分,微分常数

/*********************************************

*函数名称:

delay*

*函数功能:

不精确的延时*

*********************************************/

voiddelay(uintz)

{

uintx,y;

for(x=z;

x>

0;

x--)

for(y=20;

y>

y--);

}

time_init*

将定时器初始化*

**********************************************/

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)%256;

TR0=1;

//开定时器

TR1=1;

IP=0X08;

//定时器1为高优级

EA=1;

//开总中断

*函数名称:

keyscan*

按键扫描,实现加、减速*

开始/停止*

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)//减速

if(s2_jiansu==0)

vi_Ref-=10;

while(s2_jiansu==0);

if(s3_jiting==0)

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

while(s3_jiting==0);

v_PIDCalc*

对测得的速度进行PID运算,其*

*返回值为运算后的速度*

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;

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

return(bianhuasudu);

}

v_Display*

将速度值送给四位数码管显示*

voidv_Display()

uintsudu;

sudu=(int)(reallyspeed*10);

//乘以10之后强制转化成整型

speed[3]=sudu/1000;

//百位

speed[2]=(sudu%1000)/100;

//十位

speed[1]=(sudu%100)/10;

//个位

speed[0]=sudu%10;

//小数点后一位

wei1=0;

//第一位打开

P0=table[speed[3]];

delay(5);

wei1=1;

//第一位关闭

wei2=0;

P0=table[speed[2]];

wei2=1;

wei3=0;

P0=table[speed[1]];

xiaoshudian=1;

wei3=1;

wei4=0;

P0=table[speed[0]];

wei4=1;

BEEP*

当速度超过一定范围,蜂鸣器响*

voidBEEP()

if((reallyspeed)>

=vi_Ref+5||(reallyspeed<

=vi_Ref-5))

beep=~beep;

delay(4);

main*

扫描按键,显示速度,报警*

voidmain()

time_init();

while

(1)

v_Display();

BEEP();

if(s3_jiting==0)//对按键3进行扫描,增强急停效果

timer0*

工作在计数方式,储存脉冲数*

voidtimer0()interrupt1

timer1*

进行PID计算和速度计算*

voidtimer1()interrupt3

//1ms定时

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<

0)pwm=0;

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2