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

2023-11-22 17:10

本文主要是介绍【合泰ht66fx0单片机学习】2_AD采集及外部中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一、AD采集

include HT66F0185.incds	.section	'data';ADC采集
SADOL_buffer db ?
SADOH_buffer db ?cs	.section	at  000h	'code';ADC采集clr ADE         ; 禁用ADC中断mov a,63Hmov SADC1,a     ; 选择fSYS/8作为A/D时钟,关闭VBG电压及转换器电源电压VDD/4set ADCEN       ;使能A/D 转换器使能控制位mov a,01H       ; 配置ACEL以配置PIN AN0mov ACERL,amov a,20Hmov SADC0,a     ;启用和连接AN0通道到A/D转换器start_conversion:clr START       ; 启动脉冲高位脉冲启动转换set START       ; 复位 A/Dclr START       ; 开始 A/Dpolling_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.incds	.section	'data';ADC采集
SADOL_buffer db ?
SADOH_buffer db ?acc_stack db ?
status_stack db ?cs	.section	at  000h	'code'
;ADC采集中斷org 00hjmp INTorg 18hjmp ADC_ISRINT:	clr ADE ; disable ADC interruptmov a,63Hmov SADC1,a ; select fSYS/8 as A/D clock and switch off VBG voltageset ADCENmov a,01H ; setup ACERL to configure pin AN0mov ACERL,amov a,20Hmov SADC0,a ; enable and connect AN0 channel to A/D converterStart_conversion:clr START ; high pulse on START bit to initiate conversionset START ; reset A/Dclr START ; start A/Dclr ADF ; clear ADC interrupt request flagset ADE ; enable ADC interruptset EMI ; enable global interruptJMP $ADC_ISR: ; ADC interrupt service routinemov acc_stack,a ; save ACC to user defined memorymov a,STATUSmov status_stack,a ; save STATUS to user defined memorymov a, SADOL ; read low byte conversion result valuemov SADOL_buffer,a ; save result to user defined registermov a, SADOH ; read high byte conversion result valuemov SADOH_buffer,a ; save result to user defined registerEXIT_INT_ISR:mov a,status_stackmov STATUS,a ; restore STATUS from user defined memorymov a,acc_stack ; restore ACC from user defined memoryreti

附一段使用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.incds	.section	'data';外部中断
flag db ?
flag1 db ?cs	.section	at  000h	'code';外部中断ORG	00H                		JMP	INITORG	004H		        ;HT66FX0 EXT. INTERRUPT VECTOR,外部中斷口INIT0地址JMP	ISR_EXTINT0
INIT:		CLR     ACERL		        ;AD採集口優先級較高,清除之後才可正常使用外部中斷口MOV     A,1MOV     flag,ASET	PBPU.0			;使PB0上拉SET	PBC.0			;配置PB0(IN0)作为输入。MOV	A,00000010B		;选择It0下降沿触发器MOV	INTEG,ASET	INT0E		        ;启用外部中断0SET	EMI			;启用全局中断MAIN:			MOV     A,5MOV     flag1,AJMP     MAIN
ISR_EXTINT0:INC     flagCLR	INT0F		         ;CLEAR EXT. INT CAUSED BY BOUNCING 清除中断标志位RETI

 

这篇关于【合泰ht66fx0单片机学习】2_AD采集及外部中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411647

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示