STM8 ADC转换模式-------连续扫描模式
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转换模式-------连续扫描模式相关推荐
- STM8 ADC转换模式-------连续模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...
- STM8 ADC转换模式-------单次扫描模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次扫描模式 该模式是用来转换从AIN0到 之间的一连串模拟通道,'n'是在 ADC_CSR寄 ...
- STM8 ADC转换模式-------带缓存的连续模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...
- STM8 ADC转换模式-------单次模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次模式 在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选 ...
- STM8单片机ADC连续扫描模式
当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式.也就是说多个通 ...
- stm8 ADC中断采集
1.STM8的ADC介绍 使用模拟-数字转换器将模拟电压信号转换为数字值.具有28模拟通道可用.A / D转换可以在单个或连续模式下执行. 2.ADC 主要特点 •其配置的分辨率(12bit) •模拟 ...
- STM32之ADC多通道连续例程
#include "stm32f10x.h" /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus ...
- STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储
文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...
- 如何使用S32K1的PDB模块触发多个ADC通道连续采样
文章目录 1. 外设模块介绍 1.1 PDB模块简介 1.2 ADC通道 1.3 ADC触发源 1.4 PDB触发多个ADC通道的两种方式 2. 例程 2.1 例程功能介绍 2.2 例程编写 2.2. ...
最新文章
- Android 使用git 忽略文件
- 产品经理多任务并行处理,如何管理提效?
- SNMP系统信息获取工具onesixtyone
- 架构成长之路:常见的五种MySQL高可用方案分析
- 一个空间配置多个虚拟主机
- Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
- TensorFlow Attention
- [SHELL] LAMP一键安装脚本设计(v2.1)
- how to solve undefined reference in igllib
- 男子常用英文名及含义
- 华为云数据库三大优势
- (转帖)物流行业:JIT,VMI模式
- C# Culling Mask
- Bugzilla使用说明
- Field xxxMapper in xxxxxxx required a bean of type ‘xxxxMapper‘that could not be found.
- 使用UltraISO制作ubuntu安装u盘启动盘图文教程
- 标签组html,html标签大全
- html兼容ie7ie8,解决IE6、IE7、IE8样式不兼容问题
- Bloxorz I POJ - 3322(广度优先搜索)
- 快速将多个excel表合并成一个excel表