本文主要是介绍【合泰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转换器的输入是模拟量而输出是数字量,输出的数字量表示的是输入的电压信号或电流信号与基准电压或基准电流相比所占的比例。简单来讲就是采集到的信号的值与参考电压的值的比例。
上诉公式中输出就是存在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采集及外部中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!