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

📄 motor.s

📁 直流电机驱动系统设计,以单片机实现电动机的调速控制.
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module Motor.c
	.area data(ram, con, rel)
_Ek::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
	.dbsym e Ek _Ek I
_Ek_1::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
	.dbsym e Ek_1 _Ek_1 I
_Ek_2::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
	.dbsym e Ek_2 _Ek_2 I
_flage::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
	.dbsym e flage _flage c
	.area text(rom, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
	.dbfunc e Putdata _Putdata fV
;              i -> R20,R21
;           data -> R16,R17
	.even
_Putdata::
	rcall push_gset1
	.dbline -1
	.dbline 30
; //***************************FileName:Motor.C************************
; //***************************ICCAVR6.30编译**************************
; #include <io8535v.h>
; #include <macros.h>
; #include <eeprom.h>
; 
; //***************************全局变量定义**************************//
; #define U1 5 
; char Data[10];               //接收数据数组
; int adress;                  //数据地址
; int a;                       //采样时间次数
; float t;                     //采样时间.s
; int itime;                   //给定采样时间的次数
; int Ek=0;                    //本次偏差
; int Ek_1=0;                  //上次偏差
; int Ek_2=0;                  //上上次偏差
; char flage=0;                //监控标志
; union chang1                 //float数据与char数据转换
; {char c[4];    
;  float x;
; }floatxin;
; union chang2                 //int数据与char数据转换           
; {char c[2];
;  int x;
; }intxin; 
; 
; //**************************串口数据发送函数***********************//
; //说明:串口数据发送采用查询方式,每一帧发送10个字节
; void Putdata(char data[10])
; {int i;
	.dbline 31
;  for(i=0;i<=9;i++)
	clr R20
	clr R21
	.dbline 32
L6:
	.dbline 32
L7:
	.dbline 32
	sbis 0xb,5
	rjmp L6
	.dbline 33
	mov R30,R20
	mov R31,R21
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	out 0xc,R2
	.dbline 33
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 31
	ldi R24,9
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brge L7
	.dbline -2
	.dbline 34
;  {while(!(USR&(1<<UDRE)));
;   UDR=data[i];}
; }
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbsym r data 16 pc
	.dbend
	.dbfunc e GetOutputADC _GetOutputADC fI
;           temp -> R16,R17
	.even
_GetOutputADC::
	.dbline -1
	.dbline 38
; 
; //**************************读AD转换结果***************************//
; int GetOutputADC()
; {int temp;
	.dbline 39
;  temp=ADCH;
	in R16,0x5
	clr R17
	.dbline 40
;  temp=temp<<8;
	mov R17,R16
	clr R16
	.dbline 41
;  return(temp+ADCL);
	in R2,0x4
	clr R3
	add R16,R2
	adc R17,R3
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbsym r temp 16 I
	.dbend
	.dbfunc e Upspeed _Upspeed fV
	.even
_Upspeed::
	sbiw R28,2
	.dbline -1
	.dbline 46
; }
; 
; //***************************电机加速函数**************************//
; void Upspeed()
; {EEPROMReadBytes(0x0010,intxin.c,2);
	.dbline 46
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_intxin
	ldi R19,>_intxin
	ldi R16,16
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 47
;  intxin.c[0]+=Data[6];
	lds R2,_Data+6
	lds R3,_intxin
	add R3,R2
	sts _intxin,R3
	.dbline 48
;  intxin.c[1]+=Data[7];
	lds R2,_Data+7
	lds R3,_intxin+1
	add R3,R2
	sts _intxin+1,R3
	.dbline 49
;  EEPROMWriteBytes(0x0010,intxin.c,2);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_intxin
	ldi R19,>_intxin
	ldi R16,16
	ldi R17,0
	rcall _EEPROMWriteBytes
	.dbline -2
	.dbline 50
; }
L10:
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Downspeed _Downspeed fV
	.even
_Downspeed::
	sbiw R28,2
	.dbline -1
	.dbline 54
; 
; //***************************电机减速函数**************************//
; void Downspeed()
; {
	.dbline 55
;   EEPROMReadBytes(0x0010,intxin.c,2);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_intxin
	ldi R19,>_intxin
	ldi R16,16
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 56
;   intxin.c[0]-=Data[6];
	lds R2,_Data+6
	lds R3,_intxin
	sub R3,R2
	sts _intxin,R3
	.dbline 57
;   intxin.c[1]-=Data[7];
	lds R2,_Data+7
	lds R3,_intxin+1
	sub R3,R2
	sts _intxin+1,R3
	.dbline 58
;   EEPROMWriteBytes(0x0010,intxin.c,2);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_intxin
	ldi R19,>_intxin
	ldi R16,16
	ldi R17,0
	rcall _EEPROMWriteBytes
	.dbline -2
	.dbline 59
; }
L14:
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e PIDB _PIDB fV
;          speed -> R14,R15
;              z -> y+20
;              u -> y+14
;              t -> R10,R11
;              y -> R12,R13
;          temp1 -> R20
;              k -> y+2
;              i -> y+18
	.even
_PIDB::
	rcall push_gset5
	sbiw R28,22
	.dbline -1
	.dbline 63
; 
; //***************************PID调节函数***************************//
; void PIDB()
; {int y;           //本次速度值 
	.dbline 71
;  float u;         //电压差值
;  int z;           //输出增量
;  int t;           //采样时间
;  char temp1;      //暂存
;  int i;
;  int speed;       //速度设定
;  float k[3];      //PID参数记录
;  for (i=0;i<=2;i++)
	clr R0
	clr R1
	std y+19,R1
	std y+18,R0
L19:
	.dbline 72
	.dbline 72
	ldi R24,4
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_floatxin
	ldi R19,>_floatxin
	ldd R16,y+18
	ldd R17,y+19
	lsl R16
	rol R17
	lsl R16
	rol R17
	rcall _EEPROMReadBytes
	.dbline 73
	mov R24,R28
	mov R25,R29
	adiw R24,2
	ldd R30,y+18
	ldd R31,y+19
	lsl R30
	rol R31
	lsl R30
	rol R31
	add R30,R24
	adc R31,R25
	lds R4,_floatxin+2
	lds R5,_floatxin+2+1
	lds R2,_floatxin
	lds R3,_floatxin+1
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 73
L20:
	.dbline 71
	ldd R24,y+18
	ldd R25,y+19
	adiw R24,1
	std y+19,R25
	std y+18,R24
	.dbline 71
	ldi R24,2
	ldi R25,0
	ldd R0,y+18
	ldd R1,y+19
	cp R24,R0
	cpc R25,R1
	brge L19
	.dbline 74
;   {EEPROMReadBytes(i*4,floatxin.c,4);
;    k[i]=floatxin.x;}
;   EEPROMReadBytes(0x0010,intxin.c,1);   //读EEPROM
	ldi R24,1
	std y+1,R25
	std y+0,R24
	ldi R18,<_intxin
	ldi R19,>_intxin
	ldi R16,16
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 75
;   speed=intxin.x;
	lds R14,_intxin
	lds R15,_intxin+1
	.dbline 76
;   t=itime*0.0001275;
	ldi R16,<L23
	ldi R17,>L23
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	lds R16,_itime
	lds R17,_itime+1
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall mpy32f
	rcall fp2int
	mov R10,R16
	mov R11,R17
	.dbline 77
;   y = TCNT1; 
	in R12,0x2c
	in R13,0x2d
	.dbline 78
;   Ek=y-speed;
	mov R2,R12
	mov R3,R13
	sub R2,R14
	sbc R3,R15
	sts _Ek+1,R3
	sts _Ek,R2
	.dbline 79
;   u=k[0]*((Ek-Ek_1)+(t/k[1])*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2));
	mov R30,R28
	mov R31,R29
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	lds R2,_Ek_1
	lds R3,_Ek_1+1
	lds R16,_Ek
	lds R17,_Ek+1
	sub R16,R2
	sbc R17,R3
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R16,R10
	mov R17,R11
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R30,R28
	mov R31,R29
 ; stack offset 12
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	rcall div32fs
	lds R16,_Ek
	lds R17,_Ek+1
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall mpy32fs
	rcall add32fs
	mov R30,R28
	mov R31,R29
 ; stack offset 8
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	mov R16,R10
	mov R17,R11
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall div32fs
	lds R2,_Ek_1
	lds R3,_Ek_1+1
	lsl R2
	rol R3
	lds R16,_Ek
	lds R17,_Ek+1
	sub R16,R2
	sbc R17,R3
	lds R2,_Ek_2
	lds R3,_Ek_2+1
	add R16,R2
	adc R17,R3
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall mpy32fs
	rcall add32fs
	rcall mpy32f
	mov R30,R28
	mov R31,R29
	std z+14,R16
	std z+15,R17
	std z+16,R18
	std z+17,R19
	.dbline 80
;   z=u/U1*0xFF;
	ldi R16,<L26
	ldi R17,>L26
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R30,R28
	mov R31,R29
 ; stack offset 4
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L27
	ldi R17,>L27
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall div32fs
	rcall mpy32f
	rcall fp2int
	std y+21,R17
	std y+20,R16
	.dbline 81
;   temp1=OCR2;
	in R20,0x23
	.dbline 82
;   if(flage==1)                            //监控状态
	lds R24,_flage
	cpi R24,1
	brne L28
	.dbline 83
;   {Data[4]=0xD0;
	.dbline 83
	ldi R24,208
	sts _Data+4,R24
	.dbline 84
;    Data[5]=temp1;
	sts _Data+5,R20
	.dbline 85
;    Data[6]=y>>8;
	mov R2,R12
	mov R3,R13
	mov R2,R3
	clr R3
	sbrc R2,7
	com R3
	sts _Data+6,R2
	.dbline 86
;    Data[7]=y;
	sts _Data+7,R12
	.dbline 87
;    Putdata(Data);} 
	ldi R16,<_Data
	ldi R17,>_Data
	rcall _Putdata
	.dbline 87
L28:
	.dbline 88
;   temp1=temp1+z;
	mov R2,R20
	clr R3
	ldd R0,y+20
	ldd R1,y+21
	add R2,R0
	adc R3,R1
	mov R20,R2
	.dbline 89
;   if(temp1<=0)                           //结果小于0时输出0
	clr R2
	cp R2,R20
	brlo L34
	.dbline 90
;    temp1 = 0x00;
	clr R20
L34:
	.dbline 91
;   if(temp1>=0xF0)                        //结果大于0xF0时输出0xF0 
	cpi R20,240
	brlo L36
	.dbline 92
;    temp1 = 0xF0;
	ldi R20,240
L36:
	.dbline 93
;   OCR2=temp1;
	out 0x23,R20
	.dbline 94
;   Ek_2 = Ek_1;
	lds R2,_Ek_1
	lds R3,_Ek_1+1
	sts _Ek_2+1,R3
	sts _Ek_2,R2
	.dbline 95
;   Ek_1 = Ek;
	lds R2,_Ek
	lds R3,_Ek+1
	sts _Ek_1+1,R3
	sts _Ek_1,R2
	.dbline 96
;   TCNT1 = 0x0000;                          //计数器清零
	clr R2
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline -2
	.dbline 97
; }
L18:
	adiw R28,22
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r speed 14 I
	.dbsym l z 20 I
	.dbsym l u 14 D
	.dbsym r t 10 I
	.dbsym r y 12 I
	.dbsym r temp1 20 c
	.dbsym l k 2 A[12:3]D
	.dbsym l i 18 I
	.dbend
	.dbfunc e USARTInit _USARTInit fV
