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

📄 motor.lst

📁 直流电动机驱动器设计开发环境为ICC,可以编译成汇编,直接下栽到嵌入式avr单片机进行控制
💻 LST
📖 第 1 页 / 共 4 页
字号:
__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 + -