📄 pidcalc.lis
字号:
019C .dbline 81
019C ; {
019C .dbline 82
019C ; Fact_Value = 7000;
019C 6C01 movw R12,R24
019E .dbline 83
019E ; }
019E L7:
019E .dbline 85
019E ;
019E ; pp->Error = pp->SetValue - Fact_Value; // 取当前偏差
019E F501 movw R30,R10
01A0 2080 ldd R2,z+0
01A2 3180 ldd R3,z+1
01A4 2C18 sub R2,R12
01A6 3D08 sbc R3,R13
01A8 3186 std z+9,R3
01AA 2086 std z+8,R2
01AC .dbline 87
01AC ;
01AC ; perror = pp->Error - pp->LastError; //计算比例偏差
01AC F501 movw R30,R10
01AE 2284 ldd R2,z+10
01B0 3384 ldd R3,z+11
01B2 F501 movw R30,R10
01B4 E084 ldd R14,z+8
01B6 F184 ldd R15,z+9
01B8 E218 sub R14,R2
01BA F308 sbc R15,R3
01BC .dbline 96
01BC ;
01BC ; //*****************************************************************
01BC ; // derror = pp->LastError; //计算微分偏差
01BC ; // derror += pp->LastError;
01BC ; // derror = pp->Error - derror;
01BC ; // derror += pp->PrevError;
01BC ; //****************************************************************
01BC ;
01BC ; pp->PrevError = pp->LastError; // 当前误差Error[-1]赋给上次误差Error[-2]
01BC F501 movw R30,R10
01BE 2284 ldd R2,z+10
01C0 3384 ldd R3,z+11
01C2 F501 movw R30,R10
01C4 3586 std z+13,R3
01C6 2486 std z+12,R2
01C8 .dbline 97
01C8 ; pp->LastError = pp->Error; // 取当前误差
01C8 F501 movw R30,R10
01CA 2084 ldd R2,z+8
01CC 3184 ldd R3,z+9
01CE F501 movw R30,R10
01D0 3386 std z+11,R3
01D2 2286 std z+10,R2
01D4 .dbline 99
01D4 ;
01D4 ; pidtemp = perror;
01D4 1701 movw R2,R14
01D6 4424 clr R4
01D8 37FC sbrc R3,7
01DA 4094 com R4
01DC 5524 clr R5
01DE 47FC sbrc R4,7
01E0 5094 com R5
01E2 2882 std y+0,R2
01E4 3982 std y+1,R3
01E6 4A82 std y+2,R4
01E8 5B82 std y+3,R5
01EA .dbline 100
01EA ; pidtemp *= (pp->P);
01EA F501 movw R30,R10
01EC 2280 ldd R2,z+2
01EE 3380 ldd R3,z+3
01F0 4424 clr R4
01F2 5524 clr R5
01F4 0881 ldd R16,y+0
01F6 1981 ldd R17,y+1
01F8 2A81 ldd R18,y+2
01FA 3B81 ldd R19,y+3
01FC 5A92 st -y,R5
01FE 4A92 st -y,R4
0200 3A92 st -y,R3
0202 2A92 st -y,R2
0204 00D0 rcall empy32s
0206 0883 std y+0,R16
0208 1983 std y+1,R17
020A 2A83 std y+2,R18
020C 3B83 std y+3,R19
020E .dbline 101
020E ; result = pidtemp; // 比例项
020E 2880 ldd R2,y+0
0210 3980 ldd R3,y+1
0212 4A80 ldd R4,y+2
0214 5B80 ldd R5,y+3
0216 2C82 std y+4,R2
0218 3D82 std y+5,R3
021A 4E82 std y+6,R4
021C 5F82 std y+7,R5
021E .dbline 103
021E ;
021E ; pidtemp = pp->Error;
021E F501 movw R30,R10
0220 2084 ldd R2,z+8
0222 3184 ldd R3,z+9
0224 4424 clr R4
0226 37FC sbrc R3,7
0228 4094 com R4
022A 5524 clr R5
022C 47FC sbrc R4,7
022E 5094 com R5
0230 2882 std y+0,R2
0232 3982 std y+1,R3
0234 4A82 std y+2,R4
0236 5B82 std y+3,R5
0238 .dbline 104
0238 ; pidtemp *= (pp->I);
0238 F501 movw R30,R10
023A 2480 ldd R2,z+4
023C 3580 ldd R3,z+5
023E 4424 clr R4
0240 5524 clr R5
0242 0881 ldd R16,y+0
0244 1981 ldd R17,y+1
0246 2A81 ldd R18,y+2
0248 3B81 ldd R19,y+3
024A 5A92 st -y,R5
024C 4A92 st -y,R4
024E 3A92 st -y,R3
0250 2A92 st -y,R2
0252 00D0 rcall empy32s
0254 0883 std y+0,R16
0256 1983 std y+1,R17
0258 2A83 std y+2,R18
025A 3B83 std y+3,R19
025C .dbline 105
025C ; result += pidtemp; // 积分项
025C 2880 ldd R2,y+0
025E 3980 ldd R3,y+1
0260 4A80 ldd R4,y+2
0262 5B80 ldd R5,y+3
0264 6C80 ldd R6,y+4
0266 7D80 ldd R7,y+5
0268 8E80 ldd R8,y+6
026A 9F80 ldd R9,y+7
026C 620C add R6,R2
026E 731C adc R7,R3
0270 841C adc R8,R4
0272 951C adc R9,R5
0274 6C82 std y+4,R6
0276 7D82 std y+5,R7
0278 8E82 std y+6,R8
027A 9F82 std y+7,R9
027C .dbline 112
027C ;
027C ;
027C ; // pidtemp = derror;
027C ; // pidtemp *= (pp->D);
027C ; // result += pidtemp; // 微分项
027C ;
027C ; SumDu += result;
027C 2C80 ldd R2,y+4
027E 3D80 ldd R3,y+5
0280 4E80 ldd R4,y+6
0282 5F80 ldd R5,y+7
0284 80900200 lds R8,_SumDu+2
0288 90900300 lds R9,_SumDu+2+1
028C 60900000 lds R6,_SumDu
0290 70900100 lds R7,_SumDu+1
0294 620C add R6,R2
0296 731C adc R7,R3
0298 841C adc R8,R4
029A 951C adc R9,R5
029C 70920100 sts _SumDu+1,R7
02A0 60920000 sts _SumDu,R6
02A4 90920300 sts _SumDu+2+1,R9
02A8 80920200 sts _SumDu+2,R8
02AC .dbline 114
02AC ;
02AC ; if (SumDu <= 0)
02AC 40E0 ldi R20,0
02AE 50E0 ldi R21,0
02B0 60E0 ldi R22,0
02B2 70E0 ldi R23,0
02B4 4615 cp R20,R6
02B6 5705 cpc R21,R7
02B8 6805 cpc R22,R8
02BA 7905 cpc R23,R9
02BC 14F0 brlt L9
02BE .dbline 115
02BE ; {
02BE .dbline 116
02BE ; K = 0;
02BE AA24 clr R10
02C0 .dbline 117
02C0 ; }
02C0 5BC0 rjmp L10
02C2 L9:
02C2 .dbline 120
02C2 ;
02C2 ; else
02C2 ; {
02C2 .dbline 121
02C2 ; result = SumDu;
02C2 40900200 lds R4,_SumDu+2
02C6 50900300 lds R5,_SumDu+2+1
02CA 20900000 lds R2,_SumDu
02CE 30900100 lds R3,_SumDu+1
02D2 2C82 std y+4,R2
02D4 3D82 std y+5,R3
02D6 4E82 std y+6,R4
02D8 5F82 std y+7,R5
02DA .dbline 122
02DA ; result /= 3000;
02DA 48EB ldi R20,184
02DC 5BE0 ldi R21,11
02DE 60E0 ldi R22,0
02E0 70E0 ldi R23,0
02E2 0C81 ldd R16,y+4
02E4 1D81 ldd R17,y+5
02E6 2E81 ldd R18,y+6
02E8 3F81 ldd R19,y+7
02EA 7A93 st -y,R23
02EC 6A93 st -y,R22
02EE 5A93 st -y,R21
02F0 4A93 st -y,R20
02F2 00D0 rcall div32s
02F4 0C83 std y+4,R16
02F6 1D83 std y+5,R17
02F8 2E83 std y+6,R18
02FA 3F83 std y+7,R19
02FC .dbline 124
02FC ;
02FC ; if (result > 1000)
02FC 48EE ldi R20,232
02FE 53E0 ldi R21,3
0300 60E0 ldi R22,0
0302 70E0 ldi R23,0
0304 2C80 ldd R2,y+4
0306 3D80 ldd R3,y+5
0308 4E80 ldd R4,y+6
030A 5F80 ldd R5,y+7
030C 4215 cp R20,R2
030E 5305 cpc R21,R3
0310 6405 cpc R22,R4
0312 7505 cpc R23,R5
0314 44F4 brge L11
0316 .dbline 125
0316 ; result = 1000;
0316 48EE ldi R20,232
0318 53E0 ldi R21,3
031A 60E0 ldi R22,0
031C 70E0 ldi R23,0
031E 4C83 std y+4,R20
0320 5D83 std y+5,R21
0322 6E83 std y+6,R22
0324 7F83 std y+7,R23
0326 L11:
0326 .dbline 127
0326 ;
0326 ; result *= 0xff;
0326 2C80 ldd R2,y+4
0328 3D80 ldd R3,y+5
032A 4E80 ldd R4,y+6
032C 5F80 ldd R5,y+7
032E 4FEF ldi R20,255
0330 50E0 ldi R21,0
0332 60E0 ldi R22,0
0334 70E0 ldi R23,0
0336 5A92 st -y,R5
0338 4A92 st -y,R4
033A 3A92 st -y,R3
033C 2A92 st -y,R2
033E 8A01 movw R16,R20
0340 9B01 movw R18,R22
0342 00D0 rcall empy32s
0344 0C83 std y+4,R16
0346 1D83 std y+5,R17
0348 2E83 std y+6,R18
034A 3F83 std y+7,R19
034C .dbline 128
034C ; result /=1000;
034C 48EE ldi R20,232
034E 53E0 ldi R21,3
0350 60E0 ldi R22,0
0352 70E0 ldi R23,0
0354 0C81 ldd R16,y+4
0356 1D81 ldd R17,y+5
0358 2E81 ldd R18,y+6
035A 3F81 ldd R19,y+7
035C 7A93 st -y,R23
035E 6A93 st -y,R22
0360 5A93 st -y,R21
0362 4A93 st -y,R20
0364 00D0 rcall div32s
0366 0C83 std y+4,R16
0368 1D83 std y+5,R17
036A 2E83 std y+6,R18
036C 3F83 std y+7,R19
036E .dbline 130
036E ;
036E ; K = result;
036E AC80 ldd R10,y+4
0370 .dbline 131
0370 ; K = PIDBound(K, Fact_Value); //计算控制值上限
0370 9601 movw R18,R12
0372 0A2D mov R16,R10
0374 05D0 rcall _PIDBound
0376 A02E mov R10,R16
0378 .dbline 132
0378 ; }
0378 L10:
0378 .dbline 134
0378 ;
0378 ; return K;
0378 0A2D mov R16,R10
037A .dbline -2
037A L2:
037A 2896 adiw R28,8
037C 00D0 rcall pop_gset5
037E .dbline 0 ; func end
037E 0895 ret
0380 .dbsym l derror 1 I
0380 .dbsym r perror 14 I
0380 .dbsym r K 10 c
0380 .dbsym l result 4 L
0380 .dbsym l pidtemp 0 L
0380 .dbsym r Fact_Value 12 i
0380 .dbsym r pp 10 pS[PID]
0380 .dbend
0380 .dbfunc e PIDBound _PIDBound fc
0380 ; Fact_Value -> R18,R19
0380 ; K -> R16
.even
0380 _PIDBound::
0380 .dbline -1
0380 .dbline 138
0380 ; }
0380 ;
0380 ; byte PIDBound(byte K, word Fact_Value)
0380 ; {
0380 .dbline 144
0380 ; //if (K >0x7f )
0380 ; //{
0380 ; // K = 0x7f;
0380 ; //}
0380 ;
0380 ; return K;
0380 .dbline -2
0380 L13:
0380 .dbline 0 ; func end
0380 0895 ret
0382 .dbsym r Fact_Value 18 i
0382 .dbsym r K 16 c
0382 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -