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

连续扫描模式
        该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
        连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。
        在转换序列正在进行过程中不要清零SCAN位。
        连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。

注意:在扫描模式中,不要使用位操作指令 (BRES) 去清除 EOC 标志位,这是因为该指令是对整个ADC_CSR 寄存器的一个读 - 修改 - 写操作。从 CH[3:0] 寄存器中读取当前的通道编号和写回器,将会改变扫描系列的最后通道编号。

在连续扫描模式中正确的清除 EOC 标志位的方法是从一个 RAM 变量中载入一个字节到ADC_CSR寄存器,这样来清除EOC 标志位同时还重新载入扫描系列新的最后通道编号。

读取转换结果的时候可以通过查询方式,也可以通过中断的方式,

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

#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 并开始转换
}
/*
注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,
这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。
从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是 个RAM变量中载入一个字节到ADC_CSR寄存器,
这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。实验发现,位操作指令只在连续扫描模式中会清除CH[3:0]寄存器中的值,但并不影响其他值。
因此将ADC_CSR中的值读出,再将CH[3:0]中原来通道号加入进去,最后重新写入ADC_CSR中即可。写法如下:ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_n);注:ADC1_CHANNEL_n表示扫描到那个通道结束。*/
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;             //程序运行一圈耗时 10us    while( ( ADC_CSR & 0x80 ) == 0 );      //等待转换结束//ADC_CSR &= ~( 1 << 7 );               // 不能通过位操作来清零  EOC 标志ADC_CSR = ADC_CSR & 0x7F | 0x04;        // 转换结束标志位清零  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 并开始转换
}/*
注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,
这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。
从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是 个RAM变量中载入一个字节到ADC_CSR寄存器,
这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。实验发现,位操作指令只在连续扫描模式中会清除CH[3:0]寄存器中的值,但并不影响其他值。
因此将ADC_CSR中的值读出,再将CH[3:0]中原来通道号加入进去,最后重新写入ADC_CSR中即可。写法如下:ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_n);注:ADC1_CHANNEL_n表示扫描到那个通道结束。*/
u16 ain2_val = 0, ain3_val = 0, ain4_val = 0;
u16 temph = 0;
u8 templ = 0;//AD中断服务函数 中断号22
#pragma vector = 24                     // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{LED = !LED;             //程序运行一圈耗时 14us//ADC_CSR &= ~( 1 << 7 );               // 不能通过位操作来清零  EOC 标志ADC_CSR = ADC_CSR & 0x7F | 0x04;        // 转换结束标志位清零  EOC//单通道扫描模式,转换结果存储在 ADC_DBxR 寄存器中//读取 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_flag = 1;                       // ADC中断标志 置1
}

STM8 ADC转换模式-------连续扫描模式相关推荐

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

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

  2. STM8 ADC转换模式-------单次扫描模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次扫描模式 该模式是用来转换从AIN0到 之间的一连串模拟通道,'n'是在 ADC_CSR寄 ...

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

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

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

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

  5. STM8单片机ADC连续扫描模式

      当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式.也就是说多个通 ...

  6. stm8 ADC中断采集

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

  7. STM32之ADC多通道连续例程

    #include "stm32f10x.h" /* RCC时钟配置 */ void RCC_config(void) {  ErrorStatus HSEStartUpStatus ...

  8. STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储

    文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...

  9. 如何使用S32K1的PDB模块触发多个ADC通道连续采样

    文章目录 1. 外设模块介绍 1.1 PDB模块简介 1.2 ADC通道 1.3 ADC触发源 1.4 PDB触发多个ADC通道的两种方式 2. 例程 2.1 例程功能介绍 2.2 例程编写 2.2. ...

最新文章

  1. Android 使用git 忽略文件
  2. 产品经理多任务并行处理,如何管理提效?
  3. SNMP系统信息获取工具onesixtyone
  4. 架构成长之路:常见的五种MySQL高可用方案分析
  5. 一个空间配置多个虚拟主机
  6. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
  7. TensorFlow Attention
  8. [SHELL] LAMP一键安装脚本设计(v2.1)
  9. how to solve undefined reference in igllib
  10. 男子常用英文名及含义
  11. 华为云数据库三大优势
  12. (转帖)物流行业:JIT,VMI模式
  13. C# Culling Mask
  14. Bugzilla使用说明
  15. Field xxxMapper in xxxxxxx required a bean of type ‘xxxxMapper‘that could not be found.
  16. 使用UltraISO制作ubuntu安装u盘启动盘图文教程
  17. 标签组html,html标签大全
  18. html兼容ie7ie8,解决IE6、IE7、IE8样式不兼容问题
  19. Bloxorz I POJ - 3322(广度优先搜索)
  20. 快速将多个excel表合并成一个excel表

热门文章

  1. Linux命令之tree(3)
  2. 简单模拟一下科目三的灯光考试
  3. 2022.08.21 吉司机线段树略讲
  4. 电脑抓wifi空中包三种方法
  5. MVC常见问题小总结
  6. E6 数据库分区技术
  7. 继续Nginx WRR负载均衡算法的优化
  8. Ubuntu20.04工具篇 | 搜狗输入法安装
  9. util.js 常用
  10. mysql从小到大的语句_MySQL 我自己常用的语句汇总