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

📄 minid.lst

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LST
📖 第 1 页 / 共 4 页
字号:
    02A0 8191      LDD	R25,Z+1
    02A1 93EA      ST	R30,-Y
    02A2 328C      CPI	R24,0x2C
    02A3 E0E1      LDI	R30,1
    02A4 079E      CPC	R25,R30
    02A5 91E9      LD	R30,Y+
    02A6 F484      BGE	0x02B7
(0035)       {
(0036)       	pp->P = KPL;               //低速的p值
    02A7 EC82      LDI	R24,0xC2
    02A8 E091      LDI	R25,1
    02A9 8393      STD	Z+3,R25
    02AA 8382      STD	Z+2,R24
(0037)         pp->I = KIL;
    02AB E388      LDI	R24,0x38
    02AC E090      LDI	R25,0
    02AD 85EE      LDD	R30,Y+14
    02AE 85FF      LDD	R31,Y+15
    02AF 8395      STD	Z+5,R25
    02B0 8384      STD	Z+4,R24
(0038)         pp->D = KDL;
    02B1 E184      LDI	R24,0x14
    02B2 85EE      LDD	R30,Y+14
    02B3 85FF      LDD	R31,Y+15
    02B4 8397      STD	Z+7,R25
    02B5 8386      STD	Z+6,R24
(0039)       }
    02B6 C04B      RJMP	0x0302
(0040)     else 
(0041) 	{
(0042) 		if (pp->SetValue > 2500)   //高速的PID值
    02B7 EC84      LDI	R24,0xC4
    02B8 E099      LDI	R25,0x9
    02B9 85EE      LDD	R30,Y+14
    02BA 85FF      LDD	R31,Y+15
    02BB 8020      LDD	R2,Z+0
    02BC 8031      LDD	R3,Z+1
    02BD 1582      CP	R24,R2
    02BE 0593      CPC	R25,R3
    02BF F47C      BGE	0x02CF
(0043)          {
(0044)      	    pp->P = KPH;          //告诉的p值
    02C0 EE81      LDI	R24,0xE1
    02C1 E090      LDI	R25,0
    02C2 8393      STD	Z+3,R25
    02C3 8382      STD	Z+2,R24
(0045)             pp->I = KIH;
    02C4 E18C      LDI	R24,0x1C
    02C5 85EE      LDD	R30,Y+14
    02C6 85FF      LDD	R31,Y+15
    02C7 8395      STD	Z+5,R25
    02C8 8384      STD	Z+4,R24
(0046)             pp->D = KDH;
    02C9 E08A      LDI	R24,0xA
    02CA 85EE      LDD	R30,Y+14
    02CB 85FF      LDD	R31,Y+15
    02CC 8397      STD	Z+7,R25
    02CD 8386      STD	Z+6,R24
(0047)          }
    02CE C033      RJMP	0x0302
(0048)    		else				//中速的PID值,p,i,d按一定的斜率计算
(0049)     	{      
(0050)      		pp->P = ((pp->SetValue-300)*(KPH-KPL)) / (PIM+KPL);   //  
    02CF 85EE      LDD	R30,Y+14
    02D0 85FF      LDD	R31,Y+15
    02D1 8120      LDD	R18,Z+0
    02D2 8131      LDD	R19,Z+1
    02D3 E10F      LDI	R16,0x1F
    02D4 EF1F      LDI	R17,0xFF
    02D5 D245      RCALL	empy16s
    02D6 5504      SUBI	R16,0x54
    02D7 4F18      SBCI	R17,0xF8
    02D8 E52A      LDI	R18,0x5A
    02D9 E03A      LDI	R19,0xA
    02DA D19A      RCALL	div16s
    02DB 0118      MOVW	R2,R16
    02DC 85EE      LDD	R30,Y+14
    02DD 85FF      LDD	R31,Y+15
    02DE 8233      STD	Z+3,R3
    02DF 8222      STD	Z+2,R2
(0051)      		pp->I = ((pp->SetValue-300)*(KPH-KIL)) / (PIM+KIL);   //
    02E0 85EE      LDD	R30,Y+14
    02E1 85FF      LDD	R31,Y+15
    02E2 8120      LDD	R18,Z+0
    02E3 8131      LDD	R19,Z+1
    02E4 EA09      LDI	R16,0xA9
    02E5 E010      LDI	R17,0
    02E6 D234      RCALL	empy16s
    02E7 500C      SUBI	R16,0xC
    02E8 4C16      SBCI	R17,0xC6
    02E9 ED20      LDI	R18,0xD0
    02EA E038      LDI	R19,0x8
    02EB D189      RCALL	div16s
    02EC 0118      MOVW	R2,R16
    02ED 85EE      LDD	R30,Y+14
    02EE 85FF      LDD	R31,Y+15
    02EF 8235      STD	Z+5,R3
    02F0 8224      STD	Z+4,R2
(0052)      		pp->D = ((pp->SetValue-300)*(KDH-KDL)) / (PIM+KDL);   
    02F1 85EE      LDD	R30,Y+14
    02F2 85FF      LDD	R31,Y+15
    02F3 8120      LDD	R18,Z+0
    02F4 8131      LDD	R19,Z+1
    02F5 EF06      LDI	R16,0xF6
    02F6 EF1F      LDI	R17,0xFF
    02F7 D223      RCALL	empy16s
    02F8 5408      SUBI	R16,0x48
    02F9 4F14      SBCI	R17,0xF4
    02FA EA2C      LDI	R18,0xAC
    02FB E038      LDI	R19,0x8
    02FC D178      RCALL	div16s
    02FD 0118      MOVW	R2,R16
    02FE 85EE      LDD	R30,Y+14
    02FF 85FF      LDD	R31,Y+15
    0300 8237      STD	Z+7,R3
    0301 8226      STD	Z+6,R2
(0053)     	}
(0054) 	}
(0055) 	
(0056) 	//result = 0;// 清零                          
(0057)   	Error  = pp->SetValue - Fact_Value;// 偏差
    0302 85EE      LDD	R30,Y+14
    0303 85FF      LDD	R31,Y+15
    0304 80C0      LDD	R12,Z+0
    0305 80D1      LDD	R13,Z+1
    0306 18CA      SUB	R12,R10
    0307 08DB      SBC	R13,R11
(0058)     pp->SumError += Error;
    0308 01CF      MOVW	R24,R30
    0309 960C      ADIW	R24,0xC
    030A 0126      MOVW	R4,R12
    030B 2466      CLR	R6
    030C FC57      SBRC	R5,7
    030D 9460      COM	R6
    030E 2477      CLR	R7
    030F FC67      SBRC	R6,7
    0310 9470      COM	R7
    0311 01FC      MOVW	R30,R24
    0312 8140      LDD	R20,Z+0
    0313 8151      LDD	R21,Z+1
    0314 8162      LDD	R22,Z+2
    0315 8173      LDD	R23,Z+3
    0316 0D44      ADD	R20,R4
    0317 1D55      ADC	R21,R5
    0318 1D66      ADC	R22,R6
    0319 1D77      ADC	R23,R7
    031A 8340      STD	Z+0,R20
    031B 8351      STD	Z+1,R21
    031C 8362      STD	Z+2,R22
    031D 8373      STD	Z+3,R23
(0059) 	// 过度积分的极限处理
(0060) 	if( pp->SumError > 500 )
    031E EF44      LDI	R20,0xF4
    031F E051      LDI	R21,1
    0320 E060      LDI	R22,0
    0321 E070      LDI	R23,0
    0322 85EE      LDD	R30,Y+14
    0323 85FF      LDD	R31,Y+15
    0324 8424      LDD	R2,Z+12
    0325 8435      LDD	R3,Z+13
    0326 8446      LDD	R4,Z+14
    0327 8457      LDD	R5,Z+15
    0328 1542      CP	R20,R2
    0329 0553      CPC	R21,R3
    032A 0564      CPC	R22,R4
    032B 0575      CPC	R23,R5
    032C F454      BGE	0x0337
(0061) 	{
(0062) 		pp->SumError = 500;
    032D EF44      LDI	R20,0xF4
    032E E051      LDI	R21,1
    032F E060      LDI	R22,0
    0330 E070      LDI	R23,0
    0331 85EE      LDD	R30,Y+14
    0332 85FF      LDD	R31,Y+15
    0333 8744      STD	Z+12,R20
    0334 8755      STD	Z+13,R21
    0335 8766      STD	Z+14,R22
    0336 8777      STD	Z+15,R23
(0063) 	}
(0064) 	if( pp->SumError < -500 )
    0337 E04C      LDI	R20,0xC
    0338 EF5E      LDI	R21,0xFE
    0339 EF6F      LDI	R22,0xFF
    033A EF7F      LDI	R23,0xFF
    033B 85EE      LDD	R30,Y+14
    033C 85FF      LDD	R31,Y+15
    033D 8424      LDD	R2,Z+12
    033E 8435      LDD	R3,Z+13
    033F 8446      LDD	R4,Z+14
    0340 8457      LDD	R5,Z+15
    0341 1624      CP	R2,R20
    0342 0635      CPC	R3,R21
    0343 0646      CPC	R4,R22
    0344 0657      CPC	R5,R23
    0345 F454      BGE	0x0350
(0065) 	{
(0066) 		pp->SumError = -500;
    0346 E04C      LDI	R20,0xC
    0347 EF5E      LDI	R21,0xFE
    0348 EF6F      LDI	R22,0xFF
    0349 EF7F      LDI	R23,0xFF
    034A 85EE      LDD	R30,Y+14
    034B 85FF      LDD	R31,Y+15
    034C 8744      STD	Z+12,R20
    034D 8755      STD	Z+13,R21
    034E 8766      STD	Z+14,R22
    034F 8777      STD	Z+15,R23
(0067) 	}
(0068)   	// Ki为积分阈值,目的是采用积分分离的控制算法,既保持积分作用,又减小超调量 
(0069)   	if( Error >= 1500 )// 偏差大于1500取消积分
    0350 01C6      MOVW	R24,R12
    0351 3D8C      CPI	R24,0xDC
    0352 E0E5      LDI	R30,5
    0353 079E      CPC	R25,R30
    0354 F00C      BLT	0x0356
(0070)   	{  
(0071)         Ki = 0;                     
    0355 24EE      CLR	R14
(0072)   	}
(0073)   
(0074)   	if( 200 < Error < 1000 )// 偏差小于1000线性积分       
    0356 EC88      LDI	R24,0xC8
    0357 E090      LDI	R25,0
    0358 158C      CP	R24,R12
    0359 059D      CPC	R25,R13
    035A F41C      BGE	0x035E
    035B E081      LDI	R24,1
    035C 015C      MOVW	R10,R24
    035D C002      RJMP	0x0360
    035E 24AA      CLR	R10
    035F 24BB      CLR	R11
    0360 01C5      MOVW	R24,R10
    0361 3E88      CPI	R24,0xE8
    0362 E0E3      LDI	R30,3
    0363 079E      CPC	R25,R30
    0364 F45C      BGE	0x0370
(0075)   	{                              	
(0076)         Ki = 10 - ( Error - 200 ) / 80;   
    0365 E520      LDI	R18,0x50
    0366 E030      LDI	R19,0
    0367 0186      MOVW	R16,R12
    0368 5C08      SUBI	R16,0xC8
    0369 4010      SBCI	R17,0
    036A D10A      RCALL	div16s
    036B E08A      LDI	R24,0xA
    036C E090      LDI	R25,0
    036D 2EE8      MOV	R14,R24
    036E 1AE0      SUB	R14,R16
    036F 0AF1      SBC	R15,R17
(0077) 		          
(0078)   	}
(0079)   
(0080)   	if( Error <= 200 )// 全积分 
    0370 EC88      LDI	R24,0xC8
    0371 E090      LDI	R25,0
    0372 158C      CP	R24,R12
    0373 059D      CPC	R25,R13
    0374 F014      BLT	0x0377
