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

📄 minid.lst

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0019) 				  g_ValueAdc返回A/D转换后的滤波值;
(0020) 				  g_AdcEnd 0xff表示当前返回值有效;
(0021) *******************************************************************/
(0022) 
(0023) 
(0024) //包含文件
(0025) #include "ADC.h"
(0026) 
(0027) // ADC initialize
(0028) // Conversion time: 13uS,CLOCK/8;
(0029) void adc_init(void)
(0030) {
(0031)     ADCSRA = 0x00;  //disable adc
_adc_init:
    0161 2422      CLR	R2
    0162 9220007A  STS	0x7A,R2
(0032)     ADMUX  = 0x00;  //select adc input 0
    0164 9220007C  STS	0x7C,R2
(0033)     ACSR   = 0x80;  //not need the compare function
    0166 E880      LDI	R24,0x80
    0167 BF80      OUT	0x30,R24
(0034)     ADCSRB = 0x04;  //定时器0溢出触发转换
    0168 E084      LDI	R24,4
    0169 9380007B  STS	0x7B,R24
    016B 9508      RET
_adc_isr:
  j                    --> Y+0
    016C 920A      ST	R0,-Y
    016D 921A      ST	R1,-Y
    016E 922A      ST	R2,-Y
    016F 923A      ST	R3,-Y
    0170 924A      ST	R4,-Y
    0171 925A      ST	R5,-Y
    0172 926A      ST	R6,-Y
    0173 927A      ST	R7,-Y
    0174 928A      ST	R8,-Y
    0175 929A      ST	R9,-Y
    0176 930A      ST	R16,-Y
    0177 931A      ST	R17,-Y
    0178 932A      ST	R18,-Y
    0179 933A      ST	R19,-Y
    017A 938A      ST	R24,-Y
    017B 93EA      ST	R30,-Y
    017C 93FA      ST	R31,-Y
    017D B60F      IN	R0,0x3F
    017E 920A      ST	R0,-Y
    017F D3E3      RCALL	push_gset2
    0180 9724      SBIW	R28,4
(0035) }
(0036) 
(0037) #pragma interrupt_handler adc_isr:22
(0038) void adc_isr(void)
(0039) {
(0040) 	dword j;
(0041) 	
(0042) 	j =ADCL;            	//Read 8 low bits first (impo
    0181 90200078  LDS	R2,0x78
    0183 2433      CLR	R3
    0184 2444      CLR	R4
    0185 2455      CLR	R5
    0186 01FE      MOVW	R30,R28
    0187 8220      STD	Z+0,R2
    0188 8231      STD	Z+1,R3
    0189 8242      STD	Z+2,R4
    018A 8253      STD	Z+3,R5
(0043)     j |=(int)ADCH << 8;  	//read 2 high bits and shift into topbyte
    018B 90200079  LDS	R2,0x79
    018D 2433      CLR	R3
    018E 2C32      MOV	R3,R2
    018F 2422      CLR	R2
    0190 2444      CLR	R4
    0191 FC37      SBRC	R3,7
    0192 9440      COM	R4
    0193 2455      CLR	R5
    0194 FC47      SBRC	R4,7
    0195 9450      COM	R5
    0196 01FE      MOVW	R30,R28
    0197 8060      LDD	R6,Z+0
    0198 8071      LDD	R7,Z+1
    0199 8082      LDD	R8,Z+2
    019A 8093      LDD	R9,Z+3
    019B 2862      OR	R6,R2
    019C 2873      OR	R7,R3
    019D 2884      OR	R8,R4
    019E 2895      OR	R9,R5
    019F 01FE      MOVW	R30,R28
    01A0 8260      STD	Z+0,R6
    01A1 8271      STD	Z+1,R7
    01A2 8282      STD	Z+2,R8
    01A3 8293      STD	Z+3,R9
(0044)     
(0045) 	j *= ADCK;               //RC filtering
    01A4 01FE      MOVW	R30,R28
    01A5 8020      LDD	R2,Z+0
    01A6 8031      LDD	R3,Z+1
    01A7 8042      LDD	R4,Z+2
    01A8 8053      LDD	R5,Z+3
    01A9 E044      LDI	R20,4
    01AA E050      LDI	R21,0
    01AB E060      LDI	R22,0
    01AC E070      LDI	R23,0
    01AD 925A      ST	R5,-Y
    01AE 924A      ST	R4,-Y
    01AF 923A      ST	R3,-Y
    01B0 922A      ST	R2,-Y
    01B1 018A      MOVW	R16,R20
    01B2 019B      MOVW	R18,R22
    01B3 D377      RCALL	empy32u
    01B4 01FE      MOVW	R30,R28
    01B5 8300      STD	Z+0,R16
    01B6 8311      STD	Z+1,R17
    01B7 8322      STD	Z+2,R18
    01B8 8333      STD	Z+3,R19
(0046) 	j += (10-ADCK) * g_ValueAdc;
    01B9 91200100  LDS	R18,g_ValueAdc
    01BB 91300101  LDS	R19,g_ValueAdc+1
    01BD E006      LDI	R16,6
    01BE E010      LDI	R17,0
    01BF D35B      RCALL	empy16s
    01C0 0118      MOVW	R2,R16
    01C1 2444      CLR	R4
    01C2 2455      CLR	R5
    01C3 01FE      MOVW	R30,R28
    01C4 8060      LDD	R6,Z+0
    01C5 8071      LDD	R7,Z+1
    01C6 8082      LDD	R8,Z+2
    01C7 8093      LDD	R9,Z+3
    01C8 0C62      ADD	R6,R2
    01C9 1C73      ADC	R7,R3
    01CA 1C84      ADC	R8,R4
    01CB 1C95      ADC	R9,R5
    01CC 01FE      MOVW	R30,R28
    01CD 8260      STD	Z+0,R6
    01CE 8271      STD	Z+1,R7
    01CF 8282      STD	Z+2,R8
    01D0 8293      STD	Z+3,R9
(0047) 	j /=10;
    01D1 E04A      LDI	R20,0xA
    01D2 E050      LDI	R21,0
    01D3 E060      LDI	R22,0
    01D4 E070      LDI	R23,0
    01D5 01FE      MOVW	R30,R28
    01D6 8020      LDD	R2,Z+0
    01D7 8031      LDD	R3,Z+1
    01D8 8042      LDD	R4,Z+2
    01D9 8053      LDD	R5,Z+3
    01DA 937A      ST	R23,-Y
    01DB 936A      ST	R22,-Y
    01DC 935A      ST	R21,-Y
    01DD 934A      ST	R20,-Y
    01DE 0181      MOVW	R16,R2
    01DF 0192      MOVW	R18,R4
    01E0 D2C9      RCALL	div32u
    01E1 01FE      MOVW	R30,R28
    01E2 8300      STD	Z+0,R16
    01E3 8311      STD	Z+1,R17
    01E4 8322      STD	Z+2,R18
    01E5 8333      STD	Z+3,R19
(0048) 	g_ValueAdc = j;
    01E6 01FE      MOVW	R30,R28
    01E7 8020      LDD	R2,Z+0
    01E8 8031      LDD	R3,Z+1
    01E9 92300101  STS	g_ValueAdc+1,R3
    01EB 92200100  STS	g_ValueAdc,R2
(0049) 	
(0050) 	g_AdcEnd  = 0xff;            	//set the flag of end
    01ED EF8F      LDI	R24,0xFF
    01EE 93800103  STS	g_AdcEnd,R24
(0051)     ADMUX  = g_AdcNum;				//通道选择
    01F0 90200102  LDS	R2,g_AdcNum
    01F2 9220007C  STS	0x7C,R2
    01F4 9624      ADIW	R28,4
    01F5 D361      RCALL	pop_gset2
    01F6 9009      LD	R0,Y+
    01F7 BE0F      OUT	0x3F,R0
    01F8 91F9      LD	R31,Y+
    01F9 91E9      LD	R30,Y+
    01FA 9189      LD	R24,Y+
    01FB 9139      LD	R19,Y+
    01FC 9129      LD	R18,Y+
    01FD 9119      LD	R17,Y+
    01FE 9109      LD	R16,Y+
    01FF 9099      LD	R9,Y+
    0200 9089      LD	R8,Y+
    0201 9079      LD	R7,Y+
    0202 9069      LD	R6,Y+
    0203 9059      LD	R5,Y+
    0204 9049      LD	R4,Y+
    0205 9039      LD	R3,Y+
    0206 9029      LD	R2,Y+
    0207 9019      LD	R1,Y+
    0208 9009      LD	R0,Y+
    0209 9518      RETI
_AdcPedal:
  get                  --> Y+0
  i                    --> R12
  adcp                 --> R10
    020A D354      RCALL	push_gset4
    020B 0158      MOVW	R10,R16
    020C 9724      SBIW	R28,4
(0052) }
(0053) 
(0054) //************************************************
(0055) //踏板信号转换为对应的控制值
(0056) //前踩:200-6000
(0057) //待机:高位 10
(0058) //后一:高位 11
(0059) //后二:高位 01
(0060) //************************************************
(0061) word AdcPedal(word adcp)
(0062) {
(0063) 	byte i;
(0064) 	dword get;
(0065) 	
(0066) 	i = 0;
    020D 24CC      CLR	R12
(0067) 		
(0068) 	if (adcp <= PEDAL_STOP)
    020E ED86      LDI	R24,0xD6
    020F E091      LDI	R25,1
    0210 158A      CP	R24,R10
    0211 059B      CPC	R25,R11
    0212 F020      BCS	0x0217
(0069) 	{
(0070) 		i = 0x3;
    0213 E083      LDI	R24,3
    0214 2EC8      MOV	R12,R24
(0071) 		adcp = 0;
    0215 24AA      CLR	R10
    0216 24BB      CLR	R11
(0072) 	}
(0073) 	
(0074) 	if ((adcp>PEDAL_STOP) && (adcp<PEDAL_STARTL))
    0217 ED86      LDI	R24,0xD6
    0218 E091      LDI	R25,1
    0219 158A      CP	R24,R10
    021A 059B      CPC	R25,R11
    021B F448      BCC	0x0225
    021C 01C5      MOVW	R24,R10
    021D 3184      CPI	R24,0x14
    021E E0E2      LDI	R30,2
    021F 079E      CPC	R25,R30
    0220 F420      BCC	0x0225
(0075) 	{
(0076) 		i = 0x2;
    0221 E082      LDI	R24,2
    0222 2EC8      MOV	R12,R24
(0077) 		adcp = 0;
    0223 24AA      CLR	R10
    0224 24BB      CLR	R11
(0078) 	}
(0079) 	
(0080) 	if (adcp >= PEDAL_STARTL)
    0225 01C5      MOVW	R24,R10
    0226 3184      CPI	R24,0x14
    0227 E0E2      LDI	R30,2
    0228 079E      CPC	R25,R30
    0229 F408      BCC	0x022B
    022A C050      RJMP	0x027B
(0081) 	{
(0082) 		if (adcp > PEDAL_STARTH)
    022B EA8D      LDI	R24,0xAD
    022C E093      LDI	R25,3
    022D 158A      CP	R24,R10
    022E 059B      CPC	R25,R11
    022F F408      BCC	0x0231
(0083) 		{
(0084) 			adcp = PEDAL_STARTH;
    0230 015C      MOVW	R10,R24
(0085) 		}
(0086) 		get = adcp - PEDAL_STARTL;
    0231 01C5      MOVW	R24,R10
    0232 5184      SUBI	R24,0x14
    0233 4092      SBCI	R25,2
    0234 011C      MOVW	R2,R24
    0235 2444      CLR	R4
    0236 2455      CLR	R5
    0237 01FE      MOVW	R30,R28
    0238 8220      STD	Z+0,R2
    0239 8231      STD	Z+1,R3
    023A 8242      STD	Z+2,R4
    023B 8253      STD	Z+3,R5
(0087) 		get *= 5800;
    023C 01FE      MOVW	R30,R28
    023D 8020      LDD	R2,Z+0
    023E 8031      LDD	R3,Z+1
    023F 8042      LDD	R4,Z+2
    0240 8053      LDD	R5,Z+3
    0241 EA48      LDI	R20,0xA8
    0242 E156      LDI	R21,0x16
    0243 E060      LDI	R22,0
    0244 E070      LDI	R23,0
    0245 925A      ST	R5,-Y
    0246 924A      ST	R4,-Y
    0247 923A      ST	R3,-Y
    0248 922A      ST	R2,-Y
    0249 018A      MOVW	R16,R20
    024A 019B      MOVW	R18,R22
    024B D2DF      RCALL	empy32u
    024C 01FE      MOVW	R30,R28
    024D 8300      STD	Z+0,R16
    024E 8311      STD	Z+1,R17
    024F 8322      STD	Z+2,R18
    0250 8333      STD	Z+3,R19
(0088) 		get /= PEDAL_STARTH;
    0251 EA4D      LDI	R20,0xAD
    0252 E053      LDI	R21,3
    0253 E060      LDI	R22,0
    0254 E070      LDI	R23,0
    0255 01FE      MOVW	R30,R28
    0256 8020      LDD	R2,Z+0
    0257 8031      LDD	R3,Z+1
    0258 8042      LDD	R4,Z+2
    0259 8053      LDD	R5,Z+3
    025A 937A      ST	R23,-Y
    025B 936A      ST	R22,-Y
    025C 935A      ST	R21,-Y
    025D 934A      ST	R20,-Y
    025E 0181      MOVW	R16,R2
    025F 0192      MOVW	R18,R4
    0260 D249      RCALL	div32u
    0261 01FE      MOVW	R30,R28
    0262 8300      STD	Z+0,R16
    0263 8311      STD	Z+1,R17
    0264 8322      STD	Z+2,R18
    0265 8333      STD	Z+3,R19
(0089) 		get += 200;
    0266 EC48      LDI	R20,0xC8
    0267 E050      LDI	R21,0
    0268 E060      LDI	R22,0
    0269 E070      LDI	R23,0
    026A 01FE      MOVW	R30,R28
    026B 8020      LDD	R2,Z+0
    026C 8031      LDD	R3,Z+1
    026D 8042      LDD	R4,Z+2
    026E 8053      LDD	R5,Z+3
    026F 0E24      ADD	R2,R20
    0270 1E35      ADC	R3,R21
    0271 1E46      ADC	R4,R22
    0272 1E57      ADC	R5,R23
    0273 01FE      MOVW	R30,R28
    0274 8220      STD	Z+0,R2
    0275 8231      STD	Z+1,R3
    0276 8242      STD	Z+2,R4
    0277 8253      STD	Z+3,R5
(0090) 		adcp = get;
    0278 01FE      MOVW	R30,R28
    0279 80A0      LDD	R10,Z+0
    027A 80B1      LDD	R11,Z+1
(0091) 	}
(0092) 	
(0093) 	if (i == 3)				//后一状态
    027B 2D8C      MOV	R24,R12
    027C 3083      CPI	R24,3
    027D F419      BNE	0x0281
(0094) 	{
(0095) 	adcp |= 0xC000;
    027E 01C5      MOVW	R24,R10
    027F 6C90      ORI	R25,0xC0
    0280 015C      MOVW	R10,R24
(0096) 	}
(0097) 	if (i == 2)				//待机状态
    0281 2D8C      MOV	R24,R12
    0282 3082      CPI	R24,2
    0283 F419      BNE	0x0287
(0098) 	{
(0099) 	adcp |= 0x8000;
    0284 01C5      MOVW	R24,R10
    0285 6890      ORI	R25,0x80
    0286 015C      MOVW	R10,R24
(0100) 	}
(0101) 	
(0102) 	return adcp;				//返回脚踏板转速值
    0287 0185      MOVW	R16,R10
    0288 9624      ADIW	R28,4
    0289 D2CF      RCALL	pop_gset4
    028A 9508      RET
_PIDInit:
  pp                   --> R20
    028B D2D9      RCALL	push_gset1
    028C 01A8      MOVW	R20,R16
    028D 9722      SBIW	R28,2
FILE: E:\PMax\单片机源代码\函数库\PID\PIDCALC.c
(0001) /*****************************************************************
(0002)  *  文件名:      PID.c
(0003)  *  版本号:      
(0004)  *  创作日期:    2005.7.12
(0005)  *  作者:        Wangzq
(0006)  *  功能说明:    PID增量式算法
(0007)  *  其它说明:    
(0008)  
(0009)  *****************************************************************/
(0010)  
(0011) 
(0012) /*****************************************************************
(0013) 
(0014)  *   修改日期:     
(0015)  *   修改人:
(0016)  *   修改原因:
(0017) 
(0018) *******************************************************************/
(0019)  
(0020) #include "PIDCALC.h"  
(0021)  
(0022) void PIDInit (struct PID *pp )
(0023) {
(0024)     memset( pp, 0, sizeof(struct PID ) );
    028E E180      LDI	R24,0x10
    028F E090      LDI	R25,0
    0290 8399      STD	Y+1,R25
    0291 8388      STD	Y+0,R24
    0292 2722      CLR	R18
    0293 2733      CLR	R19
    0294 018A      MOVW	R16,R20
    0295 D1CB      RCALL	_memset
    0296 9622      ADIW	R28,2
    0297 D2D0      RCALL	pop_gset1
    0298 9508      RET
_PIDCalc:
  i                    --> R10
  dError               --> R10
  Ki                   --> R14
  Error                --> R12
  result               --> Y+0
  Fact_Value           --> R10
  pp                   --> Y+14
    0299 D1D2      RCALL	push_arg4
    029A D2C2      RCALL	push_gset5
    029B 0159      MOVW	R10,R18
    029C 9724      SBIW	R28,4
(0025) }
(0026) 
(0027) byte PIDCalc(struct PID *pp, word Fact_Value )
(0028) {
(0029)     sbyte  Ki;          // Kp积分阀值
(0030) 	sword  Error,dError;
(0031)   	sdword result;
(0032) 	byte i;
(0033)  
(0034)   	 if (pp->SetValue < 300  )         //低速的PID值
    029D 85EE      LDD	R30,Y+14
    029E 85FF      LDD	R31,Y+15
    029F 8180      LDD	R24,Z+0

⌨️ 快捷键说明

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