⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pidcalc.lis

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -