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

📄 main.s

📁 增量式模糊PID控制方法AVR单片机mega16
💻 S
字号:
	.module main.c
	.area data(ram, con, rel)
_DFC_tbl::
	.blkb 2
	.area idata
	.byte 5,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 5,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,5
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 6
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 5,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 5,5
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 4
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 4,4
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,255
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 6,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,3
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 254,253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 6,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,0
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 254
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 254,253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 6,5
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,251
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 250
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 251,3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,2
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 250,251
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 3
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 3,1
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 250,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 1,1
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,254
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 254,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 251,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,255
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 254
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 250,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 255,255
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 254,253
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 253
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 253,251
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 250,251
	.area data(ram, con, rel)
	.blkb 9
	.area idata
	.byte 0,0,0,0,0,0,0,0,0
	.area data(ram, con, rel)
	.blkb 13
	.area idata
	.word 0,0,0,0,0
	.byte 0,0,0
	.area data(ram, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c
	.dbsym e DFC_tbl _DFC_tbl A[143:11:13]c
	.area text(rom, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c
	.dbfunc e GetDeltFuzzyValue _GetDeltFuzzyValue fI
;              j -> R20
;              i -> R22
;        delt_ei -> R22,R23
;             ei -> R20,R21
	.even
_GetDeltFuzzyValue::
	xcall push_gset2
	movw R22,R18
	movw R20,R16
	.dbline -1
	.dbline 57
; #define ENABLE_BIT_DEFINITIONS
; 
; #include "includes.h"
; //#define Vref 25600
; 
; 
; //#define Vref 50000
; void init_adc(void);
; void WDR(void);
; void WDT_init(void);
; 
; //unsigned char adc_mux = 0x01;  //通道选择
; 
; unsigned char RSend;
; unsigned char RS_buf[10];
; unsigned char RS_flag;
; 
; unsigned int SerPoint; //设定目标,应用时实际上取该值的1/10,出现温度的0.x度
; int ei;                //最近1次的偏差,ei = stPID.SetPoint-stPID.T_adc_data[2]
; int LastError;         //SetPoint-T_adc_data[1]
; int delt_ei;           //偏差的变化:delt_ei = PID.LastError-ei
; int T_adc_data[3];     //近3次的测量值,T_adc_data[2]为最近的一次
; int ui;                //ui:输出
; int delt_ui;           //delt_ei为增量式增量输出
; /*
; char DFC_tbl[11][13]={
; //-12,-10,-8,-6,-4,-2,0,+2,+4,+6,+8,+10,+12
;  -5,-5,-4,-4,-3,-3,-3,-3,-3,-2,-2,-1, 0,
;  -5,-5,-4,-3,-2,-2,-2,-2,-2,-2,-1, 0, 0,
; -5,-4,-3,-2,-1,-1,-1,-1,-2,-1, 0, 0, 0,
; -4,-3,-2,-2,-1, 0, 0,-1,-1,-1, 0, 1, 2,
; -3,-2,-1,-1,-1, 0, 0, 0, 1, 1, 2, 3, 4,
;  -3,-2,-1,-1,-1, 0, 0, 1, 1, 1, 2, 3, 4,
; -2,-2,-1,-1,-1, 0, 0, 2, 2, 2, 2, 3, 4,
;  0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5,
;  0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 5,
;  0, 0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5,
;  0, 0, 0, 0, 2, 2, 3, 3, 4, 5, 5, 5, 5
; };
; */
; char DFC_tbl[11][13]={
; /*-12,-10,-8,-6,-4,-2,0,+2,+4,+6,+8,+10,+12*/
; /*-5*/  5, 5, 5, 3, 3, 3, 1, 1, 0, 0, 0,
; /*-4*/  5, 6, 5, 3, 3, 3, 1, 1, 0, 0, 0,
; /*-3*/  5, 5, 5, 4, 4, 4, 1, 1, 0,-1,-1,
; /*-2*/  5, 6, 5, 3, 3, 1, 0, 0,-2,-3,-3, 
; /*-1*/  5, 6, 5, 3, 3, 1, 0,-2,-2,-3,-3, 
; /*0*/   5, 6, 5, 3, 1, 0, 0,-3,-5,-6,-5, 
; /*1*/   3, 3, 2, 1, 0,-1,-3,-3,-5,-6,-5, 
; /*2*/   3, 3, 1, 0, 0,-1,-3,-3,-5,-6,-5, 
; /*3*/   1, 1, 0, 0, 0,-1,-2,-2,-5,-5,-5, 
; /*4*/   0, 0,-1,-1,-2,-3,-3,-3,-5,-6,-5, 
; /*5*/   0, 0,-1,-1,-2,-3,-3,-3,-5,-6,-5, 
; };
; 
; int GetDeltFuzzyValue(int ei,int delt_ei)
; {
	.dbline 60
;   unsigned char i,j;
;   #define delt_M 20
;   if(ei > delt_M)
	ldi R24,20
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brge L2
	.dbline 61
;     ei = delt_M;
	ldi R20,20
	ldi R21,0
L2:
	.dbline 62
;   if(ei<-delt_M)
	cpi R20,236
	ldi R30,255
	cpc R21,R30
	brge L4
	.dbline 63
;     ei = -delt_M;	
	ldi R20,-20
	ldi R21,-1
L4:
	.dbline 64
;   i = delt_ei + 5;
	subi R22,251  ; offset = 5
	sbci R23,255
	.dbline 65
;   j = 6 + ei*6/delt_M;
	ldi R16,6
	ldi R17,0
	movw R18,R20
	xcall empy16s
	ldi R18,20
	ldi R19,0
	xcall div16s
	mov R20,R16
	subi R20,250  ; offset = 6
	sbci R21,255
	.dbline 66
;   return DFC_tbl[i][j]; 
	ldi R24,13
	mul R24,R22
	movw R2,R0
	ldi R24,<_DFC_tbl
	ldi R25,>_DFC_tbl
	add R2,R24
	adc R3,R25
	mov R30,R20
	clr R31
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	clr R17
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r i 22 c
	.dbsym r delt_ei 22 I
	.dbsym r ei 20 I
	.dbend
	.dbfunc e Delt_FuzzyCtrl _Delt_FuzzyCtrl fV
	.even
_Delt_FuzzyCtrl::
	.dbline -1
	.dbline 83
; }
; /*
; int GetDeltFuzzyValue(int ei,int delt_ei)
; {
;   unsigned char i,j;
;   #define delt_M 20
;   if(ei > delt_M)
;     ei = delt_M;
;   if(ei<-delt_M)
;     ei = -delt_M;	
;   i = delt_ei + 5;
;   j = 5 + ei*5/delt_M;
;   return DFC_tbl[i][j]; 
; }
; */
; void Delt_FuzzyCtrl(void)
; {
	.dbline 85
;   #define delt_Um 50
;   LastError = ei;//刷新近2次偏差
	lds R2,_ei
	lds R3,_ei+1
	sts _LastError+1,R3
	sts _LastError,R2
	.dbline 86
;   ei = ADC-SerPoint;//ei = SerPoint - ADC;//ei = SerPoint - T_adc_data[2];
	lds R2,_SerPoint
	lds R3,_SerPoint+1
	in R4,0x4
	in R5,0x5
	sub R4,R2
	sbc R5,R3
	sts _ei+1,R5
	sts _ei,R4
	.dbline 87
;   delt_ei = LastError-ei;//刷新偏差的变化
	movw R2,R4
	lds R4,_LastError
	lds R5,_LastError+1
	sub R4,R2
	sbc R5,R3
	sts _delt_ei+1,R5
	sts _delt_ei,R4
	.dbline 88
;   if(delt_ei > 5)
	ldi R24,5
	ldi R25,0
	cp R24,R4
	cpc R25,R5
	brge L7
	.dbline 89
;     delt_ei = 5;
	sts _delt_ei+1,R25
	sts _delt_ei,R24
L7:
	.dbline 90
;   if(delt_ei < -5)
	lds R24,_delt_ei
	lds R25,_delt_ei+1
	cpi R24,251
	ldi R30,255
	cpc R25,R30
	brge L9
	.dbline 91
;     delt_ei = -5;
	ldi R24,-5
	ldi R25,-1
	sts _delt_ei+1,R25
	sts _delt_ei,R24
L9:
	.dbline 92
;   delt_ui = GetDeltFuzzyValue(ei,delt_ei);//采用模糊控制模型
	lds R18,_delt_ei
	lds R19,_delt_ei+1
	lds R16,_ei
	lds R17,_ei+1
	xcall _GetDeltFuzzyValue
	sts _delt_ui+1,R17
	sts _delt_ui,R16
	.dbline 94
;   //delt_ui = delt_ui; //delt_ui = delt_ui*2;                    //其中2是比例因子K
;   if(delt_ui > delt_Um)
	ldi R24,50
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brge L11
	.dbline 95
;     delt_ui = delt_Um;
	sts _delt_ui+1,R25
	sts _delt_ui,R24
L11:
	.dbline 96
;   if(delt_ui < -delt_Um)//if(delt_ui < -delt_Um)
	lds R24,_delt_ui
	lds R25,_delt_ui+1
	cpi R24,206
	ldi R30,255
	cpc R25,R30
	brge L13
	.dbline 97
;     delt_ui = -delt_Um;//delt_ui = -delt_Um;
	ldi R24,-50
	ldi R25,-1
	sts _delt_ui+1,R25
	sts _delt_ui,R24
L13:
	.dbline 98
	lds R2,_delt_ui
	lds R3,_delt_ui+1
	lds R4,_ui
	lds R5,_ui+1
	add R4,R2
	adc R5,R3
	sts _ui+1,R5
	sts _ui,R4
	.dbline 99
	movw R24,R4
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brge L15
	.dbline 100
	ldi R24,1
	ldi R25,0
	sts _ui+1,R25
	sts _ui,R24
L15:
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;          count -> <dead>
;              j -> y+0
;             RS -> R20,R21
;          value -> R20,R21
;           test -> R20,R21
	.even
_main::
	sbiw R28,4
	.dbline -1
	.dbline 103
;   ui += delt_ui;
;   if(ui<1)
;     ui = 1;
; }
; void main(void)
; {       
	.dbline 106
;     float j;  
;     int count;
;     unsigned char *test = "The Voltage is: ";
	ldi R20,<L18
	ldi R21,>L18
	.dbline 107
;     unsigned char *value = "0.000 V";	
	ldi R20,<L19
	ldi R21,>L19
	.dbline 109
;     unsigned char *RS;
;     RS = RS_buf;
	ldi R20,<_RS_buf
	ldi R21,>_RS_buf
	.dbline 110
;     RS_flag = 0;
	clr R2
	sts _RS_flag,R2
	.dbline 111
;     delay_nms(1);  
	ldi R16,1
	ldi R17,0
	xcall _delay_nms
	.dbline 112
; 	SerPoint=500;  
	ldi R24,500
	ldi R25,1
	sts _SerPoint+1,R25
	sts _SerPoint,R24
	.dbline 114
;     //dataport=0xff;
;     OSCCAL=0Xab;//系统时钟校准,不同的芯片和不的频率,
	ldi R24,171
	out 0x31,R24
	.dbline 115
;     init_adc();	
	xcall _init_adc
	xjmp L21
L20:
	.dbline 163
	.dbline 164
	xcall _Delt_FuzzyCtrl
	.dbline 165
	.dbline 166
L21:
	.dbline 162
	xjmp L20
X0:
	.dbline -2
L17:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l count 1 I
	.dbsym l j 0 D
	.dbsym r RS 20 pc
	.dbsym r value 20 pc
	.dbsym r test 20 pc
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c
_delt_ui::
	.blkb 2
	.dbsym e delt_ui _delt_ui I
_ui::
	.blkb 2
	.dbsym e ui _ui I
_T_adc_data::
	.blkb 6
	.dbsym e T_adc_data _T_adc_data A[6:3]I
_delt_ei::
	.blkb 2
	.dbsym e delt_ei _delt_ei I
_LastError::
	.blkb 2
	.dbsym e LastError _LastError I
_ei::
	.blkb 2
	.dbsym e ei _ei I
_SerPoint::
	.blkb 2
	.dbsym e SerPoint _SerPoint i
_RS_flag::
	.blkb 1
	.dbsym e RS_flag _RS_flag c
_RS_buf::
	.blkb 10
	.dbsym e RS_buf _RS_buf A[10:10]c
_RSend::
	.blkb 1
	.dbsym e RSend _RSend c
	.area data(ram, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c
L19:
	.blkb 8
	.area idata
	.byte 48,46,48,48,48,32,'V,0
	.area data(ram, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c
L18:
	.blkb 17
	.area idata
	.byte 'T,'h,'e,32,'V,'o,'l,'t,'a,'g,'e,32,'i,'s,58,32
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\仿真\增量式模糊控制\main.c

⌨️ 快捷键说明

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