📄 pidcalc.lis
字号:
.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 + -