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

📄 pidcalc.lis

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module PIDCALC.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\PID\PIDCALC.c
 0000                   .dbfunc e PIDInit _PIDInit fV
 0000                   .dbstruct 0 14 PID
 0000                   .dbfield 0 SetValue i
 0000                   .dbfield 2 P i
 0000                   .dbfield 4 I i
 0000                   .dbfield 6 D i
 0000                   .dbfield 8 Error I
 0000                   .dbfield 10 LastError I
 0000                   .dbfield 12 PrevError I
 0000                   .dbend
 0000           ;             pp -> R20,R21
                        .even
 0000           _PIDInit::
 0000 00D0              rcall push_gset1
 0002 A801              movw R20,R16
 0004 2297              sbiw R28,2
 0006                   .dbline -1
 0006                   .dbline 27
 0006           ; /*****************************************************************
 0006           ;  *  文件名:      PID.c
 0006           ;  *  版本号:      
 0006           ;  *  创作日期:    2005.7.12
 0006           ;  *  作者:        Wangzq
 0006           ;  *  功能说明:    PID增量式算法
 0006           ;  *  其它说明:    
 0006           ;  
 0006           ;  *****************************************************************/
 0006           ;  
 0006           ; 
 0006           ; /*****************************************************************
 0006           ; 
 0006           ;  *   修改日期:     
 0006           ;  *   修改人:
 0006           ;  *   修改原因:
 0006           ; 
 0006           ; *******************************************************************/
 0006           ;  
 0006           ; #include "PIDCALC.h"  
 0006           ;  
 0006           ; //****************************************************************
 0006           ; //增量式PID算法
 0006           ; //
 0006           ; //*************************************************************** 
 0006           ; void PIDInit (struct PID *pp )
 0006           ; {
 0006                   .dbline 28
 0006           ;     memset( pp, 0, sizeof(struct PID ) );
 0006 8EE0              ldi R24,14
 0008 90E0              ldi R25,0
 000A 9983              std y+1,R25
 000C 8883              std y+0,R24
 000E 2227              clr R18
 0010 3327              clr R19
 0012 8A01              movw R16,R20
 0014 00D0              rcall _memset
 0016                   .dbline -2
 0016           L1:
 0016 2296              adiw R28,2
 0018 00D0              rcall pop_gset1
 001A                   .dbline 0 ; func end
 001A 0895              ret
 001C                   .dbsym r pp 20 pS[PID]
 001C                   .dbend
 001C                   .dbfunc e PIDCalc _PIDCalc fc
 001C           ;         derror -> <dead>
 001C           ;         perror -> R14,R15
 001C           ;              K -> R10
 001C           ;         result -> y+4
 001C           ;        pidtemp -> y+0
 001C           ;     Fact_Value -> R12,R13
 001C           ;             pp -> R10,R11
                        .even
 001C           _PIDCalc::
 001C 00D0              rcall push_gset5
 001E 6901              movw R12,R18
 0020 5801              movw R10,R16
 0022 2897              sbiw R28,8
 0024                   .dbline -1
 0024                   .dbline 32
 0024           ; }
 0024           ; 
 0024           ; byte PIDCalc(struct PID *pp, word Fact_Value )
 0024           ; {
 0024                   .dbline 37
 0024           ;     byte  K;                                                  // PID实际输出值
 0024           ;       sword  perror,derror;
 0024           ;       sdword result,pidtemp;
 0024           ;       
 0024           ;       if (pp->SetValue < 300  )         //低速的PID值
 0024 F501              movw R30,R10
 0026 8081              ldd R24,z+0
 0028 9181              ldd R25,z+1
 002A EA93              st -y,R30
 002C 8C32              cpi R24,44
 002E E1E0              ldi R30,1
 0030 9E07              cpc R25,R30
 0032 E991              ld R30,y+
 0034 68F4              brsh L3
 0036                   .dbline 38
 0036           ;       {
 0036                   .dbline 39
 0036           ;               pp->P = KPL;               //低速的p值
 0036 8DE2              ldi R24,45
 0038 90E0              ldi R25,0
 003A 9383              std z+3,R25
 003C 8283              std z+2,R24
 003E                   .dbline 40
 003E           ;         pp->I = KIL;
 003E 85E0              ldi R24,5
 0040 F501              movw R30,R10
 0042 9583              std z+5,R25
 0044 8483              std z+4,R24
 0046                   .dbline 41
 0046           ;         pp->D = KDL;
 0046 82E0              ldi R24,2
 0048 F501              movw R30,R10
 004A 9783              std z+7,R25
 004C 8683              std z+6,R24
 004E                   .dbline 42
 004E           ;       }
 004E A1C0              rjmp L4
 0050           L3:
 0050                   .dbline 44
 0050           ;     else 
 0050           ;       {
 0050                   .dbline 45
 0050           ;               if (pp->SetValue > 2500)   //高速的PID值
 0050 84EC              ldi R24,2500
 0052 99E0              ldi R25,9
 0054 F501              movw R30,R10
 0056 2080              ldd R2,z+0
 0058 3180              ldd R3,z+1
 005A 8215              cp R24,R2
 005C 9305              cpc R25,R3
 005E 68F4              brsh L5
 0060                   .dbline 46
 0060           ;          {
 0060                   .dbline 47
 0060           ;           pp->P = KPH;          //告诉的p值
 0060 86E1              ldi R24,22
 0062 90E0              ldi R25,0
 0064 9383              std z+3,R25
 0066 8283              std z+2,R24
 0068                   .dbline 48
 0068           ;             pp->I = KIH;
 0068 83E0              ldi R24,3
 006A F501              movw R30,R10
 006C 9583              std z+5,R25
 006E 8483              std z+4,R24
 0070                   .dbline 49
 0070           ;             pp->D = KDH;
 0070 81E0              ldi R24,1
 0072 F501              movw R30,R10
 0074 9783              std z+7,R25
 0076 8683              std z+6,R24
 0078                   .dbline 50
 0078           ;          }
 0078 8CC0              rjmp L6
 007A           L5:
 007A                   .dbline 52
 007A           ;               else                            //中速的PID值,p,i,d按一定的斜率计算
 007A           ;       {      
 007A                   .dbline 55
 007A           ;               
 007A           ; //*********************计算PID插值常数***************************                 
 007A           ;                       perror = (2500-pp->SetValue);                           //计算PID插值常数
 007A F501              movw R30,R10
 007C 2080              ldd R2,z+0
 007E 3180              ldd R3,z+1
 0080 84EC              ldi R24,2500
 0082 99E0              ldi R25,9
 0084 7C01              movw R14,R24
 0086 E218              sub R14,R2
 0088 F308              sbc R15,R3
 008A                   .dbline 57
 008A           ;                       
 008A           ;                       pidtemp = (KPL-KPH);
 008A 47E1              ldi R20,23
 008C 50E0              ldi R21,0
 008E 60E0              ldi R22,0
 0090 70E0              ldi R23,0
 0092 4883              std y+0,R20
 0094 5983              std y+1,R21
 0096 6A83              std y+2,R22
 0098 7B83              std y+3,R23
 009A                   .dbline 58
 009A           ;                       pidtemp *= perror;
 009A 1701              movw R2,R14
 009C 4424              clr R4
 009E 37FC              sbrc R3,7
 00A0 4094              com R4
 00A2 5524              clr R5
 00A4 47FC              sbrc R4,7
 00A6 5094              com R5
 00A8 0881              ldd R16,y+0
 00AA 1981              ldd R17,y+1
 00AC 2A81              ldd R18,y+2
 00AE 3B81              ldd R19,y+3
 00B0 5A92              st -y,R5
 00B2 4A92              st -y,R4
 00B4 3A92              st -y,R3
 00B6 2A92              st -y,R2
 00B8 00D0              rcall empy32s
 00BA 0883              std y+0,R16
 00BC 1983              std y+1,R17
 00BE 2A83              std y+2,R18
 00C0 3B83              std y+3,R19
 00C2                   .dbline 59
 00C2           ;                       pidtemp /= PIM;
 00C2 48E9              ldi R20,152
 00C4 58E0              ldi R21,8
 00C6 60E0              ldi R22,0
 00C8 70E0              ldi R23,0
 00CA 0881              ldd R16,y+0
 00CC 1981              ldd R17,y+1
 00CE 2A81              ldd R18,y+2
 00D0 3B81              ldd R19,y+3
 00D2 7A93              st -y,R23
 00D4 6A93              st -y,R22
 00D6 5A93              st -y,R21
 00D8 4A93              st -y,R20
 00DA 00D0              rcall div32s
 00DC 0883              std y+0,R16
 00DE 1983              std y+1,R17
 00E0 2A83              std y+2,R18
 00E2 3B83              std y+3,R19
 00E4                   .dbline 60
 00E4           ;                       pidtemp += KPH;
 00E4 46E1              ldi R20,22
 00E6 50E0              ldi R21,0
 00E8 60E0              ldi R22,0
 00EA 70E0              ldi R23,0
 00EC 2880              ldd R2,y+0
 00EE 3980              ldd R3,y+1
 00F0 4A80              ldd R4,y+2
 00F2 5B80              ldd R5,y+3
 00F4 240E              add R2,R20
 00F6 351E              adc R3,R21
 00F8 461E              adc R4,R22
 00FA 571E              adc R5,R23
 00FC 2882              std y+0,R2
 00FE 3982              std y+1,R3
 0100 4A82              std y+2,R4
 0102 5B82              std y+3,R5
 0104                   .dbline 61
 0104           ;                       pp->P = pidtemp;
 0104 2880              ldd R2,y+0
 0106 3980              ldd R3,y+1
 0108 F501              movw R30,R10
 010A 3382              std z+3,R3
 010C 2282              std z+2,R2
 010E                   .dbline 63
 010E           ;                       
 010E           ;                       pidtemp = (KIL-KIH);
 010E 42E0              ldi R20,2
 0110 50E0              ldi R21,0
 0112 60E0              ldi R22,0
 0114 70E0              ldi R23,0
 0116 4883              std y+0,R20
 0118 5983              std y+1,R21
 011A 6A83              std y+2,R22
 011C 7B83              std y+3,R23
 011E                   .dbline 64
 011E           ;                       pidtemp *= perror;
 011E 1701              movw R2,R14
 0120 4424              clr R4
 0122 37FC              sbrc R3,7
 0124 4094              com R4
 0126 5524              clr R5
 0128 47FC              sbrc R4,7
 012A 5094              com R5
 012C 0881              ldd R16,y+0
 012E 1981              ldd R17,y+1
 0130 2A81              ldd R18,y+2
 0132 3B81              ldd R19,y+3
 0134 5A92              st -y,R5
 0136 4A92              st -y,R4
 0138 3A92              st -y,R3
 013A 2A92              st -y,R2
 013C 00D0              rcall empy32s
 013E 0883              std y+0,R16
 0140 1983              std y+1,R17
 0142 2A83              std y+2,R18
 0144 3B83              std y+3,R19
 0146                   .dbline 65
 0146           ;                       pidtemp /= PIM;
 0146 48E9              ldi R20,152
 0148 58E0              ldi R21,8
 014A 60E0              ldi R22,0
 014C 70E0              ldi R23,0
 014E 0881              ldd R16,y+0
 0150 1981              ldd R17,y+1
 0152 2A81              ldd R18,y+2
 0154 3B81              ldd R19,y+3
 0156 7A93              st -y,R23
 0158 6A93              st -y,R22
 015A 5A93              st -y,R21
 015C 4A93              st -y,R20
 015E 00D0              rcall div32s
 0160 0883              std y+0,R16
 0162 1983              std y+1,R17
 0164 2A83              std y+2,R18
 0166 3B83              std y+3,R19
 0168                   .dbline 66
 0168           ;                       pidtemp += KIH;
 0168 43E0              ldi R20,3
 016A 50E0              ldi R21,0
 016C 60E0              ldi R22,0
 016E 70E0              ldi R23,0
 0170 2880              ldd R2,y+0
 0172 3980              ldd R3,y+1
 0174 4A80              ldd R4,y+2
 0176 5B80              ldd R5,y+3
 0178 240E              add R2,R20
 017A 351E              adc R3,R21
 017C 461E              adc R4,R22
 017E 571E              adc R5,R23
 0180 2882              std y+0,R2
 0182 3982              std y+1,R3
 0184 4A82              std y+2,R4
 0186 5B82              std y+3,R5
 0188                   .dbline 67
 0188           ;                       pp->I = pidtemp;
 0188 2880              ldd R2,y+0
 018A 3980              ldd R3,y+1
 018C F501              movw R30,R10
 018E 3582              std z+5,R3
 0190 2482              std z+4,R2
 0192                   .dbline 76
 0192           ;                       
 0192           ; //                    pidtemp = (KDL-KDH);
 0192           ; //                    pidtemp *= perror;
 0192           ; //                    pidtemp /= PIM;
 0192           ; //                    pidtemp += KDH;
 0192           ; //                    pp->D = pidtemp;
 0192           ; //*********************计算PID插值常数***************************     
 0192           ;                       
 0192           ;               }
 0192           L6:
 0192                   .dbline 77
 0192           ;       }
 0192           L4:
 0192                   .dbline 80
 0192           ;       
 0192           ;       //result = 0;// 清零     
 0192           ;       if (Fact_Value > 7000)                          //转速上限值设定
 0192 88E5              ldi R24,7000
 0194 9BE1              ldi R25,27
 0196 8C15              cp R24,R12
 0198 9D05              cpc R25,R13
 019A 08F4              brsh L7

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -