STM8 ADC转换模式-------带缓存的连续模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。
连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ADON 位来启动的。
● 如果缓存功能被使能(DBUF=1),那么某个选定满数据缓存,当缓存被填满时,EOC(转换结束)标志被置位,如果EOCIE位已被置位,则会产生一个中断,然后一个新的转换自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
如果要停止连续转换,可以复位清零CONT位来停止转换或者复位清零ADON位来关闭ADC的电
源。
使用连续模式带缓存功能查询方式读取数据代码如下:
#include "adc.h"
#include "main.h"u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 电流PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
/*
ch 为单片机ADC通道
通过置位ADC_CR1寄存器的ADON位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。
为了启动转换必须第二次使用写指令来置位ADON位。
在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。
转换完成后,转换数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断
ADC输入通道初始化入口参数表示通道选择
*/
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换ADC_CR1 |= ( 1 << 1 ); //开启连续转换模式ADC_CSR = ch; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01; //使能ADC并开始转换//ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能ADC_CR3 |= ( 1 << 7 ); //数据缓存使能for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}u16 databuf[8] = {0};
//采集PD2电压值
u16 ReadVol_CH3( void )
{u16 voltage = 0;while( ( ADC_CSR & 0x80 ) == 0 ); //等待转换结束if( ADC_CSR & 0x80 ){ADC_CSR &= 0x7F;/*使能缓存模式后,数据会存储在 ADC_DB0R ---- ADC_DB7R 寄存器中如果使能了扫描模式那么这几个寄存器存储的就是对应通道的数据如果没有使能扫描模式,那么这几个通道就存储的是连续转换的结果这里没有使用扫描模式,所以缓存器中存储的都是当前通道连续读取的数据*/DATAH = ADC_DB0RH; // 读出ADC结果的高8位DATAL = ADC_DB0RL; // 读出ADC结果的低8位voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024databuf[0] = voltage;DATAH = ADC_DB1RH;DATAL = ADC_DB1RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[1] = voltage;DATAH = ADC_DB2RH;DATAL = ADC_DB2RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[2] = voltage;DATAH = ADC_DB3RH;DATAL = ADC_DB3RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[3] = voltage;DATAH = ADC_DB4RH;DATAL = ADC_DB4RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[4] = voltage;DATAH = ADC_DB5RH;DATAL = ADC_DB5RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[5] = voltage;DATAH = ADC_DB6RH;DATAL = ADC_DB6RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[6] = voltage;DATAH = ADC_DB7RH;DATAL = ADC_DB7RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[7] = voltage;}return voltage;
}
连续模式带缓存功能中断方式读取数据代码如下:
#include "adc.h"
#include "main.h"u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 电流PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
/*
ch 为单片机ADC通道
通过置位ADC_CR1寄存器的ADON位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。
为了启动转换必须第二次使用写指令来置位ADON位。
在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。
转换完成后,转换数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断
ADC输入通道初始化入口参数表示通道选择
*/
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换ADC_CR1 |= ( 1 << 1 ); //开启连续转换模式ADC_CSR = ch; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01; //使能ADC并开始转换ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能ADC_CR3 |= ( 1 << 7 ); //数据缓存使能for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}u16 databuf[8] = {0};
//采集PD2电压值
u16 ReadVol_CH3( void )
{u16 voltage = 0;if( ADC_flag ){ADC_flag = 0;/*使能缓存模式后,数据会存储在 ADC_DB0R ---- ADC_DB7R 寄存器中如果使能了扫描模式那么这几个寄存器存储的就是对应通道的数据如果没有使能扫描模式,那么这几个通道就存储的是连续转换的结果这里没有使用扫描模式,所以缓存器中存储的都是当前通道连续读取的数据*/DATAH = ADC_DB0RH; // 读出ADC结果的高8位DATAL = ADC_DB0RL; // 读出ADC结果的低8位voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024databuf[0] = voltage;DATAH = ADC_DB1RH;DATAL = ADC_DB1RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[1] = voltage;DATAH = ADC_DB2RH;DATAL = ADC_DB2RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[2] = voltage;DATAH = ADC_DB3RH;DATAL = ADC_DB3RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[3] = voltage;DATAH = ADC_DB4RH;DATAL = ADC_DB4RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[4] = voltage;DATAH = ADC_DB5RH;DATAL = ADC_DB5RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[5] = voltage;DATAH = ADC_DB6RH;DATAL = ADC_DB6RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[6] = voltage;DATAH = ADC_DB7RH;DATAL = ADC_DB7RL;voltage = ( DATAH << 2 ) + DATAL ;databuf[7] = voltage; }return voltage;
}//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{ADC_CSR &= ~0x80; // 转换结束标志位清零 EOCADC_flag = 1; // ADC中断标志 置1
}
STM8 ADC转换模式-------带缓存的连续模式相关推荐
- STM8 ADC转换模式-------连续模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...
- STM8 ADC转换模式-------单次模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次模式 在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选 ...
- STM8 ADC转换模式-------连续扫描模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续扫描模式 该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新 ...
- STM8 ADC转换模式-------单次扫描模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次扫描模式 该模式是用来转换从AIN0到 之间的一连串模拟通道,'n'是在 ADC_CSR寄 ...
- STM8单片机ADC带缓存的连续采样模式
在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8 ...
- STM32 ADC 单次模式、连续模式、扫描模式(转载)
ADC单通道: 要求进行一次ADC转换:配置为单次模式使能,扫描模式失能.这样ADC的这个通道,转换一次后,就停止转换. 要求进行连续ADC转换:配置为连续模式使能,扫描模式失能.这样ADC的这个通道 ...
- STM32 ADC 单次模式、连续模式、扫描模式
ADC单通道: 要求进行一次ADC转换:配置为单次模式使能,扫描模式失能.这样ADC的这个通道,转换一次后,就停止转换. 要求进行连续ADC转换:配置为连续模式使能,扫描模式失能.这样ADC的这个通道 ...
- stm8 ADC中断采集
1.STM8的ADC介绍 使用模拟-数字转换器将模拟电压信号转换为数字值.具有28模拟通道可用.A / D转换可以在单个或连续模式下执行. 2.ADC 主要特点 •其配置的分辨率(12bit) •模拟 ...
- 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流
文章目录 字节流类 带缓存的输入/输出流 BufferedReader与BufferedWriter类 下面的例子程序演示了read()方法,从控制台读取字符直到用户键入"q": ...
最新文章
- mysql数据库从删库到跑路之mysql完整性约束
- 1.1 Friday the Thirteenth
- (转)postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- Bootstrap基础一 CSS 概览
- Python进阶之路:namedtuple
- idea run和debug都是灰色的,没法点怎么解决
- C/C++基本类型字节
- 通过printf从目标板到调试器的输出
- 【Python】Matplotlib绘制三维线形图
- 图片服务 - thumbor可用的探测器
- 轻松上云系列之二:其他云数据迁移至阿里云
- 查看tensor的形状,行列大小
- 【算法总结】积性函数相关
- 20180209-sys模块
- Clang checker类总结
- 项目2胖子不想说体重
- 2023年3月份隐私计算市场洞察
- Minecraft 1.12.2模组开发(十) 食物制作
- 水果店营销技巧与方法,水果店营销模式和技巧
- stm32 + ESP8266 wifi获取网络时间和天气 stm32天气预报