单片机PID算法实现.docx

上传人:b****7 文档编号:10308419 上传时间:2023-02-10 格式:DOCX 页数:21 大小:193.78KB
下载 相关 举报
单片机PID算法实现.docx_第1页
第1页 / 共21页
单片机PID算法实现.docx_第2页
第2页 / 共21页
单片机PID算法实现.docx_第3页
第3页 / 共21页
单片机PID算法实现.docx_第4页
第4页 / 共21页
单片机PID算法实现.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机PID算法实现.docx

《单片机PID算法实现.docx》由会员分享,可在线阅读,更多相关《单片机PID算法实现.docx(21页珍藏版)》请在冰豆网上搜索。

单片机PID算法实现.docx

单片机PID算法实现

单片机PID算法实现

在网络上收集了一个PID控制程序,看到很多研友的毕业设计可能涉及到PID控制,这是一个PID的程序,希望能做到抛砖引玉,仅供大家参考。

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

/*      initialinterrupter       */

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

voidinit_interrupter(void)/**/

{

TMOD=0x21;/*设置计时器0工作于模式1,设置计时器1工作于模式2*/

TL0=0x00; /*T0=0000定时时间为71.1ms;71.1ms*15=1.066s*/

TH0=0xdc; /*T0=DC00定时时间为10ms;10ms*100=1s*//*T0=FC66定时时间为1ms;10ms*1000=1s*/

TL1=0xfd; /*设置串口通信速率9600bps*/

TH1=0xfd;

PCON=0x00;/*SMOD=0,速率不倍增*/

SCON=0x50;/*8位数据通信,串行通信方式1,允许单片机接收数据*/

IP=0x10; /*serialcomispreferential*/

IE=0x92; /*定时器0,串口中断允许;定时器1中断禁止*/

rs485_receive=0;

rs485_transmitte=0;

TR0=1;  /*启动定时器0*/

TR1=1;  /*启动定时器1*/

}

voidtimer0_server(void)interrupt1using1/**/

{

 TL0=0x00;TH0=0xdc;/*T0=DC00timingintervalis10ms;10ms*100=1s*//*T0=FC66timingintervalis1ms;10ms*1000=1s*/

 if(flag_serial==1)

 {

  timer0_counter_3++;

  if(timer0_counter_3>11)

  {

    timer0_counter_3=0;

    flag_serial=0;

    pointer_serial_com_data=serial_com_data;

    counter_serial_com_data=0;

  }

 }

 dog=!

dog;/*Timer0isfull(10ms),feeddog*/

 if(timing_interval==0){timing_interval=1;}/*timing_intervalislostthensetitto1second*/

 timer0_counter_1++;/*timer0_counter_1issoftwaretimer.whentimer0interruptisfull,itincreaseautomatically*/

 if((unsignedchar)(timer0_counter_1/100)==timing_interval)/*timing_intervalarrives*/

 {

  out_flag=1;/*indexing占空比highlevelbegin*/

  /*-scan0809togetcurrentequipment'stemperature-*/

  scan_current_Temperature();

  origina_address=0x82;

  display1_Temperature(current_Temperature,origina_address);

  /*-calculateout_value-*/

  PID_algorithm_function(PID_mode,PP,II,DD,BB,current_Temperature,seted_temperature);

  //out_value=0.5;

  if(out_value>0.0)/*out_value=0.0,then占空比iszero*/

  {

    control_0=1;

    ledctrl_address=0x8c;

    leddata_address=0xff;

  }

  //resettimer0_counter_1andtimer0_counter_2,

  timer0_counter_1=0;//indexingtiming_interval'stiming

  timer0_counter_2=0;//indexing占空比'stiming

 }

 if(out_flag==1)

 {

  timer0_counter_2++;

  if(out_value<1.0)

  {

    if((unsignedchar)(timer0_counter_2/out_value/100)>=timing_interval)

    {

     timer0_counter_2=0;

     control_0=0;

     ledctrl_address=0x8c;

     leddata_address=0x00;

     out_flag=0;

    }

  }

 }

}

floatPID_algorithm_function(ucharPID_mode_2,floatP_2,I_2,D_2,B_2,current_Temperature_2,seted_temperature_2)

{

 floatidatadelta;

 switch(PID_mode_2)

 {

  case1:

break;/*PIDmode*/

  case2:

D_2=0;  break;/*PImode*/

  case3:

I_2=0;  break;/*PDmode*/

  case4:

I_2=0;D_2=0;break;/*Pmode*/

 }

 if(PID_mode_2<5)/*PIDalgorithm*/

  ek=(seted_temperature_2-current_Temperature_2)/99.9;

  delta=P_2*(ek-ek1)+I_2*ek+D_2*(ek-2.0*ek1+ek2);

  out_value=out_value+delta;

  ek2=ek1;

  ek1=ek;

  if(out_value>1.0)

  {

    out_value=1;

  }

  elseif(out_value<=0)

  {

    out_value=0.0;

  }

 if(PID_mode_2==5)/*BBalgorithm*/

 {

  if(current_Temperature_2-seted_temperature_2>=B_2){out_value=0.0;}

  if(seted_temperature_2-current_Temperature_2>=B_2){out_value=1.0;}

 }

 return(out_value);

}

软件练习十二:

将十六进制数据转换成十进制数据

实验目的:

熟悉51单片机指令系统,掌握程序设计方法。

实验内容:

将R2中的内容转换成十进制数据,然后将转换的数据百位、十位和个位分别存入R0指出的30H、31H单元中。

实验程序框图:

程序清单:

ORG00H

AJMPMAIN

ORG30H

MAIN:

MOVSP,#5FH

MOVR0,#30H

MOVA,R2

MOVB,#100

DIVAB

MOV@R0,A

INCR0

MOVA,#10

XCHA,B

DIVAB

SWAPA

ADDA,B

MOV@R0,A

SJMP$

END

软件练习十一:

BCD 码数据转换成二进制数据

实验目的:

熟悉51单片机指令系统,掌握程序设计方法。

实验内容:

将R2中的内容转换成二进制数据,并传送到20H单元中。

实验程序框图:

实验步骤:

将R2送#99H后,执行程序得到结果是否与你预计一致。

程序清单:

ORG0000H

AJMPMAIN

ORG0030H

MAIN:

MOVSP,#5FH

MOVR2,#99H

MOVA,R2

SWAPA

ANLA,#0FH

MOVB,#0AH

MULAB

MOVR3,A

MOVA,R2

ANLA,#0FH

ADDR3,A

MOV20H,A

SJMP$

END

思考:

修改程序,将R2中内容换成其他数据。

交通灯控制电路

一、设计任务与要求

1.设计一个十字路口的交通灯控制电路,要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次通行时间都设为25秒;

2.要求黄灯先亮5秒,才能变换运行车道;

3.黄灯亮时,要求每秒钟闪亮一次。

二、实验预习要求

1.复习数字系统设计基础。

2.复习多路数据选择器、二进制同步计数器的工作原理。

3.根据交通灯控制系统框图,画出完整的电路图。

三、设计原理与参考电路

   1.分析系统的逻辑功能,画出其框图

   交通灯控制系统的原理框图如图12、1所示。

它主要由控制器、定时器、译码器和秒脉冲信号发生器等部分组成。

秒脉冲发生器是该系统中定时器和控制器的标准时钟信号源,译码器输出两组信号灯的控制信号,经驱动电路后驱动

信号灯工作,控制器是系统的主要部分,由它控制定时器和译码器的工作。

图中:

TL:

表示甲车道或乙车道绿灯亮的时间间隔为25秒,即车辆正常通行的时间间隔。

定时时间到,TL=1,否则,TL=0。

      TY:

表示黄灯亮的时间间隔为5秒。

定时时间到,TY=1,否则,TY=0。

      ST:

表示定时器到了规定的时间后,由控制器发出状态转换信号。

由它控制定时器开始下个工作状态的定时。

图12、1交通灯控制系统的原理框图

2.画出交通灯控制器的ASM(AlgorithmicStateMachine,算法状态机)

   

(1)图甲车道绿灯亮,乙车道红灯亮。

表示甲车道上的车辆允许通行,乙车道禁止通行。

绿灯亮足规定的时间隔TL时,控制器发出状态信号ST,转到下一工作状态。

   

(2)甲车道黄灯亮,乙车道红灯亮。

表示甲车道上未过停车线的车辆停止通行,已过停车线的车辆继续通行,乙车道禁止通行。

黄灯亮足规定时间间隔TY时,控制器发出状态转换信号ST,转到下一工作状态。

   (3)甲车道红灯亮,乙车道黄灯亮。

表示甲车道禁止通行,乙车道上的车辆允许通行绿灯亮足规定的时间间隔TL时,控制器发出状态转换信号ST,转到下一工作状态。

   (4)甲车道红灯亮,乙车道黄灯亮。

表示甲车道禁止通行,乙车道上位过县停车线的车辆停止通行,已过停车线的车辆停止通行,已过停车线的车辆继续通行。

黄灯亮足规定的时间间隔TY时,控制器发出状态转换信号ST,系统又转换到第

(1)种工作状态。

    交通灯以上4种工作状态的转换是由控制器器进行控制的。

设控制器的四种状态编码为00、01、11、10,并分别用S0、S1、S3、S2表示,则控制器的工作状态及功能如表12、1所示,控制器应送出甲、乙车道红、黄、绿灯的控制信号。

为简便起见,把灯的代号和灯的驱动信号合二为一,并作如下规定:

    表12、1控制器工作状态及功能

   控制状态信号灯状态车道运行状态

      S0(00)甲绿,乙红甲车道通行,乙车道禁止通行

      S1(01)甲黄,乙红甲车道缓行,乙车道禁止通行

      S3(11)甲红,乙绿甲车道禁止通行,甲车道通行

      S2(10)甲红,乙黄甲车道禁止通行,甲车道缓行

      AG=1:

甲车道绿灯亮;

      BG=1:

乙车道绿灯亮;

      AY=1:

甲车道黄灯亮;

      BY=1:

乙车道黄灯亮;

      AR=1:

甲车道红灯亮;

   BY=1:

乙车道红灯亮;

    由此得到交通灯的ASM图,如图12、2所示。

设控制器的初始状态为S0(用状态框表示S0),当S0的持续时间小于25秒时,TL=0(用判断框表示TL),控制器保持S0不变。

只有当S0的持续时间等于25秒时,TL=1,控制器发出状态转换信号ST(用条件输出框表示ST),并转换到下一个工作状态。

依此类推可以弄懂ASM图所表达的含义。

3.单元电路的设计

   

(1)定时器

    定时器由与系统秒脉冲(由时钟脉冲产生器提供)同步的计数器构成,要求计数器在状态信号ST作用下,首先清零,然后在时钟脉冲上升沿作用下,计数器从零开始进行增1计数,向控制器提供模5的定时信号TY和模25的定时信号TL。

   计数器选用集成电路74LS163进行设计较简便。

74LS163是4位二进制同步计数器,它具有同步清零、同步置数的功能。

74LS163的外引线排列图和时序波形图如图12、3所示,其功能表如表12、2所示。

图中,是低电平有效的同步清零输入端,是低电平有效才同步并行置数控制端,CTp、CTT是计图12、2交通灯的ASM图数控制端,CO是进位输出端,D0~D3是并行数据输入端,Q0~Q3是数据输出端。

由两片74LS163级联组成的定时器电路如图12、4所示。

电路的工作原理请自行分析。

(a)

图12、374LS163的外引线排列图和时序波形图

   

(2)控制器

    控制器是交通管理的核心,它应该能够按照交通管理规则控制信号灯工作状态的转换。

从ASM图可以列出控制器的状态转换表,如表12、3所示。

选用两个D触发器FF1、FFO做为时序寄存器产生4种状态,控制器状态转换的条件为TL和TY,当控制器处于Q1n+1Q0n+1=00状态时,如果TL=0,则控制器保持在00状态;如果,则控制器转换到Q1n+1Q0n+1=01状态。

这两种情况与条件TY无关,所以用无关项"X"表示。

其余情况依次类推,同时表中还列出了状态转换信号ST。

图12、4定时器电路图

表12、274LS163功能表

|

表12、3控制器状态转换表

    根据表12、3、可以推出状态方程和转换信号方程,其方法是:

将Q1n+1、Q0n+1和ST为1的项所对应的输人或状态转换条件变量相与,其中"1"用原变量表示,"0"用反变量表示,然后将各与项相或,即可得到下面的方程:

    根据以上方程,选用数据选择器74LS153来实现每个D触发器的输入函数,将触发器的现态值()加到74LS153的数据选择输入端作为控制信号.即可实现控制器的功能。

控制器的逻辑图如图12、5所示。

图中R、C构成上电复位电路。

图12、5控制器逻辑图

(3)译码器

    译码器的主要任务是将控制器的输出Q1、Q0的4种工作状态,翻译成甲、乙车道上6个信号灯的工作状态。

控制器的状态编码与信号灯控制信号之间的关系如表12、4所示。

实现上述关系的译码电路请读者自行设计。

四、实验仪器设备

1.数字电路实验箱

2.集成电路74LS741片,74LS101片,74LS002片,74LS1532片,74LS1632片,NE5551片

3.电阻51KΩ1只,200Ω6只

4.电容10Uf1只

5.其它发光二极管6只

五、实验内容及方法

    表12、4控制器状态编码与信号灯关系表

状态

AGAYAR

BGBYBR

00

1   0   0

0   0   1

01

0   1   0

0     0     1

10

0   0   1

1     0     0

11

0   0   1

0     1     0

1.设计、组装译码器电路,其输出接甲、乙车道上的6只信号灯(实验时用发光二极管代替),验证电路的逻辑功能。

2.设计、组装秒脉冲产生电路。

3.组装、调试定时电路。

当CP信号为1Hz正方波时,画出CP、Q0、Q1、Q2、Q3、Q4、TL.、TY的波形,并注意它们之间一的时序关系。

4.组装、调试控制器电路。

5.完成交通灯控制电路的联调,并测试其功能。

六路抢答器(KT230配套实验)

六路抢答器实验(KT230套件配套程序)

****************************************************************************************

KT230学习套件适用,需外扩八个小开关                                                                             

1、如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"加1s"键,如果想减一秒按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~99s,0s时再减1s会跳到99,99s时再加1s会变到0s。

                                                                        

2、主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设15s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设10s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。

倒数时间到小于5s会每秒响一下提示音。

                                                                                             

3、如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态,等待主持人按"抢答开始"进入下次抢答计时。

                                                                                                       

4、如果主持人未按"抢答开始"键,而有人按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下"停止"键为止。

 

*******************************************************************************************

P1.0

为开始抢答,P1.7为停止,p1.1-p1.6为六路抢答输入数码管段选P0口,位选P2口,蜂鸣器输出为P3.6口。

*******************************************************************************************

 OKEQU20H;抢答开始标志位;将P1口与P2口互换,P3.0-P1.0,P3.1-P1.7

 RINGEQU22H;响铃标志位

 ORG0000H

 AJMPMAIN

 ORG0003H

 AJMPINT0SUB

 ORG000BH

 AJMPT0INT

 ORG0013H

 AJMPINT1SUB

 ORG001BH

 AJMPT1INT

 ORG0040H

MAIN:

  MOVR1,#0FH;初设抢答时间为15s

       MOVR2,#0AH;初设答题时间为10s

       MOVTMOD,#11H;设置未定时器/模式1

       MOVTH0,#0F0H

       MOVTL0,#0FFH;越高发声频率越高,越尖

       MOVTH1,#3CH

       MOVTL1,#0B0H;50ms为一次溢出中断

       SETBEA

       SETBET0

       SETBET1

 SETBEX0

 SETBEX1;允许四个中断,T0/T1/INT0/INT1

       CLROK

 CLRRING

        SETBTR1

        SETBTR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了

;=====查询程序=====

START:

  MOVR5,#0BH

        MOVR4,#0BH

        MOVR3,#0BH

 ACALLDISPLAY;未开始抢答时候显示FFF

        JBP1.0,NEXT;ddddddd

        ACALLDELAY

        JBP1.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询

        ACALLBARK;按键发声

        MOVA,R1

 MOVR6,A;送R1->R6,因为R1中保存了抢答时间

    SETBOK;

抢答标志位,用于COUNT只程序中判断是否查询抢答

    MOVR3,0AH;抢答只显示计时,灭号数

       AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面

NEXT:

  JNBP1.1,FALSE1

   JNBP1.2,FALSE2

   JNBP1.3,FALSE3

   JNBP1.4,FALSE4

   JNBP1.5,FALSE5

   JNBP1.6,FALSE6

   AJMPSTART

;=====非法抢答处理程序=====

FALSE1:

ACALLBARK;按键发声

MOVR3,#01H

   AJMPERROR

FALSE2:

ACALLBARK

MOVR3,#02H

   AJMPERROR

FALSE3:

ACALLBARK

MOVR3,#03H

   AJMPER

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

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1