(0081)   	{
(0082)         Ki = 10;                       
    0375 E08A      LDI	R24,0xA
    0376 2EE8      MOV	R14,R24
(0083)     } 
(0084)  
(0085)   	dError = pp->LastError - pp->PrevError;// 当前微分  
    0377 85EE      LDD	R30,Y+14
    0378 85FF      LDD	R31,Y+15
    0379 8422      LDD	R2,Z+10
    037A 8433      LDD	R3,Z+11
    037B 85EE      LDD	R30,Y+14
    037C 85FF      LDD	R31,Y+15
    037D 84A0      LDD	R10,Z+8
    037E 84B1      LDD	R11,Z+9
    037F 18A2      SUB	R10,R2
    0380 08B3      SBC	R11,R3
(0086)                                                                                     
(0087)   	pp->PrevError = pp->LastError;// 当前误差Error[-1]赋给上次误差Error[-2] 
    0381 85EE      LDD	R30,Y+14
    0382 85FF      LDD	R31,Y+15
    0383 8420      LDD	R2,Z+8
    0384 8431      LDD	R3,Z+9
    0385 85EE      LDD	R30,Y+14
    0386 85FF      LDD	R31,Y+15
    0387 8633      STD	Z+11,R3
    0388 8622      STD	Z+10,R2
(0088)     pp->LastError = Error;// 取当前误差
    0389 85EE      LDD	R30,Y+14
    038A 85FF      LDD	R31,Y+15
    038B 86D1      STD	Z+9,R13
    038C 86C0      STD	Z+8,R12
(0089) 	
(0090)     // result=[(pp->P*Error)+ (Kp*pp->I*pp->SumError/10)+(pp->D*dError)]/10 
(0091)     result =       pp->P * Error;              // 比例项       
    038D 85EE      LDD	R30,Y+14
    038E 85FF      LDD	R31,Y+15
    038F 8102      LDD	R16,Z+2
    0390 8113      LDD	R17,Z+3
    0391 0196      MOVW	R18,R12
    0392 D188      RCALL	empy16s
    0393 0118      MOVW	R2,R16
    0394 2444      CLR	R4
    0395 FC37      SBRC	R3,7
    0396 9440      COM	R4
    0397 2455      CLR	R5
    0398 FC47      SBRC	R4,7
    0399 9450      COM	R5
    039A 01FE      MOVW	R30,R28
    039B 8220      STD	Z+0,R2
    039C 8231      STD	Z+1,R3
    039D 8242      STD	Z+2,R4
    039E 8253      STD	Z+3,R5
(0092)   	result += Ki * pp->I * pp->SumError  / 10; // 积分项
    039F 85EE      LDD	R30,Y+14
    03A0 85FF      LDD	R31,Y+15
    03A1 8124      LDD	R18,Z+4
    03A2 8135      LDD	R19,Z+5
    03A3 2D0E      MOV	R16,R14
    03A4 2711      CLR	R17
    03A5 D175      RCALL	empy16s
    03A6 0118      MOVW	R2,R16
    03A7 2444      CLR	R4
    03A8 FC37      SBRC	R3,7
    03A9 9440      COM	R4
    03AA 2455      CLR	R5
    03AB FC47      SBRC	R4,7
    03AC 9450      COM	R5
    03AD 85EE      LDD	R30,Y+14
    03AE 85FF      LDD	R31,Y+15
    03AF 8464      LDD	R6,Z+12
    03B0 8475      LDD	R7,Z+13
    03B1 8486      LDD	R8,Z+14
    03B2 8497      LDD	R9,Z+15
    03B3 929A      ST	R9,-Y
    03B4 928A      ST	R8,-Y
    03B5 927A      ST	R7,-Y
    03B6 926A      ST	R6,-Y
    03B7 0181      MOVW	R16,R2
    03B8 0192      MOVW	R18,R4
    03B9 D171      RCALL	empy32u
    03BA E04A      LDI	R20,0xA
    03BB E050      LDI	R21,0
    03BC E060      LDI	R22,0
    03BD E070      LDI	R23,0
    03BE 937A      ST	R23,-Y
    03BF 936A      ST	R22,-Y
    03C0 935A      ST	R21,-Y
    03C1 934A      ST	R20,-Y
    03C2 D0ED      RCALL	div32s
    03C3 01FE      MOVW	R30,R28
    03C4 8020      LDD	R2,Z+0
    03C5 8031      LDD	R3,Z+1
    03C6 8042      LDD	R4,Z+2
    03C7 8053      LDD	R5,Z+3
    03C8 0E20      ADD	R2,R16
    03C9 1E31      ADC	R3,R17
    03CA 1E42      ADC	R4,R18
    03CB 1E53      ADC	R5,R19
    03CC 01FE      MOVW	R30,R28
    03CD 8220      STD	Z+0,R2
    03CE 8231      STD	Z+1,R3
    03CF 8242      STD	Z+2,R4
    03D0 8253      STD	Z+3,R5
(0093)   	result +=      pp->D * dError;             // 微分项
    03D1 85EE      LDD	R30,Y+14
    03D2 85FF      LDD	R31,Y+15
    03D3 8106      LDD	R16,Z+6
    03D4 8117      LDD	R17,Z+7
    03D5 0195      MOVW	R18,R10
    03D6 D144      RCALL	empy16s
    03D7 0118      MOVW	R2,R16
    03D8 2444      CLR	R4
    03D9 FC37      SBRC	R3,7
    03DA 9440      COM	R4
    03DB 2455      CLR	R5
    03DC FC47      SBRC	R4,7
    03DD 9450      COM	R5
    03DE 01FE      MOVW	R30,R28
    03DF 8060      LDD	R6,Z+0
    03E0 8071      LDD	R7,Z+1
    03E1 8082      LDD	R8,Z+2
    03E2 8093      LDD	R9,Z+3
    03E3 0C62      ADD	R6,R2
    03E4 1C73      ADC	R7,R3
    03E5 1C84      ADC	R8,R4
    03E6 1C95      ADC	R9,R5
    03E7 01FE      MOVW	R30,R28
    03E8 8260      STD	Z+0,R6
    03E9 8271      STD	Z+1,R7
    03EA 8282      STD	Z+2,R8
    03EB 8293      STD	Z+3,R9
(0094)   	result /= 1000;
    03EC EE48      LDI	R20,0xE8
    03ED E053      LDI	R21,3
    03EE E060      LDI	R22,0
    03EF E070      LDI	R23,0
    03F0 01FE      MOVW	R30,R28
    03F1 8020      LDD	R2,Z+0
    03F2 8031      LDD	R3,Z+1
    03F3 8042      LDD	R4,Z+2
    03F4 8053      LDD	R5,Z+3
    03F5 937A      ST	R23,-Y
    03F6 936A      ST	R22,-Y
    03F7 935A      ST	R21,-Y
    03F8 934A      ST	R20,-Y
    03F9 0181      MOVW	R16,R2
    03FA 0192      MOVW	R18,R4
    03FB D0B4      RCALL	div32s
    03FC 01FE      MOVW	R30,R28
    03FD 8300      STD	Z+0,R16
    03FE 8311      STD	Z+1,R17
    03FF 8322      STD	Z+2,R18
    0400 8333      STD	Z+3,R19
(0095) 	
(0096) 	if (result <= 0)
    0401 E040      LDI	R20,0
    0402 E050      LDI	R21,0
    0403 E060      LDI	R22,0
    0404 E070      LDI	R23,0
    0405 01FE      MOVW	R30,R28
    0406 8020      LDD	R2,Z+0
    0407 8031      LDD	R3,Z+1
    0408 8042      LDD	R4,Z+2
    0409 8053      LDD	R5,Z+3
    040A 1542      CP	R20,R2
    040B 0553      CPC	R21,R3
    040C 0564      CPC	R22,R4
    040D 0575      CPC	R23,R5
    040E F054      BLT	0x0419
(0097) 	{
(0098) 		result = 0;
    040F E040      LDI	R20,0
    0410 E050      LDI	R21,0
    0411 E060      LDI	R22,0
    0412 E070      LDI	R23,0
    0413 01FE      MOVW	R30,R28
    0414 8340      STD	Z+0,R20
    0415 8351      STD	Z+1,R21
    0416 8362      STD	Z+2,R22
    0417 8373      STD	Z+3,R23
(0099) 		
(0100) 	}
    0418 C041      RJMP	0x045A

⌨️ 快捷键说明

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