;       baudrate -> R16,R17
	.even
_USARTInit::
	.dbline -1
	.dbline 101
; 
; //***************************串口初始化函数************************//                   
; void USARTInit(int baudrate)    
; {UCR = (1<<TXEN)|(1<<RXCIE)|(1<<RXEN);    //设置收发使能,接受中断允许
	.dbline 101
	ldi R24,152
	out 0xa,R24
	.dbline 102
;   UBRR = baudrate;                        //设置波特率寄存器
	out 0x9,R16
	.dbline -2
	.dbline 103
; }
L38:
	.dbline 0 ; func end
	ret
	.dbsym r baudrate 16 I
	.dbend
	.dbfunc e Eepromdata _Eepromdata fV
	.even
_Eepromdata::
	sbiw R28,2
	.dbline -1
	.dbline 107
; 
; //***************************读EEPROM函数**************************//
; void Eepromdata(void)
; {if((adress==0x0000)||(adress==0x0004)||(adress==0x0008)) //地址判断
	.dbline 107
	lds R2,_adress
	lds R3,_adress+1
	tst R2
	brne X0
	tst R3
	breq L43
X0:
	lds R24,_adress
	lds R25,_adress+1
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L43
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brne L40
L43:
	.dbline 108
;  EEPROMReadBytes(adress,&Data[4],4);
	ldi R24,4
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_Data+4
	ldi R19,>_Data+4
	lds R16,_adress
	lds R17,_adress+1
	rcall _EEPROMReadBytes
	rjmp L41
L40:
	.dbline 110
;  else
;  EEPROMReadBytes(adress,&Data[6],2);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_Data+6
	ldi R19,>_Data+6
	lds R16,_adress
	lds R17,_adress+1
	rcall _EEPROMReadBytes
L41:
	.dbline 111
;  switch(adress)
	lds R24,_adress
	lds R25,_adress+1
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L50
	ldi R24,4
	ldi R25,0
	lds R2,_adress
	lds R3,_adress+1
	cp R24,R2
	cpc R25,R3
	brlt L61
L60:
	lds R2,_adress
	lds R3,_adress+1
	tst R2
	brne X1
	tst R3
	breq L48
X1:

⌨️ 快捷键说明

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