📄 minid.lst
字号:
02A0 8191 LDD R25,Z+1
02A1 93EA ST R30,-Y
02A2 328C CPI R24,0x2C
02A3 E0E1 LDI R30,1
02A4 079E CPC R25,R30
02A5 91E9 LD R30,Y+
02A6 F484 BGE 0x02B7
(0035) {
(0036) pp->P = KPL; //低速的p值
02A7 EC82 LDI R24,0xC2
02A8 E091 LDI R25,1
02A9 8393 STD Z+3,R25
02AA 8382 STD Z+2,R24
(0037) pp->I = KIL;
02AB E388 LDI R24,0x38
02AC E090 LDI R25,0
02AD 85EE LDD R30,Y+14
02AE 85FF LDD R31,Y+15
02AF 8395 STD Z+5,R25
02B0 8384 STD Z+4,R24
(0038) pp->D = KDL;
02B1 E184 LDI R24,0x14
02B2 85EE LDD R30,Y+14
02B3 85FF LDD R31,Y+15
02B4 8397 STD Z+7,R25
02B5 8386 STD Z+6,R24
(0039) }
02B6 C04B RJMP 0x0302
(0040) else
(0041) {
(0042) if (pp->SetValue > 2500) //高速的PID值
02B7 EC84 LDI R24,0xC4
02B8 E099 LDI R25,0x9
02B9 85EE LDD R30,Y+14
02BA 85FF LDD R31,Y+15
02BB 8020 LDD R2,Z+0
02BC 8031 LDD R3,Z+1
02BD 1582 CP R24,R2
02BE 0593 CPC R25,R3
02BF F47C BGE 0x02CF
(0043) {
(0044) pp->P = KPH; //告诉的p值
02C0 EE81 LDI R24,0xE1
02C1 E090 LDI R25,0
02C2 8393 STD Z+3,R25
02C3 8382 STD Z+2,R24
(0045) pp->I = KIH;
02C4 E18C LDI R24,0x1C
02C5 85EE LDD R30,Y+14
02C6 85FF LDD R31,Y+15
02C7 8395 STD Z+5,R25
02C8 8384 STD Z+4,R24
(0046) pp->D = KDH;
02C9 E08A LDI R24,0xA
02CA 85EE LDD R30,Y+14
02CB 85FF LDD R31,Y+15
02CC 8397 STD Z+7,R25
02CD 8386 STD Z+6,R24
(0047) }
02CE C033 RJMP 0x0302
(0048) else //中速的PID值,p,i,d按一定的斜率计算
(0049) {
(0050) pp->P = ((pp->SetValue-300)*(KPH-KPL)) / (PIM+KPL); //
02CF 85EE LDD R30,Y+14
02D0 85FF LDD R31,Y+15
02D1 8120 LDD R18,Z+0
02D2 8131 LDD R19,Z+1
02D3 E10F LDI R16,0x1F
02D4 EF1F LDI R17,0xFF
02D5 D245 RCALL empy16s
02D6 5504 SUBI R16,0x54
02D7 4F18 SBCI R17,0xF8
02D8 E52A LDI R18,0x5A
02D9 E03A LDI R19,0xA
02DA D19A RCALL div16s
02DB 0118 MOVW R2,R16
02DC 85EE LDD R30,Y+14
02DD 85FF LDD R31,Y+15
02DE 8233 STD Z+3,R3
02DF 8222 STD Z+2,R2
(0051) pp->I = ((pp->SetValue-300)*(KPH-KIL)) / (PIM+KIL); //
02E0 85EE LDD R30,Y+14
02E1 85FF LDD R31,Y+15
02E2 8120 LDD R18,Z+0
02E3 8131 LDD R19,Z+1
02E4 EA09 LDI R16,0xA9
02E5 E010 LDI R17,0
02E6 D234 RCALL empy16s
02E7 500C SUBI R16,0xC
02E8 4C16 SBCI R17,0xC6
02E9 ED20 LDI R18,0xD0
02EA E038 LDI R19,0x8
02EB D189 RCALL div16s
02EC 0118 MOVW R2,R16
02ED 85EE LDD R30,Y+14
02EE 85FF LDD R31,Y+15
02EF 8235 STD Z+5,R3
02F0 8224 STD Z+4,R2
(0052) pp->D = ((pp->SetValue-300)*(KDH-KDL)) / (PIM+KDL);
02F1 85EE LDD R30,Y+14
02F2 85FF LDD R31,Y+15
02F3 8120 LDD R18,Z+0
02F4 8131 LDD R19,Z+1
02F5 EF06 LDI R16,0xF6
02F6 EF1F LDI R17,0xFF
02F7 D223 RCALL empy16s
02F8 5408 SUBI R16,0x48
02F9 4F14 SBCI R17,0xF4
02FA EA2C LDI R18,0xAC
02FB E038 LDI R19,0x8
02FC D178 RCALL div16s
02FD 0118 MOVW R2,R16
02FE 85EE LDD R30,Y+14
02FF 85FF LDD R31,Y+15
0300 8237 STD Z+7,R3
0301 8226 STD Z+6,R2
(0053) }
(0054) }
(0055)
(0056) //result = 0;// 清零
(0057) Error = pp->SetValue - Fact_Value;// 偏差
0302 85EE LDD R30,Y+14
0303 85FF LDD R31,Y+15
0304 80C0 LDD R12,Z+0
0305 80D1 LDD R13,Z+1
0306 18CA SUB R12,R10
0307 08DB SBC R13,R11
(0058) pp->SumError += Error;
0308 01CF MOVW R24,R30
0309 960C ADIW R24,0xC
030A 0126 MOVW R4,R12
030B 2466 CLR R6
030C FC57 SBRC R5,7
030D 9460 COM R6
030E 2477 CLR R7
030F FC67 SBRC R6,7
0310 9470 COM R7
0311 01FC MOVW R30,R24
0312 8140 LDD R20,Z+0
0313 8151 LDD R21,Z+1
0314 8162 LDD R22,Z+2
0315 8173 LDD R23,Z+3
0316 0D44 ADD R20,R4
0317 1D55 ADC R21,R5
0318 1D66 ADC R22,R6
0319 1D77 ADC R23,R7
031A 8340 STD Z+0,R20
031B 8351 STD Z+1,R21
031C 8362 STD Z+2,R22
031D 8373 STD Z+3,R23
(0059) // 过度积分的极限处理
(0060) if( pp->SumError > 500 )
031E EF44 LDI R20,0xF4
031F E051 LDI R21,1
0320 E060 LDI R22,0
0321 E070 LDI R23,0
0322 85EE LDD R30,Y+14
0323 85FF LDD R31,Y+15
0324 8424 LDD R2,Z+12
0325 8435 LDD R3,Z+13
0326 8446 LDD R4,Z+14
0327 8457 LDD R5,Z+15
0328 1542 CP R20,R2
0329 0553 CPC R21,R3
032A 0564 CPC R22,R4
032B 0575 CPC R23,R5
032C F454 BGE 0x0337
(0061) {
(0062) pp->SumError = 500;
032D EF44 LDI R20,0xF4
032E E051 LDI R21,1
032F E060 LDI R22,0
0330 E070 LDI R23,0
0331 85EE LDD R30,Y+14
0332 85FF LDD R31,Y+15
0333 8744 STD Z+12,R20
0334 8755 STD Z+13,R21
0335 8766 STD Z+14,R22
0336 8777 STD Z+15,R23
(0063) }
(0064) if( pp->SumError < -500 )
0337 E04C LDI R20,0xC
0338 EF5E LDI R21,0xFE
0339 EF6F LDI R22,0xFF
033A EF7F LDI R23,0xFF
033B 85EE LDD R30,Y+14
033C 85FF LDD R31,Y+15
033D 8424 LDD R2,Z+12
033E 8435 LDD R3,Z+13
033F 8446 LDD R4,Z+14
0340 8457 LDD R5,Z+15
0341 1624 CP R2,R20
0342 0635 CPC R3,R21
0343 0646 CPC R4,R22
0344 0657 CPC R5,R23
0345 F454 BGE 0x0350
(0065) {
(0066) pp->SumError = -500;
0346 E04C LDI R20,0xC
0347 EF5E LDI R21,0xFE
0348 EF6F LDI R22,0xFF
0349 EF7F LDI R23,0xFF
034A 85EE LDD R30,Y+14
034B 85FF LDD R31,Y+15
034C 8744 STD Z+12,R20
034D 8755 STD Z+13,R21
034E 8766 STD Z+14,R22
034F 8777 STD Z+15,R23
(0067) }
(0068) // Ki为积分阈值,目的是采用积分分离的控制算法,既保持积分作用,又减小超调量
(0069) if( Error >= 1500 )// 偏差大于1500取消积分
0350 01C6 MOVW R24,R12
0351 3D8C CPI R24,0xDC
0352 E0E5 LDI R30,5
0353 079E CPC R25,R30
0354 F00C BLT 0x0356
(0070) {
(0071) Ki = 0;
0355 24EE CLR R14
(0072) }
(0073)
(0074) if( 200 < Error < 1000 )// 偏差小于1000线性积分
0356 EC88 LDI R24,0xC8
0357 E090 LDI R25,0
0358 158C CP R24,R12
0359 059D CPC R25,R13
035A F41C BGE 0x035E
035B E081 LDI R24,1
035C 015C MOVW R10,R24
035D C002 RJMP 0x0360
035E 24AA CLR R10
035F 24BB CLR R11
0360 01C5 MOVW R24,R10
0361 3E88 CPI R24,0xE8
0362 E0E3 LDI R30,3
0363 079E CPC R25,R30
0364 F45C BGE 0x0370
(0075) {
(0076) Ki = 10 - ( Error - 200 ) / 80;
0365 E520 LDI R18,0x50
0366 E030 LDI R19,0
0367 0186 MOVW R16,R12
0368 5C08 SUBI R16,0xC8
0369 4010 SBCI R17,0
036A D10A RCALL div16s
036B E08A LDI R24,0xA
036C E090 LDI R25,0
036D 2EE8 MOV R14,R24
036E 1AE0 SUB R14,R16
036F 0AF1 SBC R15,R17
(0077)
(0078) }
(0079)
(0080) if( Error <= 200 )// 全积分
0370 EC88 LDI R24,0xC8
0371 E090 LDI R25,0
0372 158C CP R24,R12
0373 059D CPC R25,R13
0374 F014 BLT 0x0377
(0081) {
(0082) Ki = 10;
0375 E08A LDI R24,0xA
0376 2EE8 MOV R14,R24
(0083) }
(0084)
(0085) dError = pp->LastError - pp->PrevError;// 当前微分
0377 85EE LDD R30,Y+14
0378 85FF LDD R31,Y+15
0379 8422 LDD R2,Z+10
037A 8433 LDD R3,Z+11
037B 85EE LDD R30,Y+14
037C 85FF LDD R31,Y+15
037D 84A0 LDD R10,Z+8
037E 84B1 LDD R11,Z+9
037F 18A2 SUB R10,R2
0380 08B3 SBC R11,R3
(0086)
(0087) pp->PrevError = pp->LastError;// 当前误差Error[-1]赋给上次误差Error[-2]
0381 85EE LDD R30,Y+14
0382 85FF LDD R31,Y+15
0383 8420 LDD R2,Z+8
0384 8431 LDD R3,Z+9
0385 85EE LDD R30,Y+14
0386 85FF LDD R31,Y+15
0387 8633 STD Z+11,R3
0388 8622 STD Z+10,R2
(0088) pp->LastError = Error;// 取当前误差
0389 85EE LDD R30,Y+14
038A 85FF LDD R31,Y+15
038B 86D1 STD Z+9,R13
038C 86C0 STD Z+8,R12
(0089)
(0090) // result=[(pp->P*Error)+ (Kp*pp->I*pp->SumError/10)+(pp->D*dError)]/10
(0091) result = pp->P * Error; // 比例项
038D 85EE LDD R30,Y+14
038E 85FF LDD R31,Y+15
038F 8102 LDD R16,Z+2
0390 8113 LDD R17,Z+3
0391 0196 MOVW R18,R12
0392 D188 RCALL empy16s
0393 0118 MOVW R2,R16
0394 2444 CLR R4
0395 FC37 SBRC R3,7
0396 9440 COM R4
0397 2455 CLR R5
0398 FC47 SBRC R4,7
0399 9450 COM R5
039A 01FE MOVW R30,R28
039B 8220 STD Z+0,R2
039C 8231 STD Z+1,R3
039D 8242 STD Z+2,R4
039E 8253 STD Z+3,R5
(0092) result += Ki * pp->I * pp->SumError / 10; // 积分项
039F 85EE LDD R30,Y+14
03A0 85FF LDD R31,Y+15
03A1 8124 LDD R18,Z+4
03A2 8135 LDD R19,Z+5
03A3 2D0E MOV R16,R14
03A4 2711 CLR R17
03A5 D175 RCALL empy16s
03A6 0118 MOVW R2,R16
03A7 2444 CLR R4
03A8 FC37 SBRC R3,7
03A9 9440 COM R4
03AA 2455 CLR R5
03AB FC47 SBRC R4,7
03AC 9450 COM R5
03AD 85EE LDD R30,Y+14
03AE 85FF LDD R31,Y+15
03AF 8464 LDD R6,Z+12
03B0 8475 LDD R7,Z+13
03B1 8486 LDD R8,Z+14
03B2 8497 LDD R9,Z+15
03B3 929A ST R9,-Y
03B4 928A ST R8,-Y
03B5 927A ST R7,-Y
03B6 926A ST R6,-Y
03B7 0181 MOVW R16,R2
03B8 0192 MOVW R18,R4
03B9 D171 RCALL empy32u
03BA E04A LDI R20,0xA
03BB E050 LDI R21,0
03BC E060 LDI R22,0
03BD E070 LDI R23,0
03BE 937A ST R23,-Y
03BF 936A ST R22,-Y
03C0 935A ST R21,-Y
03C1 934A ST R20,-Y
03C2 D0ED RCALL div32s
03C3 01FE MOVW R30,R28
03C4 8020 LDD R2,Z+0
03C5 8031 LDD R3,Z+1
03C6 8042 LDD R4,Z+2
03C7 8053 LDD R5,Z+3
03C8 0E20 ADD R2,R16
03C9 1E31 ADC R3,R17
03CA 1E42 ADC R4,R18
03CB 1E53 ADC R5,R19
03CC 01FE MOVW R30,R28
03CD 8220 STD Z+0,R2
03CE 8231 STD Z+1,R3
03CF 8242 STD Z+2,R4
03D0 8253 STD Z+3,R5
(0093) result += pp->D * dError; // 微分项
03D1 85EE LDD R30,Y+14
03D2 85FF LDD R31,Y+15
03D3 8106 LDD R16,Z+6
03D4 8117 LDD R17,Z+7
03D5 0195 MOVW R18,R10
03D6 D144 RCALL empy16s
03D7 0118 MOVW R2,R16
03D8 2444 CLR R4
03D9 FC37 SBRC R3,7
03DA 9440 COM R4
03DB 2455 CLR R5
03DC FC47 SBRC R4,7
03DD 9450 COM R5
03DE 01FE MOVW R30,R28
03DF 8060 LDD R6,Z+0
03E0 8071 LDD R7,Z+1
03E1 8082 LDD R8,Z+2
03E2 8093 LDD R9,Z+3
03E3 0C62 ADD R6,R2
03E4 1C73 ADC R7,R3
03E5 1C84 ADC R8,R4
03E6 1C95 ADC R9,R5
03E7 01FE MOVW R30,R28
03E8 8260 STD Z+0,R6
03E9 8271 STD Z+1,R7
03EA 8282 STD Z+2,R8
03EB 8293 STD Z+3,R9
(0094) result /= 1000;
03EC EE48 LDI R20,0xE8
03ED E053 LDI R21,3
03EE E060 LDI R22,0
03EF E070 LDI R23,0
03F0 01FE MOVW R30,R28
03F1 8020 LDD R2,Z+0
03F2 8031 LDD R3,Z+1
03F3 8042 LDD R4,Z+2
03F4 8053 LDD R5,Z+3
03F5 937A ST R23,-Y
03F6 936A ST R22,-Y
03F7 935A ST R21,-Y
03F8 934A ST R20,-Y
03F9 0181 MOVW R16,R2
03FA 0192 MOVW R18,R4
03FB D0B4 RCALL div32s
03FC 01FE MOVW R30,R28
03FD 8300 STD Z+0,R16
03FE 8311 STD Z+1,R17
03FF 8322 STD Z+2,R18
0400 8333 STD Z+3,R19
(0095)
(0096) if (result <= 0)
0401 E040 LDI R20,0
0402 E050 LDI R21,0
0403 E060 LDI R22,0
0404 E070 LDI R23,0
0405 01FE MOVW R30,R28
0406 8020 LDD R2,Z+0
0407 8031 LDD R3,Z+1
0408 8042 LDD R4,Z+2
0409 8053 LDD R5,Z+3
040A 1542 CP R20,R2
040B 0553 CPC R21,R3
040C 0564 CPC R22,R4
040D 0575 CPC R23,R5
040E F054 BLT 0x0419
(0097) {
(0098) result = 0;
040F E040 LDI R20,0
0410 E050 LDI R21,0
0411 E060 LDI R22,0
0412 E070 LDI R23,0
0413 01FE MOVW R30,R28
0414 8340 STD Z+0,R20
0415 8351 STD Z+1,R21
0416 8362 STD Z+2,R22
0417 8373 STD Z+3,R23
(0099)
(0100) }
0418 C041 RJMP 0x045A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -