【合泰ht66fx0单片机学习】2_AD采集及外部中断

 

一、AD采集

include HT66F0185.inc

ds	.section	'data'

;ADC采集
SADOL_buffer db ?
SADOH_buffer db ?


cs	.section	at  000h	'code'

;ADC采集
		clr ADE         ; 禁用ADC中断
		mov a,63H
		mov SADC1,a     ; 选择fSYS/8作为A/D时钟,关闭VBG电压及转换器电源电压VDD/4
		set ADCEN       ;使能A/D 转换器使能控制位
		mov a,01H       ; 配置ACEL以配置PIN AN0
		mov ACERL,a
		mov a,20H
		mov SADC0,a     ;启用和连接AN0通道到A/D转换器
		
		start_conversion:
		clr START       ; 启动脉冲高位脉冲启动转换
		set START       ; 复位 A/D
		clr START       ; 开始 A/D
		
		polling_EOC:
		sz ADBZ         ; 轮询SADC0寄存器ADBZ位检测A/D结束
		; 转换
		jmp polling_EOC ; 继续轮询
		
		mov a,SADOL     ; 读取低字节转换结果值
		mov SADOL_buffer,a ; 将结果保存到用户定义的寄存器
		mov a,SADOH     ; 读取高位字节转换结果值
		mov SADOH_buffer,a ;将结果保存到用户定义的寄存器
		
		jmp start_conversion; 开始下一个A/D转换
		
		JMP $

官方资料:SADC0 寄存器中的SACS2~SACS0 位用于选择哪个外部模拟输入通道被连接到内部A/D 转换器。SADC1 寄存器中的SAINS2~SAINS0 位用于选择外部模拟输入通道或内部模拟信号被连接到内部A/D 转换器。若SAINS2~SAINS0 位为“000”或“100”,则选择转换外部模拟输入信号,具体通道编号由SACS2~SACS0 位决定。若SAINS2~SAINS0 位为“000”和“100”以外的其它值,则选择转换内部模拟信号,这些信号可以来自A/D 转换器电源VDD 或内部参考电压VR 的分压,分压比为1、1/2 或1/4。当选择内部模拟信号时,外部输入通道会自动关闭以避免信号冲突。

程序解读:AD采集配置3个寄存器SADC0、SADC1、SADC2和1个设置AD输入引脚的ACERL 寄存器,最后从存AD采集数据的SADOL,SADOH寄存器中读取数据就好了。

SADC1寄存器配置 A/D 输入信号选择位和A/D 时钟源选择位,即要采集的信号来自外部还是内部,时钟源是几分频。

配置时钟源时注意:A/D 转换器的时钟源为系统时钟fSYS 或其分频,而分频系数由SADC1 寄存器中的SACKS2~SACKS0 位决定。虽然A/D 时钟源是由系统时钟fSYS 和SACKS2~SACKS0 位决定,但可选择的最大A/D 时钟源则有一些限制。由于允许的A/D 时钟周期tADCK 的范围为0.5μs~10μs,所以选择系统时钟速度时就必须小心。如果系统时钟速度为8MHz 时,SACKS2~SACKS0 位不能设为“000”、“001”或“111”。必须保证设置的A/D转换时钟周期不小于时钟周期的最小值,否则将会产生不准确的A/D 转换值。

SADC0寄存器配置 当选择采集信号是外部的时候,配置启用(ADCEN:A/D 转换器使能控制位置1)和连接哪个通道口;外加一个ADRFS:A/D 转换数据格式选择位 是选存数据的俩种方式,没差,一样的会读就好了,都是以D0位最低位开始读,然后其他口一般给0,因为会单独拿出来配。

SADC2寄存器配置 是为了配置参考电压的,有需要就配,无特别需要,不需要配,寄存器默认全0,即VDD就是参考电压。

参考电压官方资料:A/D 转换器参考电压来自正电源电压引脚VDD、外部参考源引脚VREFI 或内部Bandgap 参考源,所选的参考电压源除了来自VDD 的以外,都可通过可编程增益放大器进行放大,PGA 增益可以为1、2、3 或4,可通过SADC2 寄存器中的SAVRS3~SAVRS0 位及相关引脚共用功能选择位来选择。注意,所选的参考电压将会输出到VREF 引脚。由于VREFI 和VREF 引脚都与其它功能共用,当选择VREFI 或VREF 参考电压时,需合理设置相关引脚功能选择位选择VREFI 或VREF 引脚功能且除能其它共用引脚功能。

简单来讲就是参考电压除了VDD是不变的,配置了其他参考电压都可以进行放大改变,那参考电压有什么用呢?

参考电压就是拿来计算AD采集的值的大小的。A/D转换器的输入是模拟量而输出是数字量,输出的数字量表示的是输入的电压信号或电流信号与基准电压或基准电流相比所占的比例。简单来讲就是采集到的信号的值与参考电压的值的比例。输出= 2^{n}xGxA{m}/V{ref}

上诉公式中输出就是存在SADOL,SADOH寄存器中采集到的数据,公式换算一下:(Vref就是参考电压)

该系列单片机含有一组12 位的A/D 转换器,它们转换的最大值可达FFFH。由于模拟输入最大值等于VREF 的电压值,因此每一位可表示VREF/4096 的模拟输入值。
                                                                                        1 LSB=Vref÷4096
通过下面的等式可估算A/D 转换器输入电压值:
                                                                   A/D 输入电压=A/D 数字输出值×Vref÷4096

程序流程步骤:

● 步骤1
配置SADC1 寄存器选择所需的A/D 转换时钟和连接至内部A/D 转换器的信号。
● 步骤2
将SADC0 寄存器中的ADCEN 位置高使能A/D。
● 步骤3
配置SADC0 寄存器选择哪个外部通道接至A/D 转换器和ADRFS 位选择A/D 转换器输出数据格式,(若选择A/D 输入信号来自内部模拟信号,无论SACS2~SACS0 为何值,外部通道输入都会自动断开。)接着配置ACERL设置相关的引脚共用功能控制位将该引脚规划为A/D 输入引脚。注意:A/D输入引脚优先级较高,若该引脚不用作A/D输入引脚时,应置零关闭,否则可能影响正常IO口以及其他功能使用。
● 步骤4
配置SADC2选择参考电压。(不配就是VDD)
● 步骤5
如果要使用中断,则中断控制寄存器需要正确地设置,以确保A/D 中断功能是激活的。总中断控制位EMI 需要置位为“1”,以及A/D 转换器中断位ADE 也需要置位为“1”。
● 步骤6
现在可以通过设置SADC0 寄存器中的START 位从“0”到“1”再回到“0”,开始模数转换的过程。
● 步骤7
如果A/D 转换正在进行中,ADBZ 位会被置为逻辑高。A/D 转换完成后,ADBZ位会被置为逻辑低,并可从SADOH和SADOL寄存器中读取输出数据。
注:若使用轮询SADC0 寄存器中ADBZ 位的状态的方法来检查转换过程是否结束时,则中断使能的步骤可以省略。

include HT66F0185.inc

ds	.section	'data'

;ADC采集
SADOL_buffer db ?
SADOH_buffer db ?

acc_stack db ?
status_stack db ?


cs	.section	at  000h	'code'
;ADC采集中斷
		org 00h
		jmp INT
		org 18h
		jmp ADC_ISR
		
		INT:	
		clr ADE ; disable ADC interrupt
		mov a,63H
		mov SADC1,a ; select fSYS/8 as A/D clock and switch off VBG voltage
		set ADCEN
		mov a,01H ; setup ACERL to configure pin AN0
		mov ACERL,a
		mov a,20H
		mov SADC0,a ; enable and connect AN0 channel to A/D converter
		
		Start_conversion:
		clr START ; high pulse on START bit to initiate conversion
		set START ; reset A/D
		clr START ; start A/D

		clr ADF ; clear ADC interrupt request flag
		set ADE ; enable ADC interrupt
		set EMI ; enable global interrupt
		
		JMP $
		


		ADC_ISR: ; ADC interrupt service routine
		mov acc_stack,a ; save ACC to user defined memory
		mov a,STATUS
		mov status_stack,a ; save STATUS to user defined memory
		
		mov a, SADOL ; read low byte conversion result value
		mov SADOL_buffer,a ; save result to user defined register
		mov a, SADOH ; read high byte conversion result value
		mov SADOH_buffer,a ; save result to user defined register
		
		EXIT_INT_ISR:
		mov a,status_stack
		mov STATUS,a ; restore STATUS from user defined memory
		mov a,acc_stack ; restore ACC from user defined memory
		reti

附一段使用AD采集中断的方式来检测转换结束的程序。第一种方法是通过轮询ADBZ状态检测AD采集是否完成,AD采集完成后ADBZ会置0,同样会置位中断控制寄存器内相应的A/D 中断请求标志位。

要使用AD采集中断只需,        clr ADF ; 清除ADC中断请求标志
                                                set ADE ; 允许ADC中断
                                                 set EMI ; 启用全局中断

中断请求标志位ADF置1后,程序会跳到相应的中断向量地址,AD采集中断对应的是18h,中断的用法一般为置高相应中断及总中断,当中断标志位置1后跳转到相应地址(ROM程序存储器),此地址一般放跳转函数“JMP 中断名称”,程序就会跳到对应子函数执行中断,ORG 18h                                                                                                                                                                                            JMP ADC_ISR 此指令将存放在18h

                                  

                                 mov acc_stack,a ; 将ACC保存到用户定义的内存
                                 mov a,STATUS
                                 mov status_stack,a ; 将状态保存到用户定义的内存

这三句是为了保存ACC和STACK状态寄存器的值,一般进中断保存这些值可以防止中断里的操作改变了这些值影响到主程序,中断结束时在把值存回去然后RETI就可以返回主程序了。(RET和RETI区别在于RETI返回主程序后会把EMI置1,中断下次可以继续进行,RET不会)


二、外部中断

include HT66F0185.inc

ds	.section	'data'

;外部中断
flag db ?
flag1 db ?

cs	.section	at  000h	'code'

;外部中断
          	ORG	00H                		
		JMP	INIT
		ORG	004H		        ;HT66FX0 EXT. INTERRUPT VECTOR,外部中斷口INIT0地址
		JMP	ISR_EXTINT0
INIT:		
		CLR     ACERL		        ;AD採集口優先級較高,清除之後才可正常使用外部中斷口
		MOV     A,1
		MOV     flag,A
		SET	PBPU.0			;使PB0上拉
		SET	PBC.0			;配置PB0(IN0)作为输入。
		MOV	A,00000010B		;选择It0下降沿触发器
		MOV	INTEG,A
		SET	INT0E		        ;启用外部中断0
		SET	EMI			;启用全局中断
		
MAIN:			
		MOV     A,5
		MOV     flag1,A
		JMP     MAIN
ISR_EXTINT0:
		INC     flag
		CLR	INT0F		         ;CLEAR EXT. INT CAUSED BY BOUNCING 清除中断标志位
		RETI

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值