Stm32f103rct6ADC电压采集简介及注意点

发布者:太和清音最新更新时间:2018-10-06 来源: eefocus关键字:Stm32f103rct6  ADC  电压采集 手机看文章 扫描二维码
随时随地手机看文章

STM32f103 系列有 3 个 ADC,精度为12 位,每个 ADC 最多有 16 个外部通道。其中ADC1和ADC2 都有 16 个外部通道,ADC3根据CPU 引脚的不同通道数也不同,一般都有8 个外部通道。ADC 的模式非常多,功能非常强大。

ADC 输入范围为:V REF-  ≤ V IN ≤ V REF+ ,一般把 V SSA 和 V REF- 接地,把 V REF+ 和 V DDA 接3V3,得到ADC 的输入电压范围为:0~3.3V。

通道:

Stm32f103rct6ADC电压采集简介及注意点

注入通道:

注入,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强行插入要转换的一种。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。这点跟中断程序很像,都是不安分的主。所以,注入通道只有在规则通道存在时才会出现。

转换顺序:规则序列:

规则序列寄存器有 3 个,分别为 SQR3、SQR2、SQR1。

SQR3 控制着规则序列中的第一个到第六个转换,对应的位为:SQ1[4:0]~SQ6[4:0],第一次转换的是位 4:0 SQ1[4:0],如果通道 16想第一次转换,那么在 SQ1[4:0]写 16即可。

 


Stm32f103rct6ADC电压采集简介及注意点

注入序列

注入序列寄存器 JSQR 只有一个,最多支持 4 个通道,具体多少个由 JSQR 的 JL[2:0]决定。如果 JL 的 值小于 4 的话,则 JSQR 跟 SQR 决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0],而是 JCQRx[4:0] ,x = (4-JL),跟 SQR刚好相反。如果 JL=00(1个转换),那么转换的顺序是从 JSQR4[4:0]开始,而不是从 JSQR1[4:0]开始,这个要注意,编程的时候不要搞错。当 JL等于 4 时,跟 SQR 一样。

Stm32f103rct6ADC电压采集简介及注意点


触发源:

ADC 转换可以由ADC 控制寄存器 2: ADC_CR2 的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换。

ADC 还支持触发转换,这个触发包括内部定时器触发和外部 IO 触发。触发源有很多,具体选择哪一种触发源,由 ADC 控制寄存器 2:ADC_CR2 的

EXTSEL[2:0]和 JEXTSEL[2:0]位来控制。EXTSEL[2:0]用于选择规则通道的触发源,JEXTSEL[2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由ADC 控制寄存器 2:ADC_CR2 的 EXTTRIG 和 JEXTTRIG 这两位来激活。其中 ADC3 的规则转换和注入转换的触发源与 ADC1/2 的有所不同,在框图上已经表示出来。

转换时间:

ADC时钟:

ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,分频因子由 RCC时钟配置寄存器 RCC_CFGR 的位 15:14 ADCPRE[1:0]设置,可以是 2/4/6/8 分频,注意这里没有 1 分频。一般我们设置 PCLK2=HCLK=72M。

采样时间:

ADC 使用若干个 ADC_CLK 周期对输入的电压进行采样,采样的周期数可通过 ADC采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位设置,ADC_SMPR2 控制的是通道0~9,ADC_SMPR1 控制的是通道 10~17。

数据寄存器:

规则数据寄存器:

ADC 规则组数据寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,低 16 位在单 ADC时使用,高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据,双模式就是 ADC1 和ADC2同时使用。

注入数据寄存器:

DMA:

规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA 请求,把转换好的数据直接存储在内存里面。要注意的是只有 ADC1 和 ADC3 可以产生 DMA 请求。

 

 

 

ADC_InitTypeDef结构体

1 typedef struct

2 {

3        uint32_t ADC_Mode; // ADC 工作模式选择

4       FunctionalState ADC_ScanConvMode;

6        FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连续转换选择

7        uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择

8       uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式,右对齐ADC_DataAlign_Right 或者左对齐 ADC_DataAlign_Left。一般我们选择右对齐模式。

9        uint8_t ADC_NbrOfChannel; // ADC 采集通道数

10 } ADC_InitTypeDef;


主要配置代码:

#define    ADC_APBxClock_FUN             RCC_APB2PeriphClockCmd

#define    ADC_CLK                       RCC_APB2Periph_ADC1

#define    ADC_GPIO_APBxClock_FUN        RCC_APB2PeriphClockCmd

#define    ADC_GPIO_CLK                  RCC_APB2Periph_GPIOC  

#define    ADC_PORT                      GPIOC

#define    NOFCHANEL 6

#define    ADC_PIN1                      GPIO_Pin_0

#define    ADC_CHANNEL1                  ADC_Channel_10

#define    ADC_PIN2                      GPIO_Pin_1

#define    ADC_CHANNEL2                  ADC_Channel_11

#define    ADC_PIN3                      GPIO_Pin_2

#define    ADC_CHANNEL3                  ADC_Channel_12

#define    ADC_PIN4                      GPIO_Pin_3

#define    ADC_CHANNEL4                  ADC_Channel_13

#define    ADC_PIN5                      GPIO_Pin_4

#define    ADC_CHANNEL5                  ADC_Channel_14

#define    ADC_PIN6                      GPIO_Pin_5

#define    ADC_CHANNEL6                  ADC_Channel_15

// ADC1 对应 DMA1通道1,ADC3对应DMA2通道5,ADC2没有DMA功能

#define    ADC_x                         ADC1

#define    ADC_DMA_CHANNEL               DMA1_Channel1

#define    ADC_DMA_CLK                   RCC_AHBPeriph_DMA1

static void ADCx_Mode_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;

// 打开DMA时钟

RCC_AHBPeriphClockCmd(ADC_DMA_CLK, ENABLE);

// 打开ADC时钟

ADC_APBxClock_FUN ( ADC_CLK, ENABLE );

// 复位DMA控制器

DMA_DeInit(ADC_DMA_CHANNEL);

// 配置 DMA 初始化结构体

// 外设基址为:ADC 数据寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( & ( ADC_x->DR ) );

// 存储器地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;

// 数据源来自外设

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

// 缓冲区大小,应该等于数据目的地的大小

DMA_InitStructure.DMA_BufferSize = NOFCHANEL;

// 外设寄存器只有一个,地址不用递增

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

// 存储器地址递增

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

// 外设数据大小为半字,即两个字节

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

// 内存数据大小也为半字,跟外设数据大小相同

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

// 循环传输模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

// 禁止存储器到存储器模式,因为是从外设到存储器

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

// 初始化DMA

DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure);

// 使能 DMA 通道

DMA_Cmd(ADC_DMA_CHANNEL , ENABLE);

// ADC 模式配置

// 只使用一个ADC,属于单模式

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

// 扫描模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE ; 

// 连续转换模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

// 不用外部触发转换,软件开启即可

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

// 转换结果右对齐

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

// 转换通道个数

ADC_InitStructure.ADC_NbrOfChannel = NOFCHANEL;

// 初始化ADC

ADC_Init(ADC_x, &ADC_InitStructure);

// 配置ADC时钟N狿CLK2的8分频,即9MHz

RCC_ADCCLKConfig(RCC_PCLK2_Div8); 

// 配置ADC 通道的转换顺序和采样时间

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL2, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL3, 3, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL4, 4, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL5, 5, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL6, 6, ADC_SampleTime_55Cycles5);

// 使能ADC DMA 请求

ADC_DMACmd(ADC_x, ENABLE);

// 开启ADC ,并开始转换

ADC_Cmd(ADC_x, ENABLE);

// 初始化ADC 校准寄存器  

ADC_ResetCalibration(ADC_x);

// 等待校准寄存器初始化完成

while(ADC_GetResetCalibrationStatus(ADC_x));

// ADC开始校准

ADC_StartCalibration(ADC_x);

// 等待校准完成

while(ADC_GetCalibrationStatus(ADC_x));

// 由于没有采用外部触发,所以使用软件触发ADC转换 

ADC_SoftwareStartConvCmd(ADC_x, ENABLE);

}

参考《零死角玩转stm32f103》


关键字:Stm32f103rct6  ADC  电压采集 引用地址:Stm32f103rct6ADC电压采集简介及注意点

上一篇:STM32ADC单次转换实例
下一篇:STM32F407ADC多通道+定时器触发+DMA模式设置

推荐阅读最新更新时间:2024-03-16 16:15

