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