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

📄 adc.s

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 S
字号:
	.module ADC.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ADC\ADC.c
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 30
; /*****************************************************************
;  *  文件名:      ADC.c
;  *  版本号:      
;  *  创作日期:    2005.7.7
;  *  作者:        fengzm
;  *  功能说明:    可采集7个AD通道的值,使用了RC滤波;
;  *  其它说明:    使用AVR单片机Atmaga48, 晶振:8Mhz
;                   调用ADC文件的时候只需要输入通道号即可,如ADC(7);
;  *****************************************************************/
;  
; 
; /*****************************************************************
; 
;  *   修改日期:   2005.7.8  
;  *   修改人:	  wangzq
;  *   修改原因:   优化代码
;                   定时器0溢出触发A/D转换
;                   修改g_AdcNum改变通道号,默认值0;
; 				  g_ValueAdc返回A/D转换后的滤波值;
; 				  g_AdcEnd 0xff表示当前返回值有效;
; *******************************************************************/
; 
; 
; //包含文件
; #include "ADC.h"
; 
; // ADC initialize
; // Conversion time: 13uS,CLOCK/8;
; void adc_init(void)
; {
	.dbline 31
;     ADCSRA = 0x00;  //disable adc
	clr R2
	ldi R30,122
	ldi R31,0
	std z+0,R2
	.dbline 32
;     ADMUX  = 0x00;  //select adc input 0
	ldi R30,124
	std z+0,R2
	.dbline 33
;     ACSR   = 0x80;  //not need the compare function
	ldi R24,128
	out 0x30,R24
	.dbline 34
;     ADCSRB = 0x04;  //定时器0溢出触发转换
	ldi R24,4
	ldi R30,123
	std z+0,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 42
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ADC\ADC.c
	.dbfunc e adc_isr _adc_isr fV
;              j -> y+0
	.even
_adc_isr::
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	rcall push_gset2
	sbiw R28,4
	.dbline -1
	.dbline 39
; }
; 
; #pragma interrupt_handler adc_isr:22
; void adc_isr(void)
; {
	.dbline 42
; 	dword j;
; 	
; 	j =ADCL;            	//Read 8 low bits first (impo
	ldi R30,120
	ldi R31,0
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	.dbline 43
;     j |=(int)ADCH << 8;  	//read 2 high bits and shift into topbyte
	ldi R30,121
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	ldd R6,y+0
	ldd R7,y+1
	ldd R8,y+2
	ldd R9,y+3
	or R6,R2
	or R7,R3
	or R8,R4
	or R9,R5
	std y+0,R6
	std y+1,R7
	std y+2,R8
	std y+3,R9
	.dbline 45
;     
; 	j *= ADCK;               //RC filtering
	ldd R2,y+0
	ldd R3,y+1
	ldd R4,y+2
	ldd R5,y+3
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	rcall empy32u
	std y+0,R16
	std y+1,R17
	std y+2,R18
	std y+3,R19
	.dbline 46
; 	j += (10-ADCK) * g_ValueAdc;
	lds R18,_g_ValueAdc
	lds R19,_g_ValueAdc+1
	ldi R16,8
	ldi R17,0
	rcall empy16s
	movw R2,R16
	clr R4
	clr R5
	ldd R6,y+0
	ldd R7,y+1
	ldd R8,y+2
	ldd R9,y+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std y+0,R6
	std y+1,R7
	std y+2,R8
	std y+3,R9
	.dbline 47
; 	j /=10;
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R16,y+0
	ldd R17,y+1
	ldd R18,y+2
	ldd R19,y+3
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	rcall div32u
	std y+0,R16
	std y+1,R17
	std y+2,R18
	std y+3,R19
	.dbline 48
; 	g_ValueAdc = j;
	ldd R2,y+0
	ldd R3,y+1
	sts _g_ValueAdc+1,R3
	sts _g_ValueAdc,R2
	.dbline 50
; 	
; 	g_AdcEnd  = 0xff;            	//set the flag of end
	ldi R24,255
	sts _g_AdcEnd,R24
	.dbline 51
;     ADMUX  = g_AdcNum;				//通道选择
	lds R2,_g_AdcNum
	ldi R30,124
	ldi R31,0
	std z+0,R2
	.dbline -2
L2:
	adiw R28,4
	rcall pop_gset2
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym l j 0 l
	.dbend
	.dbfunc e AdcPedal _AdcPedal fi
;            get -> y+0
;              i -> R12
;           adcp -> R10,R11
	.even
_AdcPedal::
	rcall push_gset4
	movw R10,R16
	sbiw R28,4
	.dbline -1
	.dbline 62
; }
; 
; //************************************************
; //踏板信号转换为对应的控制值
; //前踩:200-6000  对应10-300
; //待机:位7:1  位6:0
; //后一:高位 11
; //后二:高位 01
; //************************************************
; word AdcPedal(word adcp)
; {
	.dbline 66
; 	byte i;
; 	dword get;
; 	
; 	i = 0;
	clr R12
	.dbline 68
; 		
; 	if (adcp <= PEDAL_STOP)
	ldi R24,470
	ldi R25,1
	cp R24,R10
	cpc R25,R11
	brlo L4
	.dbline 69
; 	{
	.dbline 70
; 		i = 0x3;
	ldi R24,3
	mov R12,R24
	.dbline 71
; 		adcp = 0;
	clr R10
	clr R11
	.dbline 72
; 	}
L4:
	.dbline 74
; 	
; 	if ((adcp>PEDAL_STOP) && (adcp<PEDAL_STARTL))
	ldi R24,470
	ldi R25,1
	cp R24,R10
	cpc R25,R11
	brsh L6
	movw R24,R10
	cpi R24,20
	ldi R30,2
	cpc R25,R30
	brsh L6
	.dbline 75
; 	{
	.dbline 76
; 		i = 0x2;
	ldi R24,2
	mov R12,R24
	.dbline 77
; 		adcp = 0;
	clr R10
	clr R11
	.dbline 78
; 	}
L6:
	.dbline 80
; 	
; 	if (adcp >= PEDAL_STARTL)
	movw R24,R10
	cpi R24,20
	ldi R30,2
	cpc R25,R30
	brsh X0
	rjmp L8
X0:
	.dbline 81
; 	{
	.dbline 82
; 		if (adcp > PEDAL_STARTH)
	ldi R24,941
	ldi R25,3
	cp R24,R10
	cpc R25,R11
	brsh L10
	.dbline 83
; 		{
	.dbline 84
; 			adcp = PEDAL_STARTH;
	movw R10,R24
	.dbline 85
; 		}
L10:
	.dbline 86
; 		get = adcp - PEDAL_STARTL;
	movw R24,R10
	subi R24,20
	sbci R25,2
	movw R2,R24
	clr R4
	clr R5
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	.dbline 87
; 		get *= 5800;								//(6000-200)/20;
	ldd R2,y+0
	ldd R3,y+1
	ldd R4,y+2
	ldd R5,y+3
	ldi R20,168
	ldi R21,22
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	rcall empy32u
	std y+0,R16
	std y+1,R17
	std y+2,R18
	std y+3,R19
	.dbline 88
; 		get /= (PEDAL_STARTH - PEDAL_STARTL);
	ldi R20,153
	ldi R21,1
	ldi R22,0
	ldi R23,0
	ldd R16,y+0
	ldd R17,y+1
	ldd R18,y+2
	ldd R19,y+3
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	rcall div32u
	std y+0,R16
	std y+1,R17
	std y+2,R18
	std y+3,R19
	.dbline 89
; 		get += 200;									//200/20;
	ldi R20,200
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R2,y+0
	ldd R3,y+1
	ldd R4,y+2
	ldd R5,y+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	.dbline 90
; 		adcp = get;
	ldd R10,y+0
	ldd R11,y+1
	.dbline 91
; 	}
L8:
	.dbline 93
; 	
; 	if (i == 3)				//后一状态
	mov R24,R12
	cpi R24,3
	brne L12
	.dbline 94
; 	{
	.dbline 95
; 	adcp |= 0xC000;
	movw R24,R10
	ori R25,192
	movw R10,R24
	.dbline 96
; 	}
L12:
	.dbline 97
; 	if (i == 2)				//待机状态
	mov R24,R12
	cpi R24,2
	brne L14
	.dbline 98
; 	{
	.dbline 99
; 	adcp |= 0x8000;
	movw R24,R10
	ori R25,128
	movw R10,R24
	.dbline 100
; 	}
L14:
	.dbline 102
; 	
; 	return adcp;				//返回脚踏板转速值
	movw R16,R10
	.dbline -2
L3:
	adiw R28,4
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l get 0 l
	.dbsym r i 12 c
	.dbsym r adcp 10 i
	.dbend

⌨️ 快捷键说明

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