开关电源(DC/DC转换器)真的会降低ADC的性能吗
工程师一般认为开关电源会降低ADC的性能,因此通常愿意选用低压差(LDO)线性稳压器,而不使用开关稳压器,但这种认识并非完全正确。LDO具有较低的纹波和噪声指标,但最近的研究表明,高效的开关稳压器也可用于一些转换器设计中,前提是设计师对电路拓扑有很好的理解,运用一些实用技巧,同时采取一些必要的防范措施。 首先是选择转换器,然后选择正确的开关稳压器,并不是任何开关稳压器都可以使用。从数据手册上查阅开关稳压器的噪声和纹波指标,以及开关频率。典型的开关稳压器在100kHz带宽范围内大概有10μV rms的噪声。假设它们都是白噪声,那么有关频带内的噪声密度相当于31.6 nVrms/rt-Hz。 其次,要查阅转换器的电源抑制(PSR)
[电源管理]
STM32F103RCT6之FLASH读写操作
一、STM32F103的FLASH简介 1、如图所示,STM32F103内部FLASH存储区分为三个区域:主存储区、信信息块和闪存存储器接口寄存器。 储存储区是我们读写FLASH的主要的存储区,MCU程序以及一些需要掉电保存的数据都是存储在这个区域的。 信息快:程序启动代码被存储在这部分。 最后的寄存器则是FLASH读写需要配置的一些寄存器位置。 主存储器的起始位置0x08000000,除去程序占用的空间,剩余部分就可以作为数据保存的区域了,所以在利用内部FLASH存储数据的时候,一定不要占用程序本身所占用的空间,否则会导致死机。 主存储器一共256页,每页2K字节长度。 二、FLASH存储寄存器的配置 1、FPEC键寄存器
[单片机]
<font color='red'>STM32F103RCT6</font>之FLASH读写操作
低功耗通用语音处理平台的设计实现
语音信号处理在通信领域得到了广泛的应用,语音传输的数字化是全数字化移动通信系统中的重要环节。高质量、低速率的话音编码技术与高效率的数字调制技术结合,为现代移动通信提供了优于模拟移动通信的系统容量、通信质量和频谱利用率。现代移动通信的发展也对系统的功耗提出了较高的要求,因此低功耗、高性能的DSP已经越来越广泛地被应用于各个领域。本文介绍采用美国德州仪器公司(TI)最新开发出来的TMS320VC5510A,利用其数据处理能力及低功耗特性,并且结合MSP430F149增加了系统的控制能力,进行各种语音算法的实时实现,对于实际开发语音处理系统具有重要的参考价值,并且该平台已经应用于实际产品中。 1 语音处理系统组成及其原理 1.1 语
[单片机]
低功耗通用语音处理平台的设计实现
STM32 TIM触发ADC 定时采样-笔记
用TIM3的update触发adc,只需勾选Internal clock就可以了 ADC设置,关键是选TIM3 TRIGGER OUT TIM3 设置时间间隔然后关键选Update event 程序代码 记得开启TIM3 HAL_ADCEx_Calibration_Start(&hadc1); //STM32F1 HAL_TIM_Base_Start(&htim3); HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,1024); 然后重写callback 函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* h
[单片机]
STM32 TIM触发<font color='red'>ADC</font> 定时采样-笔记
W806/W801/W800多通道ADC同时使用
本文使用环境: 电脑:windows10 主控:W806(240MHZ) 兼容:W800 W801 编译环境:平头哥的CDK 注意:本文默认已经搭建好平台。 参考文章: W806-ADC-PWM-TIM尝鲜 本文github地址 写在前面: 最近有比较多的同学问到了多路ADC如何使用的问题,官方的demo只给出了单路ADC,因此本文就详细讲解一下。 一、文档 首先翻阅芯片的手册,查看ADC对应的端口和特性,这里直接查看上一篇文章的第1.1小节。 二、编程 2.1、定义ADC端口和ADC的结构体 定义单片机所有的ADC端口,一共有4个外接端口和一个电压、一个温度(共6个)。对应的IO注释在定义后面。在main函数
[单片机]
W806/W801/W800多通道<font color='red'>ADC</font>同时使用
Cirrus Logic创新芯片荣获行业奖项提名
Cirrus Logic 公司宣布,其两款高精度模拟集成电路从数百款被提名产品中脱颖而出,入围两大主流半导体杂志 EDN 和 EE Times 模拟 IC 类奖项的最终候选名单。 Cirrus Logic 的 CS556x/7x/8x 工业模数转换器系列正在角逐 EDN 杂志 2007 年度创新奖的最高奖项,而 CS4525 数字放大器 已入围 EE Times 杂志 2008 年度电子成就奖( ACE )的最终候选名单。 Cirrus Logic 公司总裁兼首席执行官 Jason Rhode 表示: “ 这两款模拟 IC 产品的技术创新能够得到行业的认可,我们感到非常高兴。 CS55XX 改写了高性能 △ -
[焦点新闻]
ATtiny13A ADC查询法使用
void adc_init(void) { ADCSRA = 0x00; //禁用ADC ADMUX = 0x03; ACSR = 0x80; //禁用模拟比较器 ADCSRB = 0x00; ADCSRA = 0x83; } uint read_adc(void) { uint temp = 0; ADCSRA |= (1 ADSC); //使能AD转换,第一次转换,结果丢弃 while((ADCSRA & (1 ADIF)) == 0); //等待AD转换结束 ADCSRA |= (1 ADIF); //ADIF写1用来清除ADIF,规格书上要求的 ADCSRA |= (1
[单片机]
基于高分辨率ADC与PGA连接热电偶的USB接口设计
本设计中的电路包括一个混合信号微控制器、一只USBUART(通用异步接收器/发射器),还有一个新颖的自适应模拟传感器输入电路。此电路可以将多种类型的传感器接到设计的两个模拟输入通道上,在一个USB主机上控制这些设备,读出测量数据。USB连接为电路提供电源。在计算机上就能用简单指令控制设备;甚至用终端软件也可以做测量工作。8051核有免费的工具, 便于做编程工作, 如IDE(集成开发环境)、调试器以及C编译器。 本设计采用了价格为8 美元的8051 架构微控制器, 还有一只PGA(可编程增益放大器),以及一只24位Σ-Δ ADC(图1、2和3)。微控制器IC1有一个输入多工器,可采用差分模式或单端模式。它还有两个DAC输出,可以
[单片机]
基于高分辨率<font color='red'>ADC</font>与PGA连接热电偶的USB接口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved