STM32学习笔记-ADC

本文详细介绍了STM32F103C8T6的ADC模块,包括其16个外部和2个内部通道、模拟看门狗功能、12位逐次逼近型ADC的特性、GPIO配置、数据选择与存储机制,以及ADC的触发源、时钟管理、扫描模式和校准过程。
摘要由CSDN通过智能技术生成

18个输入通道,可测量16个外部和2个内部信号源

规则组和注入组两个转换单元

模拟看门狗自动监测输入电压范围 ;

12位逐次逼近型ADC,1us转换时间

STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

ADC结构框图:

ADC通道:每个ADC有16个外部通道,在GPIO上,根据STM32型号的差异,具体GPIO见下表;另外还有两个内部信号,温度传感器和内部参考电压;

ADC数据选择器:紧跟随在GPIO后,可选择对应GPIO或者内部信号来送入ADC转换器;注入组最多一次性可以选择4个通道,规格组最多一次性可以选择16个通道;这里虽然可以一次性选择多个通道,但是实际在进行模数转换的时候,还是一个通道一个通道的进行转换,转换好一个数据就往数据寄存器里存放一个;

数据寄存器:注入组对应的注入组数据寄存器,有4个,故可以在模数转换完共放入4个转换数据;所以注入组可以实现4个通道的一次性转换;而规格组的数据寄存器只有一个,故它只能存放一次模数转换的数据,第二次转换后放入数据寄存器会覆盖前面的值;所以规则组虽然一次性可以选择16个通道,但是数据只能保存一个;若要保证数据的准确,就要在每次数据转换完成后及时提取数据寄存器里的值,防止被覆盖;这里单一数据的存入并不代表的转换完成,需要整个用户定义的组内通道全部转换完毕,才会触发结束标志位EOC;一般这种操作会通道DMA来显示;另外,数据寄存器的数据是16bit的,半字;8bit为1 byte;32bit为字;

ADC转换触发源:

1、软件触发:手动调用代码,实际就是在操作寄存器的某一位

2、硬件触发:见框架图,基本都来源于定时器;也可以是外部中断EXTI;

ADC时钟:

ADCCLK:由APB2时钟分频得到,可进行2/4/6/8分频,且时钟不能超过14M,默认系统时钟72M,则只能进行6/8分频,故ADCCLK是12M或者9M;

模拟看门狗:

内部可以设定阈值的高低门限,超过门限可以触发看门狗事件,若开启中断使能并在NVIC中配置了中断,就可以在触发中断执行想要的操作;一般高低门限用迟滞的方案来做判断,防止单一门限的过零抖动;

ADC扫描模式:

转换的单次还是连续,是指规则组或者注入组整个组别内的通道转换完成后,是否需要触发信号再次触发实现第二轮的转换;即单次转换每开始一个组的转换都要触发信号;而连续转换只要第一次触发后,后面相同组别再次转换不需要信号;

非扫描模式和扫描模式:就是值一个组内的通道选择几个转换,非扫描就只会转换第一个;而扫描模式,会根据用户设定的通道数目进行扫描;

还有一个间断模式,就是在扫描模式下,每隔几个通道间断一次,需要再次触发才能继续进行;

触发控制:

规则组的触发源:定时器的更新事件、软件触发和外部中断;

数据对齐:一般选择右对齐,取低12bit;

AD转换时间:

采样+保持可认为是采样时间,量化+编码可以认为是转换时间

采样时间可以通过寄存器设定,而转换时间,因为ADC为12bit。故需要12个时钟周期输出12bit的数据,多出来的0.5个时钟周期未知?,

ADC校准:只需要执行固件库的4个函数即可

ADC实现逻辑:

本例以外部GPIO通道采集电压方式

第一步:开启RCC时钟,包括GPIO和ADC的时钟;

第二步:设定ADC的时钟频率;void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);

第三步:配置GPIO,选择模拟量采集的模式;

第四步:配置多路开关,把采集电压的GPIO选通到后面的AD转换器

void ADC_RegularChannelConfig;配置ADC从GPIO的ADCX-channlx到规则组的序列x以及对应的采样时间;

第五步:配置AD转换器相关设定,库函数已经定义结构体,包括了AD数据寄存器;

ADC_Mode:选择ADC模式,有单ADC和双ADC模式等

ADC_ScanConvMode:扫描模式选择,enable

ADC_ContinuousConvMode:连续or单次转换模式选择,enable连续

ADC_ExternalTrigConv:ADC转换触发源选择,软件触发选择ADC_ExternalTrigConv_None

ADC_DataAlign:ADC转换后的数据左对齐?右对齐?

ADC_NbrOfChannel:选择ADC在扫描模式下,转换菜单上的序列个数;

第六步:ADC上电开关控制,转换准备就绪,等待触发源触发来开启采样转换;

ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

第七步:根据规格书建议,可以进行AD校准;

调用开始校正函数后,需要对校正是否完成进行判断,用while函数对校正状态函数的返回值做判断,来判断是否校正结束;

另外可以根据需要配置模拟看门狗部分参数,可以触发事件和中断,若需要触发中断,可使用ITCONFIG函数触发中断输出,并相应配置NVIC实现;

第八步:等待硬件触发或者软件触发,开始ADC转换;

在上述8步操作中,只要转换还没被触发,顺序可以调整

软件触发函数ADC_SoftwareStartConvCmd()或者硬件触发或者外部中断

第九步:读取ADC转换值;读取EOC标志位确认转换完成,去数据寄存器中读取数据;

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);状态位

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);数据返回

代码:

#include "stm32f10x.h"  // Device header
void ADC1_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_71Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t ADC_return(void)
{
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	return ADC_GetConversionValue(ADC1);
	
}

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值