【合泰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

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学