📄 motor.lst
字号:
__start:
__text_start:
0020 E5CF LDI R28,0x5F
0021 E0D2 LDI R29,2
0022 BFCD OUT 0x3D,R28
0023 BFDE OUT 0x3E,R29
0024 51C0 SUBI R28,0x10
0025 40D0 SBCI R29,0
0026 EA0A LDI R16,0xAA
0027 8308 STD Y+0,R16
0028 2400 CLR R0
0029 E6E7 LDI R30,0x67
002A E0F0 LDI R31,0
002B E010 LDI R17,0
002C 38E1 CPI R30,0x81
002D 07F1 CPC R31,R17
002E F011 BEQ 0x0031
002F 9201 ST R0,Z+
0030 CFFB RJMP 0x002C
0031 8300 STD Z+0,R16
0032 E3E8 LDI R30,0x38
0033 E0F0 LDI R31,0
0034 E6A0 LDI R26,0x60
0035 E0B0 LDI R27,0
0036 E010 LDI R17,0
0037 33EF CPI R30,0x3F
0038 07F1 CPC R31,R17
0039 F021 BEQ 0x003E
003A 95C8 LPM
003B 9631 ADIW R30,1
003C 920D ST R0,X+
003D CFF9 RJMP 0x0037
003E D2C2 RCALL _main
_exit:
003F CFFF RJMP _exit
_Putdata:
i --> R20
data --> R16
0040 D336 RCALL push_gset1
FILE: E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
(0001) //***************************FileName:Motor.C************************
(0002) //***************************ICCAVR6.30编译**************************
(0003) #include <io8535v.h>
(0004) #include <macros.h>
(0005) #include <eeprom.h>
(0006)
(0007) //***************************全局变量定义**************************//
(0008) #define U1 5
(0009) char Data[10]; //接收数据数组
(0010) int adress; //数据地址
(0011) int a; //采样时间次数
(0012) float t; //采样时间.s
(0013) int itime; //给定采样时间的次数
(0014) int Ek=0; //本次偏差
(0015) int Ek_1=0; //上次偏差
(0016) int Ek_2=0; //上上次偏差
(0017) char flage=0; //监控标志
(0018) union chang1 //float数据与char数据转换
(0019) {char c[4];
(0020) float x;
(0021) }floatxin;
(0022) union chang2 //int数据与char数据转换
(0023) {char c[2];
(0024) int x;
(0025) }intxin;
(0026)
(0027) //**************************串口数据发送函数***********************//
(0028) //说明:串口数据发送采用查询方式,每一帧发送10个字节
(0029) void Putdata(char data[10])
(0030) {int i;
(0031) for(i=0;i<=9;i++)
0041 2744 CLR R20
0042 2755 CLR R21
(0032) {while(!(USR&(1<<UDRE)));
0043 9B5D SBIS 0x0B,5
0044 CFFE RJMP 0x0043
(0033) UDR=data[i];}
0045 2FE4 MOV R30,R20
0046 2FF5 MOV R31,R21
0047 0FE0 ADD R30,R16
0048 1FF1 ADC R31,R17
0049 8020 LDD R2,Z+0
004A B82C OUT 0x0C,R2
004B 5F4F SUBI R20,0xFF
004C 4F5F SBCI R21,0xFF
004D E089 LDI R24,0x9
004E E090 LDI R25,0
004F 1784 CP R24,R20
0050 0795 CPC R25,R21
0051 F78C BGE 0x0043
(0034) }
0052 D327 RCALL pop_gset1
0053 9508 RET
(0035)
(0036) //**************************读AD转换结果***************************//
(0037) int GetOutputADC()
(0038) {int temp;
(0039) temp=ADCH;
_GetOutputADC:
temp --> R16
0054 B105 IN R16,0x05
0055 2711 CLR R17
(0040) temp=temp<<8;
0056 2F10 MOV R17,R16
0057 2700 CLR R16
(0041) return(temp+ADCL);
0058 B024 IN R2,0x04
0059 2433 CLR R3
005A 0D02 ADD R16,R2
005B 1D13 ADC R17,R3
005C 9508 RET
_Upspeed:
005D 9722 SBIW R28,2
(0042) }
(0043)
(0044) //***************************电机加速函数**************************//
(0045) void Upspeed()
(0046) {EEPROMReadBytes(0x0010,intxin.c,2);
005E E082 LDI R24,2
005F E090 LDI R25,0
0060 8399 STD Y+1,R25
0061 8388 STD Y+0,R24
0062 E627 LDI R18,0x67
0063 E030 LDI R19,0
0064 E100 LDI R16,0x10
0065 E010 LDI R17,0
0066 D394 RCALL _EEPROMReadBytes
(0047) intxin.c[0]+=Data[6];
0067 9020007D LDS R2,0x7D
0069 90300067 LDS R3,_intxin
006B 0C32 ADD R3,R2
006C 92300067 STS _intxin,R3
(0048) intxin.c[1]+=Data[7];
006E 9020007E LDS R2,0x7E
0070 90300068 LDS R3,_intxin+1
0072 0C32 ADD R3,R2
0073 92300068 STS _intxin+1,R3
(0049) EEPROMWriteBytes(0x0010,intxin.c,2);
0075 E082 LDI R24,2
0076 E090 LDI R25,0
0077 8399 STD Y+1,R25
0078 8388 STD Y+0,R24
0079 E627 LDI R18,0x67
007A E030 LDI R19,0
007B E100 LDI R16,0x10
007C E010 LDI R17,0
007D D39E RCALL _EEPROMWriteBytes
(0050) }
007E 9622 ADIW R28,2
007F 9508 RET
_Downspeed:
0080 9722 SBIW R28,2
(0051)
(0052) //***************************电机减速函数**************************//
(0053) void Downspeed()
(0054) {
(0055) EEPROMReadBytes(0x0010,intxin.c,2);
0081 E082 LDI R24,2
0082 E090 LDI R25,0
0083 8399 STD Y+1,R25
0084 8388 STD Y+0,R24
0085 E627 LDI R18,0x67
0086 E030 LDI R19,0
0087 E100 LDI R16,0x10
0088 E010 LDI R17,0
0089 D371 RCALL _EEPROMReadBytes
(0056) intxin.c[0]-=Data[6];
008A 9020007D LDS R2,0x7D
008C 90300067 LDS R3,_intxin
008E 1832 SUB R3,R2
008F 92300067 STS _intxin,R3
(0057) intxin.c[1]-=Data[7];
0091 9020007E LDS R2,0x7E
0093 90300068 LDS R3,_intxin+1
0095 1832 SUB R3,R2
0096 92300068 STS _intxin+1,R3
(0058) EEPROMWriteBytes(0x0010,intxin.c,2);
0098 E082 LDI R24,2
0099 E090 LDI R25,0
009A 8399 STD Y+1,R25
009B 8388 STD Y+0,R24
009C E627 LDI R18,0x67
009D E030 LDI R19,0
009E E100 LDI R16,0x10
009F E010 LDI R17,0
00A0 D37B RCALL _EEPROMWriteBytes
(0059) }
00A1 9622 ADIW R28,2
00A2 9508 RET
_PIDB:
speed --> R14
z --> Y+20
u --> Y+14
t --> R10
y --> R12
temp1 --> R20
k --> Y+2
i --> Y+18
00A3 D2F3 RCALL push_gset5
00A4 9766 SBIW R28,0x16
(0060)
(0061) //***************************PID调节函数***************************//
(0062) void PIDB()
(0063) {int y; //本次速度值
(0064) float u; //电压差值
(0065) int z; //输出增量
(0066) int t; //采样时间
(0067) char temp1; //暂存
(0068) int i;
(0069) int speed; //速度设定
(0070) float k[3]; //PID参数记录
(0071) for (i=0;i<=2;i++)
00A5 2400 CLR R0
00A6 2411 CLR R1
00A7 8A1B STD Y+19,R1
00A8 8A0A STD Y+18,R0
(0072) {EEPROMReadBytes(i*4,floatxin.c,4);
00A9 E084 LDI R24,4
00AA E090 LDI R25,0
00AB 8399 STD Y+1,R25
00AC 8388 STD Y+0,R24
00AD E629 LDI R18,0x69
00AE E030 LDI R19,0
00AF 890A LDD R16,Y+18
00B0 891B LDD R17,Y+19
00B1 0F00 LSL R16
00B2 1F11 ROL R17
00B3 0F00 LSL R16
00B4 1F11 ROL R17
00B5 D345 RCALL _EEPROMReadBytes
(0073) k[i]=floatxin.x;}
00B6 2F8C MOV R24,R28
00B7 2F9D MOV R25,R29
00B8 9602 ADIW R24,2
00B9 89EA LDD R30,Y+18
00BA 89FB LDD R31,Y+19
00BB 0FEE LSL R30
00BC 1FFF ROL R31
00BD 0FEE LSL R30
00BE 1FFF ROL R31
00BF 0FE8 ADD R30,R24
00C0 1FF9 ADC R31,R25
00C1 9040006B LDS R4,_floatxin+2
00C3 9050006C LDS R5,_floatxin+3
00C5 90200069 LDS R2,_floatxin
00C7 9030006A LDS R3,_floatxin+1
00C9 8220 STD Z+0,R2
00CA 8231 STD Z+1,R3
00CB 8242 STD Z+2,R4
00CC 8253 STD Z+3,R5
00CD 898A LDD R24,Y+18
00CE 899B LDD R25,Y+19
00CF 9601 ADIW R24,1
00D0 8B9B STD Y+19,R25
00D1 8B8A STD Y+18,R24
00D2 E082 LDI R24,2
00D3 E090 LDI R25,0
00D4 880A LDD R0,Y+18
00D5 881B LDD R1,Y+19
00D6 1580 CP R24,R0
00D7 0591 CPC R25,R1
00D8 F684 BGE 0x00A9
(0074) EEPROMReadBytes(0x0010,intxin.c,1); //读EEPROM
00D9 E081 LDI R24,1
00DA 8399 STD Y+1,R25
00DB 8388 STD Y+0,R24
00DC E627 LDI R18,0x67
00DD E030 LDI R19,0
00DE E100 LDI R16,0x10
00DF E010 LDI R17,0
00E0 D31A RCALL _EEPROMReadBytes
(0075) speed=intxin.x;
00E1 90E00067 LDS R14,_intxin
00E3 90F00068 LDS R15,_intxin+1
(0076) t=itime*0.0001275;
00E5 E20A LDI R16,0x2A
00E6 E010 LDI R17,0
00E7 D2BB RCALL lpm32
00E8 933A ST R19,-Y
00E9 932A ST R18,-Y
00EA 931A ST R17,-Y
00EB 930A ST R16,-Y
00EC 9100006D LDS R16,_itime
00EE 9110006E LDS R17,_itime+1
00F0 D38A RCALL int2fp
00F1 933A ST R19,-Y
00F2 932A ST R18,-Y
00F3 931A ST R17,-Y
00F4 930A ST R16,-Y
00F5 D494 RCALL mpy32f
00F6 D346 RCALL fp2int
00F7 2EA0 MOV R10,R16
00F8 2EB1 MOV R11,R17
(0077) y = TCNT1;
00F9 B4CC IN R12,0x2C
00FA B4DD IN R13,0x2D
(0078) Ek=y-speed;
00FB 2C2C MOV R2,R12
00FC 2C3D MOV R3,R13
00FD 182E SUB R2,R14
00FE 083F SBC R3,R15
00FF 92300061 STS 0x61,R3
0101 92200060 STS 0x60,R2
(0079) u=k[0]*((Ek-Ek_1)+(t/k[1])*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2));
0103 2FEC MOV R30,R28
0104 2FFD MOV R31,R29
0105 8022 LDD R2,Z+2
0106 8033 LDD R3,Z+3
0107 8044 LDD R4,Z+4
0108 8055 LDD R5,Z+5
0109 925A ST R5,-Y
010A 924A ST R4,-Y
010B 923A ST R3,-Y
010C 922A ST R2,-Y
010D 90200062 LDS R2,0x62
010F 90300063 LDS R3,0x63
0111 91000060 LDS R16,0x60
0113 91100061 LDS R17,0x61
0115 1902 SUB R16,R2
0116 0913 SBC R17,R3
0117 D363 RCALL int2fp
0118 933A ST R19,-Y
0119 932A ST R18,-Y
011A 931A ST R17,-Y
011B 930A ST R16,-Y
011C 2D0A MOV R16,R10
011D 2D1B MOV R17,R11
011E D35C RCALL int2fp
011F 933A ST R19,-Y
0120 932A ST R18,-Y
0121 931A ST R17,-Y
0122 930A ST R16,-Y
0123 2FEC MOV R30,R28
0124 2FFD MOV R31,R29
0125 8822 LDD R2,Z+18
0126 8833 LDD R3,Z+19
0127 8844 LDD R4,Z+20
0128 8855 LDD R5,Z+21
0129 925A ST R5,-Y
012A 924A ST R4,-Y
012B 923A ST R3,-Y
012C 922A ST R2,-Y
012D D3F6 RCALL div32fs
012E 91000060 LDS R16,0x60
0130 91100061 LDS R17,0x61
0132 D348 RCALL int2fp
0133 933A ST R19,-Y
0134 932A ST R18,-Y
0135 931A ST R17,-Y
0136 930A ST R16,-Y
0137 D450 RCALL mpy32fs
0138 D397 RCALL add32fs
0139 2FEC MOV R30,R28
013A 2FFD MOV R31,R29
013B 8822 LDD R2,Z+18
013C 8833 LDD R3,Z+19
013D 8844 LDD R4,Z+20
013E 8855 LDD R5,Z+21
013F 925A ST R5,-Y
0140 924A ST R4,-Y
0141 923A ST R3,-Y
0142 922A ST R2,-Y
0143 2D0A MOV R16,R10
0144 2D1B MOV R17,R11
0145 D335 RCALL int2fp
0146 933A ST R19,-Y
0147 932A ST R18,-Y
0148 931A ST R17,-Y
0149 930A ST R16,-Y
014A D3D9 RCALL div32fs
014B 90200062 LDS R2,0x62
014D 90300063 LDS R3,0x63
014F 0C22 LSL R2
0150 1C33 ROL R3
0151 91000060 LDS R16,0x60
0153 91100061 LDS R17,0x61
0155 1902 SUB R16,R2
0156 0913 SBC R17,R3
0157 90200064 LDS R2,0x64
0159 90300065 LDS R3,0x65
015B 0D02 ADD R16,R2
015C 1D13 ADC R17,R3
015D D31D RCALL int2fp
015E 933A ST R19,-Y
015F 932A ST R18,-Y
0160 931A ST R17,-Y
0161 930A ST R16,-Y
0162 D425 RCALL mpy32fs
0163 D36C RCALL add32fs
0164 D425 RCALL mpy32f
0165 2FEC MOV R30,R28
0166 2FFD MOV R31,R29
0167 8706 STD Z+14,R16
0168 8717 STD Z+15,R17
0169 8B20 STD Z+16,R18
016A 8B31 STD Z+17,R19
(0080) z=u/U1*0xFF;
016B E206 LDI R16,0x26
016C E010 LDI R17,0
016D D235 RCALL lpm32
016E 933A ST R19,-Y
016F 932A ST R18,-Y
0170 931A ST R17,-Y
0171 930A ST R16,-Y
0172 2FEC MOV R30,R28
0173 2FFD MOV R31,R29
0174 8822 LDD R2,Z+18
0175 8833 LDD R3,Z+19
0176 8844 LDD R4,Z+20
0177 8855 LDD R5,Z+21
0178 925A ST R5,-Y
0179 924A ST R4,-Y
017A 923A ST R3,-Y
017B 922A ST R2,-Y
017C E202 LDI R16,0x22
017D E010 LDI R17,0
017E D224 RCALL lpm32
017F 933A ST R19,-Y
0180 932A ST R18,-Y
0181 931A ST R17,-Y
0182 930A ST R16,-Y
0183 D3A0 RCALL div32fs
0184 D405 RCALL mpy32f
0185 D2B7 RCALL fp2int
0186 8B1D STD Y+21,R17
0187 8B0C STD Y+20,R16
(0081) temp1=OCR2;
0188 B543 IN R20,0x23
(0082) if(flage==1) //监控状态
0189 91800066 LDS R24,0x66
018B 3081 CPI R24,1
018C F491 BNE 0x019F
(0083) {Data[4]=0xD0;
018D ED80 LDI R24,0xD0
018E 9380007B STS 0x7B,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -