STM32学习笔记(七)--ADC详解

(1)配置步骤
++++1.配置RCC外设时钟++++ ++++开启GPIO以及ADC外设++++
++++2.配置预分配ADCCLK++++ ++++不能超过14MHZ 一般都是除于6++++
++++3.配置GPIO口++++ ++++初始化为模拟输入的配置 设置专属模式++++
++++4.选择规则组的输入通道++++ ++++选择ADCx以及通道等 去看引脚图++++
++++5.配置ADC++++ ++++初始化配置++++
++++6.配置中断以及定时器等等++++ ++++(需要即配置)++++
++++7.开启ADC的电源++++
++++8.开启ADC的校准++++

(2)代码示例

案例1 ADC1单通道 PA0单通道模拟输入实例 单次转化非扫描

cpp 复制代码
void AD_Init(void)
{
//开启对应的RCC时钟外设 要用的GPIO口以及选择的ADC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//进行预分配处理 该晶振为72MHZ除于预分频值要比14MHZ小才行
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//进行GPIO的初始化配置 注意的是选择模式为模拟输入
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(GPIOA, &GPIO_InitStructure);
//选择规则组的输入通道 1、2参数根据引脚图 3参数是次序(1-16)4参数采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
//初始化ADC具体函数功能下文会阐述
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//连续转化非扫描ENABLE
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//开启ADC电源 启动ADC
ADC_Cmd(ADC1, ENABLE);

//进行ADC校准
//复位校准
ADC_ResetCalibration(ADC1);
//等待复位校准完成
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
//开始校准
ADC_StartCalibration(ADC1);
//等待校准完成
while (ADC_GetCalibrationStatus(ADC1) == SET);
//连续转化非扫描ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
//单次转化非扫描
uint16_t AD_GetValue(void)
{
//触发ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//获取ADC转换标志位状态的函数
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
//获取ADC转换的函数 会自动清除标志位
return ADC_GetConversionValue(ADC1);
}
/*连续转化非扫描
uint16_t AD_GetValue(void)
{
return ADC_GetConversionValue(ADC1);
}*/

案例2 ADC1多通道 PA0123多通道模拟输入实例 标黄处做修改即可

cpp 复制代码
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
		
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
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 AD_GetValue(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel,1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
//
uint16_t AD0, AD1, AD2, AD3;
int main(void)
{
OLED_Init();
AD_Init();
	
OLED_ShowString(1, 1, "AD0:");
OLED_ShowString(2, 1, "AD1:");
OLED_ShowString(3, 1, "AD2:");
OLED_ShowString(4, 1, "AD3:");
	
while (1)
{
	AD0 = AD_GetValue(ADC_Channel_0);
	AD1 = AD_GetValue(ADC_Channel_1);
	AD2 = AD_GetValue(ADC_Channel_2);
	AD3 = AD_GetValue(ADC_Channel_3);
		
	OLED_ShowNum(1, 5, AD0, 4);
	OLED_ShowNum(2, 5, AD1, 4);
	OLED_ShowNum(3, 5, AD2, 4);
	OLED_ShowNum(4, 5, AD3, 4);
	Delay_ms(100);
	}
}

(3)函数分析

函数1:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

(stm32f10x_adc.h) 该函数为初始化ADC函数,其ADC_InitTypeDef结构体成员变量如下所示。

|-----|--------------------------------|----------------|--------------------------------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | ADC_Mode | ADC的工作模式独立、双AD | ADC_Mode_Independent(就此为独立模式 其余都是双AD 相对复杂) |
| 参数2 | ADC_DataAlign | 数据对齐 | ADC_DataAlign_Right(右对齐) |
| 参数3 | ADC_ExternalTrigConv | 外部触发转换选择 触发源 | ADC_ExternalTrigConv_None(不使用外部触发 内部软件触发) |
| 参数4 | ADC_ContinuousConvMode | 选择连续转换还是单次转换 | DISABLE(单次模式) ENABLE(连续模式) |
| 参数5 | ADC_ScanConvMode | 选择扫描还是非扫描 | DISABLE(非扫描模式) ENABLE(扫描模式) |
| 参数6 | ADC_NbrOfChannel (非扫描模式下此参数无用) | 指定扫描模式下会用到几个通道 | 1(1-16之间) |

相关推荐
彤银浦3 分钟前
python学习记录7
python·学习
这可就有点麻烦了3 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
少女忧4 分钟前
51单片机学习第六课---B站UP主江协科技
科技·学习·51单片机
邓校长的编程课堂1 小时前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
missmisslulu2 小时前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板
yunhuibin2 小时前
ffmpeg面向对象——拉流协议匹配机制探索
学习·ffmpeg
Ljubim.te2 小时前
软件设计师——数据结构
数据结构·笔记
hengzhepa2 小时前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
夜间去看海2 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
蜡笔小新星3 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习