📄 minid.lst
字号:
(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 + -