STM32 ADC单通道

ADC简介

  1. ADC(Analog-Digitial Converter)模拟-数字转化器。
  2. ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。
  3. 12位逐字逼近型ADC,1us转化时间(1MHz)。
  4. 输入电压范围:0-3.3V,转化结果范围:0-4095(0到2的12次方-1)
  5. 18个输入通道,可测量16个外部(GPIO)和2个内部信号源(内部温度传感器和内部参考电压1.2V)。
  6. 规则组(常规)和注入组(特殊)两个转换单元。
  7. 模拟看门狗自动检测输入电压范围。
  8. STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
  9. PWM波实现了DAC的功能,PWM只有完全导通和完全断开两种状态(无功率损耗),使用大功率电机,使用PWM比使用DAC更好,PWM挤占了DAC很多应用空间。
  10. DAC 应用于信号发生器,音频解码器芯片。

逐次逼近型ADC

逐次逼近型ADC
11. 地址锁存和译码 :这部分用于Enable通道选择开关,ALE用于Enable器件,ADDA、ADDB、ADDC为地址码,输入对应的地址码让通道选择开关选择对应IN0、IN1等等输入。
12. CLOCK、START :CLOCK选择ADC时钟信号、START选择开始信号
13. EOC :ADC完成转化之后输出的信号
14. 逐字逼近寄存器SAR : 通过比较器比较INx,对寄存器中位数逐一比较,大于等一的该位置1,否则置0.,该寄存器十六位,只选择12位作为逐一比较,选择靠右对齐即可。

ADC基本结构

在这里插入图片描述

  1. 开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK分频器也需要配置一下
  2. 配置GPIO,把需要的GPIO配置成模拟输入的模式
  3. 配置多路开关,将左边的通道接入到右边的规则组表里(即选择合适通道)
  4. 配置ADC转化器(结构体配置)
  5. 如果开启看门狗,在中断输出控制里用ITConfig函数开启对应的中断输出。然后在NIVC里配置优先级(选)
  6. 开启ADC、校准

规则组常用四种模式

  1. 单次转化,非扫描模式
  2. 单次转化,扫描模式
  3. 连续,非扫描模式
  4. 连续,扫描模式(使用DMA最好)

代码实现

  1. 开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK分频器也需要配置一下
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);		//72MHz / 6 = 12MHz

这里开启APB2上的GPIOA、ADC两个外设,ADC外设需要进行分屏输入START

  1. 配置GPIO,把需要的GPIO配置成模拟输入的模式
	GPIO_InitTypeDef GPIO_InitTypeDefStructure;
	GPIO_InitTypeDefStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitTypeDefStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitTypeDefStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitTypeDefStructure);
  1. 配置多路开关,将左边的通道接入到右边的规则组表里(即选择合适通道),这里STM32有一个函数ADC_RegularChannelConfig 可配置通道以及规则组,如何需要配置注入组ADC_InjectedChannelConfig 配置,这里选择配置规则组。
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		// 55.5 + 12.5 = 68 ADCCLK period
  1. 配置ADC转化器(结构体配置)选择连续非扫描模式
ADC_InitTypeDef ADC_InitTypeDefStructure;
	ADC_InitTypeDefStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitTypeDefStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitTypeDefStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;		//Non Need EXT(软件触发)
	ADC_InitTypeDefStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitTypeDefStructure.ADC_NbrOfChannel = 1;									//有多少个序列
	ADC_InitTypeDefStructure.ADC_ScanConvMode = DISABLE;
	ADC_Init(ADC1, &ADC_InitTypeDefStructure);
	
	ADC_Cmd(ADC1, ENABLE);
  1. 开启ADC、校准(固定搭配)
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	

完整代码:

#include "stm32f10x.h"                  // Device header
/**
  ******************************************************************************
	1、开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK分频器也需要配置一下
	2、配置GPIO,把需要的GPIO配置成模拟输入的模式
	3、配置多路开关,将左边的通道接入到右边的规则组表里
	4、配置ADC转化器(结构体配置)
	5、如果开启看门狗,在中断输出控制里用ITConfig函数开启对应的中断输出。然后在NIVC里配置优先级(选)
	6、开启ADC、校准
  ******************************************************************************
  */
uint16_t WatchDogSignal;
void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);		//72MHz / 6 = 12MHz
	
	GPIO_InitTypeDef GPIO_InitTypeDefStructure;
	GPIO_InitTypeDefStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitTypeDefStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitTypeDefStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitTypeDefStructure);
	
//	配置规则组
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		// 55.5 + 12.5 = 68 ADCCLK period
//	//非连续单通道
	
//	ADC_InitTypeDef ADC_InitTypeDefStructure;
//	ADC_InitTypeDefStructure.ADC_ContinuousConvMode = DISABLE;
//	ADC_InitTypeDefStructure.ADC_DataAlign = ADC_DataAlign_Right;
//	ADC_InitTypeDefStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;		//Non Need EXT(软件触发)
//	ADC_InitTypeDefStructure.ADC_Mode = ADC_Mode_Independent;
//	ADC_InitTypeDefStructure.ADC_NbrOfChannel = 1;									//有多少个序列
//	ADC_InitTypeDefStructure.ADC_ScanConvMode = DISABLE;
//	ADC_Init(ADC1, &ADC_InitTypeDefStructure);
	

	ADC_InitTypeDef ADC_InitTypeDefStructure;
	ADC_InitTypeDefStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitTypeDefStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitTypeDefStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;		//Non Need EXT(软件触发)
	ADC_InitTypeDefStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitTypeDefStructure.ADC_NbrOfChannel = 1;									//有多少个序列
	ADC_InitTypeDefStructure.ADC_ScanConvMode = DISABLE;
	ADC_Init(ADC1, &ADC_InitTypeDefStructure);
	
	ADC_Cmd(ADC1, ENABLE);
	
	/*	校准	*/
	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_SoftwareStartConvCmd(ADC1, ENABLE);						// 使用软件触发
//	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); 	// 68 period / 12MHz = 5.6us
	return ADC_GetConversionValue(ADC1);						// 读取寄存器并自动清除EOC标志位
}


根据提供的引用内容,可以看出在使用STM32ADC单通道采集DMA时,需要进行以下配置: 1. 首先,在.h文件中定义了一些宏和结构体,包括过滤器数量、ADC转换值数组、判断完成标志位等。同时也定义了ADC的GPIO引脚、时钟、通道等信息,以及ADC的DR寄存器地址和DMA的时钟、通道、流等信息。 2. 在.c文件中,需要实现VOL_ADC_Init()函数和Get_Voltage()函数。VOL_ADC_Init()函数用于初始化ADC和DMA的相关配置,包括GPIO的初始化、ADC的时钟使能、通道配置、DMA的时钟使能、通道和流配置等。Get_Voltage()函数用于启动ADC的DMA传输,并获取采集到的值。 3. 在DMA的中断处理函数DMA2_Stream0_IRQHandler()中,当DMA转换完毕时,需要关闭ADC并设置标志位,以表示采集完成。 综上所述,使用STM32ADC单通道采集DMA时,需要进行ADC和DMA的相关配置,并在中断处理函数中处理采集完成的情况。 #### 引用[.reference_title] - *1* *3* [STM32F4 ADC+DMA单通道采集](https://blog.csdn.net/weixin_43512696/article/details/126489564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32CubeMX关于ADC采集DMA传输](https://blog.csdn.net/m0_51274562/article/details/126911833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

威威轮到我了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值