ADC-常规序列的单通道转换

实验目的

把AO引脚输入单片机ADC中,用ADC测量AO引脚输出的电压

输出的电压大于1.5V说明目前光照强度较弱,熄灭最小系统板上的板载LED

输出的电压小于1.5V说明目前光照强度较强,点亮最小系统板上的板载LED

AO引脚和PA0引脚连接在一起。由于需要对通道0进行转换,把通道0的计划填写到常规序列第一行里。然后常规序列的外部触发信号向常规序列发送一个脉冲,这个脉冲启动常规序列,按照常规序列里的内容先闭合通道0开关,从PA0输入的模拟信号取一个点下来,然后断开通道0开关,12位逐次逼近型ADC把采到的点转换为数字信号,转换的结果保存到DR寄存器中。最后把DR寄存器里的结果读出来。结果就是A0输入的电压

电路图

接线图

1.初始化IO引脚

GPIO引脚模式有8种,输出4种,输入4种;输入模式中前三种都是针对数字信号,只有最后一种模拟模式针对模拟信号,所以这里PA0引脚为模拟模式

cs 复制代码
#include "stm32f10x.h"

void App_ADC1_Init(void) ;

int main(void)
{
	while(1)
	{
	}
}

void App_ADC1_Init(void) 
{
	//#1.初始化PA0引脚,模拟模式
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init (GPIOA, &GPIO_InitStruct);
}

2.配置ADC的时钟

cs 复制代码
	//#2.配置ADc模块的时钟
	RCC_ADCCLKConfig (RCC_PCLK2_Div6) ; // 六分频
	
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_ADC1, ENABLE);

3.ADC的编程接口

4.初始化ADC的基本参数

cs 复制代码
	//#3.初始化ADC的基本参数
	ADC_InitTypeDef ADC_InitStruct = {0};

	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 关连续模式
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;// 右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件启动
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;// 独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1;// 常规序列1个通道
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//关闭扫描模式
	
	ADC_Init (ADC1, &ADC_InitStruct);

5.配置常规序列

6.闭合ADC的总开关

7.启动并读取转换结果

cs 复制代码
	while(1)
	{
		//#1.清除EOc标志位
		ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
		
		//#2.通过软件启动的方式发送脉冲
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);
		
		//#3.等待常规序列转换完成
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)== RESET);
		
		//#4.读取转换的结果
		uint16_t dr = ADC_GetConversionValue(ADC1);
	}

DR里的值转化成电压值

cs 复制代码
		//#5.把结果转换成电压
		float voltage = dr * (3.3f / 4095);

用板载LED显示结果(

输出的电压大于1.5V说明目前光照强度较弱,熄灭最小系统板上的板载LED

输出的电压小于1.5V说明目前光照强度较强,点亮最小系统板上的板载LED

)

cs 复制代码
		if (voltage > 1.5)
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
		}
		else
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
		}

总结:

总代码:

cs 复制代码
#include "stm32f10x.h"

void App_ADC1_Init(void);
void App_OnBoardLED_Init(void);

int main(void)
{
	App_ADC1_Init();
	App_OnBoardLED_Init();
	
	while(1)
	{
		//#1.清除EOc标志位
		ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
		
		//#2.通过软件启动的方式发送脉冲
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);
		
		//#3.等待常规序列转换完成
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)== RESET);
		
		//#4.读取转换的结果
		uint16_t dr = ADC_GetConversionValue(ADC1);
		
		//#5.把结果转换成电压
		float voltage = dr * (3.3f / 4095);
		
		if (voltage > 1.5)
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
		}
		else
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
		}
	}
}

void App_ADC1_Init(void) 
{
	//#1.初始化PA0引脚,模拟模式
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init (GPIOA, &GPIO_InitStruct);
	
	//#2.配置ADc模块的时钟
	RCC_ADCCLKConfig (RCC_PCLK2_Div6) ; // 六分频
	
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_ADC1, ENABLE);
	
	//#3.初始化ADC的基本参数
	ADC_InitTypeDef ADC_InitStruct = {0};

	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 关连续模式
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;// 右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件启动
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;// 独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1;// 常规序列1个通道
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//关闭扫描模式
	
	ADC_Init (ADC1, &ADC_InitStruct);
	
	//#4.配置常规序列
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5) ;
	
	ADC_ExternalTrigConvCmd(ADC1,ENABLE);
	
	//#5.闭合ADC总开关
	ADC_Cmd(ADC1,ENABLE);
}

void App_OnBoardLED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOC, &GPIO_InitStruct);
}
相关推荐
LCG米5 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga9 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡12 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
Zw-awa14 小时前
从 CH340 到 HC-05 和 HC-06:让小车脱离电脑
stm32
硅基手札14 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学16 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_17 小时前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY0920018 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式21 小时前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎1 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机