STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。

单次扫描模式

该模式是用来转换从AIN0到 之间的一连串模拟通道,‘n’是在 ADC_CSR寄存器的换的通道编号。CONT 位以被清零时通过置位 ADON 位来启动。
      注意:当使用扫描模式时,不可以将 AIN0 到 AINn 之间通道对应的 I/O 口设为输出状态,因为 ADC 的多路选择器已经将这些 I/O 口的输出模块禁用了。
      对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR 中,当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当
EOCIE 位已被置位时将产生一个中断。
       可以从缓冲寄存器中读取各个通道的转换结果值。如果某个数据缓存寄存器在被读走之前被覆
盖,OVR标志将置1。(见24.5.5)
     转换序列正在进行过程中不要清零SCAN位;单次扫描模式可通过清零ADON位来立即停止。
为了开启一次新SCAN扫描转换,可以通过对ADC_CR1寄存器的EOC位清零和ADON位置位来
实现。

读取采样结果的时候可以通过查询的方式也可以通过中断的方式去读取。

单次扫描模式通过查询方式读取数据代码:

#include "adc.h"
#include "main.h"
#include "led.h"_Bool ADC_flag = 0;                     //ADC转换成功标志u16 ADC_DB[10] = {0};
u16 adc_data[5] = {0};//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 2 );              //PD2 设置为输入PD_CR1 &= ~( 1 << 2 );              //PD2 设置为悬空输入PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入PC_DDR &= ~( 1 << 4 );              //PC4 设置为输入PC_CR1 &= ~( 1 << 4 );              //PC4设置为悬空输入
}//设置为 单次扫描模式
//ch 为ADC通道 连续转换AIN0---AINch 通道的数据
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_GPIO_Init();ADC_CR1 &= ~( 7 << 4 );   //预分频 2ADC_CR2 &= ~( 1 << 6 );   //不使用外部触发//禁止 AIN2 AIN4 的施密特触发器,降低 IO 静态功耗  PD5,PD6 上的通道如果施密特方式禁用会导致串口无法收发数据!ADC_TDRL |= ( 1 << 2 );ADC_TDRL |= ( 1 << 4 );ADC_CR1 &= ~( 1 << 1 );   //单次转换ADC_CSR |= 0x04;          //配置通道号最大的那个ADC_CR2 |= ( 1 << 3 );    //右对齐ADC_CR1 |= ( 1 << 0 );    //开启 ADCADC_CR2 |= ( 1 << 1 );    // SCAN = 1 开启扫描模式//当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置位ADC_CR1寄存器的ADON位。for( l = 0; l < 10; l++ );  //延时,保证ADC模块的上电完成 至少7usADC_CR1 |= ( 1 << 0 );      //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}u16 ain2_val = 0,ain3_val = 0,ain4_val = 0;
//读取采样电压值
u16 ReadVol_CHx( void )
{u16 voltage = 0;u16 temph = 0;u8 templ = 0;while( 1 ){LED = !LED;             //程序运行一圈耗时 15us    ADC_CR1 |= 0x01;                        //开启一次转换while( ( ADC_CSR & 0x80 ) == 0 );      //等待转换结束ADC_CSR &= ~( 1 << 7 );               // 转换结束标志位清零  EOC//读取 AIN2 的值templ = ADC_DB2RL;temph = ADC_DB2RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain2_val =  temph;//读取 AIN3 的值templ = ADC_DB3RL;temph = ADC_DB3RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain3_val =  temph;//读取 AIN4 的值templ = ADC_DB4RL;temph = ADC_DB4RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain4_val =  temph;}return voltage;
}

单次扫描模式通过中断方式读取数据代码:

#include "adc.h"
#include "main.h"
#include "led.h"_Bool ADC_flag = 0;                     //ADC转换成功标志u16 ADC_DB[10] = {0};
u16 adc_data[5] = {0};//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 2 );              //PD2 设置为输入PD_CR1 &= ~( 1 << 2 );              //PD2 设置为悬空输入PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入PC_DDR &= ~( 1 << 4 );              //PC4 设置为输入PC_CR1 &= ~( 1 << 4 );              //PC4设置为悬空输入
}//设置为 单次扫描模式
//ch 为ADC通道 连续转换AIN0---AINch 通道的数据
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_GPIO_Init();ADC_CR1 &= ~( 7 << 4 );   //预分频 2ADC_CR2 &= ~( 1 << 6 );   //不使用外部触发//禁止 AIN2 AIN4 的施密特触发器,降低 IO 静态功耗  PD5,PD6 上的通道如果施密特方式禁用会导致串口无法收发数据!ADC_TDRL |= ( 1 << 2 );ADC_TDRL |= ( 1 << 4 );ADC_CR1 &= ~( 1 << 1 );   //单次转换ADC_CSR |= 0x04;          //配置通道号最大的那个ADC_CR2 |= ( 1 << 3 );    //右对齐ADC_CR1 |= ( 1 << 0 );    //开启 ADCADC_CR2 |= ( 1 << 1 );    // SCAN = 1 开启扫描模式ADC_CSR |= ( 1 << 5 );    //EOCIE 使能转换结束中断//当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置位ADC_CR1寄存器的ADON位。for( l = 0; l < 10; l++ );  //延时,保证ADC模块的上电完成 至少7usADC_CR1 |= ( 1 << 0 );      //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}//AD中断服务函数 中断号22
#pragma vector = 24                     // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{ADC_CSR &= ~( 1 << 7 );               // 转换结束标志位清零  EOC//单通道扫描模式,转换结果存储在 ADC_DBxR 寄存器中LED = !LED;             //程序运行一圈耗时 20us//读取 AIN2 的值templ = ADC_DB2RL;temph = ADC_DB2RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain2_val =  temph;//读取 AIN3 的值templ = ADC_DB3RL;temph = ADC_DB3RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain3_val =  temph;//读取 AIN4 的值templ = ADC_DB4RL;temph = ADC_DB4RH;temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );ain4_val =  temph;ADC_CR1 |= 0x01;                        //开启一次转换ADC_flag = 1;                       // ADC中断标志 置1
}

STM8 ADC转换模式-------单次扫描模式相关推荐

  1. STM8 ADC转换模式-------单次模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次模式         在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选 ...

  2. STM8 ADC转换模式-------连续扫描模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续扫描模式         该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新 ...

  3. STM8 ADC转换模式-------带缓存的连续模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...

  4. STM8 ADC转换模式-------连续模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...

  5. 瑞萨e2studio(7)----ADC通过单次扫描多通道方式采样

    瑞萨e2studio.7--ADC通过单次扫描多通道方式采样 概述 视频教学 csdn课程 样品申请 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 时钟设置 UART配置 ...

  6. stm8 ADC中断采集

    1.STM8的ADC介绍 使用模拟-数字转换器将模拟电压信号转换为数字值.具有28模拟通道可用.A / D转换可以在单个或连续模式下执行. 2.ADC 主要特点 •其配置的分辨率(12bit) •模拟 ...

  7. STM32之ADC模数转换器单通道。

    ADC模数转换器 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁. 12位逐次 ...

  8. 基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)

    目录 一:STM32F4的ADC简介 1.1 ADC简介(不看也行) 1.2 ADC的供电及采样电压 二:实验步骤及代码 2.1实验步骤 2.2实验代码 2.2.1 ADC初始化代码 2.2.2 DM ...

  9. STM32F4 ADC+DMA单通道采集

    背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...

最新文章

  1. Fade 数字切换动效
  2. 线上日志分析与其他一些脚本
  3. ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...
  4. GCC优化选项:一般的文档里不容易找到的-Os
  5. IM即时通讯结合mui 环信
  6. java中的ackerman_java8的函数式接口
  7. (7)FPGA面试题Latch和Register区别
  8. 水滴公司启动医务社工高级人才培养计划
  9. MYSQL主从同步(Windows到Windows)
  10. mysql 5.7 多实例_window安装mysql5.7.25并创建mysql多实例
  11. sybase 设置默认值_修改Sybase数据库的默认字符集为CP936
  12. GIS中的矢量数据、栅格数据
  13. Js 生成uuid的四种方法
  14. Java 实现计算器功能
  15. 应用之星:H5制作教程-最好用的H5制作工具
  16. CAD直线和平面投影
  17. 读书寄语:有一种感动叫守口如瓶
  18. CentOS 安装Oracle 11g R2
  19. python 形态学
  20. 计算机名里的工作组和域都呈灰色无法修改了

热门文章

  1. linux 的FAQ
  2. Entity Framework 6新特性:全局性地自定义Code First约定
  3. Alfresco支持LDAP验证
  4. NeHe OpenGL第二十五课:变形
  5. IOS高级开发之多线程(五)NSOperation 2
  6. git冲突解决办法合集
  7. mac下通过brew安装的Nginx在哪
  8. TightVNC 2.6.4 发布
  9. JUnit5 @BeforeAll注解示例
  10. 03-07 APP 控件交互