📄 pidcalc.lis
字号:
0196 ;
0196 ; if( 200 < Error < 1000 )// 偏差小于1000线性积分
0196 88EC ldi R24,200
0198 90E0 ldi R25,0
019A 8C15 cp R24,R12
019C 9D05 cpc R25,R13
019E 1CF4 brge L15
01A0 81E0 ldi R24,1
01A2 5C01 movw R10,R24
01A4 02C0 rjmp L16
01A6 L15:
01A6 AA24 clr R10
01A8 BB24 clr R11
01AA L16:
01AA C501 movw R24,R10
01AC 883E cpi R24,232
01AE E3E0 ldi R30,3
01B0 9E07 cpc R25,R30
01B2 5CF4 brge L13
01B4 .dbline 75
01B4 ; {
01B4 .dbline 76
01B4 ; Ki = 10 - ( Error - 200 ) / 80;
01B4 20E5 ldi R18,80
01B6 30E0 ldi R19,0
01B8 8601 movw R16,R12
01BA 085C subi R16,200
01BC 1040 sbci R17,0
01BE 00D0 rcall div16s
01C0 8AE0 ldi R24,10
01C2 90E0 ldi R25,0
01C4 E82E mov R14,R24
01C6 E01A sub R14,R16
01C8 F10A sbc R15,R17
01CA .dbline 78
01CA ;
01CA ; }
01CA L13:
01CA .dbline 80
01CA ;
01CA ; if( Error <= 200 )// 全积分
01CA 88EC ldi R24,200
01CC 90E0 ldi R25,0
01CE 8C15 cp R24,R12
01D0 9D05 cpc R25,R13
01D2 14F0 brlt L17
01D4 .dbline 81
01D4 ; {
01D4 .dbline 82
01D4 ; Ki = 10;
01D4 8AE0 ldi R24,10
01D6 E82E mov R14,R24
01D8 .dbline 83
01D8 ; }
01D8 L17:
01D8 .dbline 85
01D8 ;
01D8 ; dError = pp->LastError - pp->PrevError;// 当前微分
01D8 EE85 ldd R30,y+14
01DA FF85 ldd R31,y+15
01DC 2284 ldd R2,z+10
01DE 3384 ldd R3,z+11
01E0 EE85 ldd R30,y+14
01E2 FF85 ldd R31,y+15
01E4 A084 ldd R10,z+8
01E6 B184 ldd R11,z+9
01E8 A218 sub R10,R2
01EA B308 sbc R11,R3
01EC .dbline 87
01EC ;
01EC ; pp->PrevError = pp->LastError;// 当前误差Error[-1]赋给上次误差Error[-2]
01EC EE85 ldd R30,y+14
01EE FF85 ldd R31,y+15
01F0 2084 ldd R2,z+8
01F2 3184 ldd R3,z+9
01F4 EE85 ldd R30,y+14
01F6 FF85 ldd R31,y+15
01F8 3386 std z+11,R3
01FA 2286 std z+10,R2
01FC .dbline 88
01FC ; pp->LastError = Error;// 取当前误差
01FC EE85 ldd R30,y+14
01FE FF85 ldd R31,y+15
0200 D186 std z+9,R13
0202 C086 std z+8,R12
0204 .dbline 91
0204 ;
0204 ; // result=[(pp->P*Error)+ (Kp*pp->I*pp->SumError/10)+(pp->D*dError)]/10
0204 ; result = pp->P * Error; // 比例项
0204 EE85 ldd R30,y+14
0206 FF85 ldd R31,y+15
0208 0281 ldd R16,z+2
020A 1381 ldd R17,z+3
020C 9601 movw R18,R12
020E 00D0 rcall empy16s
0210 1801 movw R2,R16
0212 4424 clr R4
0214 37FC sbrc R3,7
0216 4094 com R4
0218 5524 clr R5
021A 47FC sbrc R4,7
021C 5094 com R5
021E FE01 movw R30,R28
0220 2082 std z+0,R2
0222 3182 std z+1,R3
0224 4282 std z+2,R4
0226 5382 std z+3,R5
0228 .dbline 92
0228 ; result += Ki * pp->I * pp->SumError / 10; // 积分项
0228 EE85 ldd R30,y+14
022A FF85 ldd R31,y+15
022C 2481 ldd R18,z+4
022E 3581 ldd R19,z+5
0230 0E2D mov R16,R14
0232 1127 clr R17
0234 00D0 rcall empy16s
0236 1801 movw R2,R16
0238 4424 clr R4
023A 37FC sbrc R3,7
023C 4094 com R4
023E 5524 clr R5
0240 47FC sbrc R4,7
0242 5094 com R5
0244 EE85 ldd R30,y+14
0246 FF85 ldd R31,y+15
0248 6484 ldd R6,z+12
024A 7584 ldd R7,z+13
024C 8684 ldd R8,z+14
024E 9784 ldd R9,z+15
0250 9A92 st -y,R9
0252 8A92 st -y,R8
0254 7A92 st -y,R7
0256 6A92 st -y,R6
0258 8101 movw R16,R2
025A 9201 movw R18,R4
025C 00D0 rcall empy32s
025E 4AE0 ldi R20,10
0260 50E0 ldi R21,0
0262 60E0 ldi R22,0
0264 70E0 ldi R23,0
0266 7A93 st -y,R23
0268 6A93 st -y,R22
026A 5A93 st -y,R21
026C 4A93 st -y,R20
026E 00D0 rcall div32s
0270 FE01 movw R30,R28
0272 2080 ldd R2,z+0
0274 3180 ldd R3,z+1
0276 4280 ldd R4,z+2
0278 5380 ldd R5,z+3
027A 200E add R2,R16
027C 311E adc R3,R17
027E 421E adc R4,R18
0280 531E adc R5,R19
0282 FE01 movw R30,R28
0284 2082 std z+0,R2
0286 3182 std z+1,R3
0288 4282 std z+2,R4
028A 5382 std z+3,R5
028C .dbline 93
028C ; result += pp->D * dError; // 微分项
028C EE85 ldd R30,y+14
028E FF85 ldd R31,y+15
0290 0681 ldd R16,z+6
0292 1781 ldd R17,z+7
0294 9501 movw R18,R10
0296 00D0 rcall empy16s
0298 1801 movw R2,R16
029A 4424 clr R4
029C 37FC sbrc R3,7
029E 4094 com R4
02A0 5524 clr R5
02A2 47FC sbrc R4,7
02A4 5094 com R5
02A6 FE01 movw R30,R28
02A8 6080 ldd R6,z+0
02AA 7180 ldd R7,z+1
02AC 8280 ldd R8,z+2
02AE 9380 ldd R9,z+3
02B0 620C add R6,R2
02B2 731C adc R7,R3
02B4 841C adc R8,R4
02B6 951C adc R9,R5
02B8 FE01 movw R30,R28
02BA 6082 std z+0,R6
02BC 7182 std z+1,R7
02BE 8282 std z+2,R8
02C0 9382 std z+3,R9
02C2 .dbline 94
02C2 ; result /= 1000;
02C2 48EE ldi R20,232
02C4 53E0 ldi R21,3
02C6 60E0 ldi R22,0
02C8 70E0 ldi R23,0
02CA FE01 movw R30,R28
02CC 2080 ldd R2,z+0
02CE 3180 ldd R3,z+1
02D0 4280 ldd R4,z+2
02D2 5380 ldd R5,z+3
02D4 7A93 st -y,R23
02D6 6A93 st -y,R22
02D8 5A93 st -y,R21
02DA 4A93 st -y,R20
02DC 8101 movw R16,R2
02DE 9201 movw R18,R4
02E0 00D0 rcall div32s
02E2 FE01 movw R30,R28
02E4 0083 std z+0,R16
02E6 1183 std z+1,R17
02E8 2283 std z+2,R18
02EA 3383 std z+3,R19
02EC .dbline 96
02EC ;
02EC ; if (result <= 0)
02EC 40E0 ldi R20,0
02EE 50E0 ldi R21,0
02F0 60E0 ldi R22,0
02F2 70E0 ldi R23,0
02F4 FE01 movw R30,R28
02F6 2080 ldd R2,z+0
02F8 3180 ldd R3,z+1
02FA 4280 ldd R4,z+2
02FC 5380 ldd R5,z+3
02FE 4215 cp R20,R2
0300 5305 cpc R21,R3
0302 6405 cpc R22,R4
0304 7505 cpc R23,R5
0306 54F0 brlt L19
0308 .dbline 97
0308 ; {
0308 .dbline 98
0308 ; result = 0;
0308 40E0 ldi R20,0
030A 50E0 ldi R21,0
030C 60E0 ldi R22,0
030E 70E0 ldi R23,0
0310 FE01 movw R30,R28
0312 4083 std z+0,R20
0314 5183 std z+1,R21
0316 6283 std z+2,R22
0318 7383 std z+3,R23
031A .dbline 100
031A ;
031A ; }
031A 41C0 rjmp L20
031C L19:
031C .dbline 102
031C ; else
031C ; {
031C .dbline 103
031C ; if (result > 1000)
031C 48EE ldi R20,232
031E 53E0 ldi R21,3
0320 60E0 ldi R22,0
0322 70E0 ldi R23,0
0324 FE01 movw R30,R28
0326 2080 ldd R2,z+0
0328 3180 ldd R3,z+1
032A 4280 ldd R4,z+2
032C 5380 ldd R5,z+3
032E 4215 cp R20,R2
0330 5305 cpc R21,R3
0332 6405 cpc R22,R4
0334 7505 cpc R23,R5
0336 4CF4 brge L21
0338 .dbline 104
0338 ; result = 1000;
0338 48EE ldi R20,232
033A 53E0 ldi R21,3
033C 60E0 ldi R22,0
033E 70E0 ldi R23,0
0340 FE01 movw R30,R28
0342 4083 std z+0,R20
0344 5183 std z+1,R21
0346 6283 std z+2,R22
0348 7383 std z+3,R23
034A L21:
034A .dbline 106
034A ;
034A ; result *= 0xff;
034A FE01 movw R30,R28
034C 2080 ldd R2,z+0
034E 3180 ldd R3,z+1
0350 4280 ldd R4,z+2
0352 5380 ldd R5,z+3
0354 4FEF ldi R20,255
0356 50E0 ldi R21,0
0358 60E0 ldi R22,0
035A 70E0 ldi R23,0
035C 5A92 st -y,R5
035E 4A92 st -y,R4
0360 3A92 st -y,R3
0362 2A92 st -y,R2
0364 8A01 movw R16,R20
0366 9B01 movw R18,R22
0368 00D0 rcall empy32s
036A FE01 movw R30,R28
036C 0083 std z+0,R16
036E 1183 std z+1,R17
0370 2283 std z+2,R18
0372 3383 std z+3,R19
0374 .dbline 107
0374 ; result /=1000;
0374 48EE ldi R20,232
0376 53E0 ldi R21,3
0378 60E0 ldi R22,0
037A 70E0 ldi R23,0
037C FE01 movw R30,R28
037E 2080 ldd R2,z+0
0380 3180 ldd R3,z+1
0382 4280 ldd R4,z+2
0384 5380 ldd R5,z+3
0386 7A93 st -y,R23
0388 6A93 st -y,R22
038A 5A93 st -y,R21
038C 4A93 st -y,R20
038E 8101 movw R16,R2
0390 9201 movw R18,R4
0392 00D0 rcall div32s
0394 FE01 movw R30,R28
0396 0083 std z+0,R16
0398 1183 std z+1,R17
039A 2283 std z+2,R18
039C 3383 std z+3,R19
039E .dbline 108
039E ; }
039E L20:
039E .dbline 110
039E ;
039E ; i = result;
039E FE01 movw R30,R28
03A0 A080 ldd R10,z+0
03A2 .dbline 111
03A2 ; return i;
03A2 0A2D mov R16,R10
03A4 .dbline -2
03A4 L2:
03A4 2496 adiw R28,4
03A6 00D0 rcall pop_gset5
03A8 2496 adiw R28,4
03AA .dbline 0 ; func end
03AA 0895 ret
03AC .dbsym r i 10 c
03AC .dbsym r dError 10 I
03AC .dbsym r Ki 14 c
03AC .dbsym r Error 12 I
03AC .dbsym l result 0 L
03AC .dbsym r Fact_Value 10 i
03AC .dbsym l pp 14 pS[PID]
03AC .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -