某个网站做拍卖预展的好处,wordpress 当前位置 页面,济南环保局官方网站,网站如何做好内链本篇文章主要详细讲述单片机的ADC原理和编程应用#xff0c;希望我的分享对你有所帮助#xff01; 目录 一、STM32ADC概述
1、ADC#xff08;Analog-to-Digital Converter#xff0c;模数转换器#xff09;
2、STM32工作原理 二、STM32ADC编程实战
#xff08;一希望我的分享对你有所帮助 目录 一、STM32ADC概述
1、ADCAnalog-to-Digital Converter模数转换器
2、STM32工作原理 二、STM32ADC编程实战
一、ADC开发的寄存器库函数
二、ADC开发的HAL库
三、实战工程
1、ADC单通道采集
2、ADC多通道采集
三、结语 一、STM32ADC概述
1、ADCAnalog-to-Digital Converter模数转换器 STM32的ADCAnalog-to-Digital Converter模拟数字转换器是STM32微控制器系列中集成的一种功能强大的模块用于将模拟信号转换为数字信号。STM32微控制器广泛应用于嵌入式系统ADC模块在许多应用场景中都至关重要例如传感器读取、信号处理和控制系统。 模拟量Analog Quantity是指在一个连续范围内可以取任意值的物理量。这种物理量的值可以是任意的实数通常用来表示那些变化是渐进的、连续的特征而不是离散的。 模拟量可以在一个连续的范围内变化例如温度可以是25.1°C、25.2°C等具有无限个可能值。数字量只能取有限的离散值例如开关的开1和关0状态或者数字传感器读取的值。 在许多应用中模拟量需要转换为数字量以便进行处理这通常通过模数转换器ADC实现。转换后计算机或微控制器能够以数字形式读取和处理这些信号。 ADC转换模式 单次转换模式Single Conversion ModeADC在每次触发时只进行一次转换。适用于低速、低功耗的应用。 连续转换模式Continuous Conversion ModeADC持续进行转换适用于需要实时监测的应用如信号处理和实时数据采集。 扫描模式Scan ModeADC可以在多个通道间进行扫描每个通道依次进行转换适合多通道数据采集。 触发模式Triggered Mode转换过程由外部信号触发可以是定时器、GPIO引脚等适合需要同步数据采集的场景。 差分模式Differential ModeADC测量两个输入信号的差值提供更高的噪声抗性适用于高精度测量。 伪差分模式Pseudo-Differential Mode其中一个输入端连接到地另一端测量信号适合简单的差分测量。 在ADC模数转换器的应用中通道组可以分为规则通道组Regular Channel Group和注入通道组Injected Channel Group。这两种通道组的主要区别在于它们的工作方式、优先级以及使用场景。 规则通道组Regular Channel Group 定义规则通道组是ADC的主要通道组用于常规的信号采集。它通常用于周期性采集的传感器信号。 特点 持续转换在连续转换模式下规则通道组可以在多个通道间进行循环采样。优先级低相较于注入通道组规则通道组的优先级较低通常用于常规数据的采集。数据存储转换结果通常存储在一个数据寄存器中等待主程序读取。触发方式可以通过定时器、外部事件等方式触发采样。 适用场景适用于需要实时采集且对响应时间要求不高的应用如环境监测、温度传感器等。 注入通道组Injected Channel Group 定义注入通道组用于优先级更高的信号采集通常用于突发事件或特定条件下的快速采样。 特点 高优先级注入通道组具有较高的优先级能够在任何时候中断规则通道组的采样进行数据采集。快速响应适合快速响应的应用如检测瞬时信号变化、故障检测等。独立触发可以独立于规则通道组进行触发支持多种触发源如外部引脚、内部事件等。多个通道通常可以配置多个注入通道进行快速的信号采样。 适用场景适用于需要在特定条件下迅速采集信号的应用如运动控制、脉冲信号采集等。 2、STM32工作原理 STM32包含1~3个12位逐次逼近型的模拟数字转换器。每个ADC最多有18个通道可测量16个外部信号源和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行有规则通道组和注入通道组每次转换结束可产生中断。转换的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 1STM32F103C8T6有2个ADCADC1和ADC2。记为ADCx。 2每个ADC有18个通道。16个外部信号源测量通道ADCx_IN0~ADCx_IN152个内部信号源测量通道。信号源引脚对应如下 ADC的工作过程一般包括以下几个步骤 采样在某个时间点上对模拟信号进行测量获取其电压值。量化将模拟信号的电压值与ADC的参考电压进行比较将其转换为相应的数字值。编码将量化后的结果编码为二进制形式输出给后续的数字电路或处理器。 ADC工作原理思维导图概况如下 STM32F103ADC时钟和采样时间 1、时钟源 STM32F103 的 ADC 通常由 APB2 总线时钟提供时钟。ADC 的最大工作频率为 14 MHz。你需要配置 APB2 时钟通常通过时钟配置寄存器进行配置以确保 ADC 的工作频率在合适范围内。 2、ADC 时钟设置 ADC 时钟的配置可以通过配置系统时钟HSE、HSI 或 PLL来实现。通常在系统初始化时设置。在 ADC 模块中可以通过寄存器设置 ADC 的预分频系数以确保 ADC 时钟不超过最大工作频率。 3、采样时间配置 STM32F103 的 ADC 允许用户根据输入信号的特性选择不同的采样时间。可选的采样时间设置包括 1.5 个 ADC 时钟周期7.5 个 ADC 时钟周期13.5 个 ADC 时钟周期28.5 个 ADC 时钟周期41.5 个 ADC 时钟周期55.5 个 ADC 时钟周期71.5 个 ADC 时钟周期239.5 个 ADC 时钟周期 通过设置 ADC 寄存器中的采样时间字段可以选择合适的采样时间。例如对于快速变化的信号可能选择较短的采样时间而对于慢变化的信号较长的采样时间可以提高测量的准确性。 4、采样时间与转换时间的关系 采样时间加上转换时间组成了每次 ADC 转换的总时间。转换时间对于 STM32F103 的 ADC 是固定的大约为 1.5 个 ADC 时钟周期。 因此总的转换时间公式可以表示为 总时间采样时间1.5xADC时钟周期 二、STM32ADC编程实战 在编程实战之前让我们先来了解一下ADC开发相关的库函数。 一、ADC开发的寄存器库函数 1. ADC初始化函数 void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct) 功能初始化指定的ADC外设。 参数 ADC_TypeDef *ADCx指向ADC外设的指针如ADC1、ADC2。 ADC_InitTypeDef *ADC_InitStruct指向ADC初始化结构的指针包含ADC配置参数。 用途设置ADC的基本参数如分辨率、对齐方式、时钟分频等。 2. 配置ADC通道 void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint32_t Channel, uint32_t Rank, uint32_t SamplingTime) 功能配置ADC的常规通道。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 uint32_t Channel选择要配置的ADC通道。 uint32_t Rank在转换序列中的排名。 uint32_t SamplingTime采样时间配置。 用途配置ADC通道以供后续的采样和转换。 3. 启动和停止ADC转换 void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState) 功能启用或禁用指定的ADC外设。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 FunctionalState NewState功能状态选择ENABLE或DISABLE。 用途控制ADC的开启和关闭。 void ADC_StartConversion(ADC_TypeDef *ADCx) 功能开始ADC的转换。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 用途启动ADC转换过程。 4. 读取ADC转换结果 uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx) 功能获取ADC的转换结果。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 返回值返回ADC转换后的数值。 用途读取转换完成后的结果。 5. 配置DMA支持 void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState) 功能启用或禁用ADC的DMA功能。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 FunctionalState NewState功能状态选择ENABLE或DISABLE。 用途在使用DMA传输ADC数据时配置DMA。 6. 中断支持 void ADC_ITConfig(ADC_TypeDef *ADCx, uint32_t ADC_IT, FunctionalState NewState) 功能启用或禁用ADC中断。 参数 ADC_TypeDef *ADCx指向ADC外设的指针。 uint32_t ADC_IT选择中断源。 FunctionalState NewState功能状态选择ENABLE或DISABLE。 用途控制ADC的中断行为。 7. 中断回调函数 在使用中断时需要定义回调函数以处理ADC转换完成的事件。 void ADC1_2_IRQHandler(void) {if (ADC_GetITStatus(ADC1, ADC_IT_EOC) ! RESET) {// 处理ADC转换完成uint16_t adcValue ADC_GetConversionValue(ADC1);// 清除中断标志ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);}
}二、ADC开发的HAL库 1. ADC初始化函数 HAL_ADC_Init() 功能初始化ADC外设。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针结构体中包含ADC的配置参数。 返回值HAL库返回状态通常为HAL_OK成功或错误代码。 用途设置ADC的基本参数如分辨率、对齐方式、扫描模式等。 2. ADC通道配置函数 HAL_ADC_ConfigChannel() 功能配置指定的ADC通道。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 ADC_ChannelConfTypeDef *sConfig指向通道配置结构的指针包含通道选择、采样时间等。 返回值HAL库返回状态通常为HAL_OK成功或错误代码。 用途设置通道的采样时间和输入模式等参数。 3. 启动和停止ADC转换 HAL_ADC_Start() 功能启动ADC转换。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 返回值HAL库返回状态。 用途使ADC开始进行转换。 HAL_ADC_Stop() 功能停止ADC转换。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 返回值HAL库返回状态。 用途结束ADC转换过程释放资源。 4. 读取ADC转换结果 HAL_ADC_PollForConversion() 功能等待ADC转换完成轮询方式。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 uint32_t Timeout等待超时的时间单位毫秒。 返回值HAL库返回状态通常为HAL_OK成功或超时错误代码。 用途在转换过程中进行轮询直到转换完成。 HAL_ADC_GetValue() 功能获取ADC转换结果。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 返回值ADC的转换结果。 用途在转换完成后读取结果值。 5. DMA支持 HAL_ADC_Start_DMA() 功能启动ADC转换并通过DMA传输数据。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 uint32_t *pData指向存储结果的缓冲区指针。 uint32_t Length缓冲区的长度。 返回值HAL库返回状态。 用途使用DMA提高数据传输效率。 6. 中断支持 HAL_ADC_Start_IT() 功能启动ADC转换并使能中断。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 返回值HAL库返回状态。 用途在需要中断处理的应用中使用。 7. 中断回调函数 HAL_ADC_ConvCpltCallback() 功能ADC转换完成时的回调函数。 参数 ADC_HandleTypeDef *hadc指向ADC句柄的指针。 用途在此函数中处理转换结果。 三、实战工程
1、ADC单通道采集
#include stm32f10x.h // 引入 STM32F10x 设备头文件包含特定于设备的定义和功能// 初始化 ADC (模数转换器)
void AD_Init(void)
{// 使能 ADC1 的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// 使能 GPIOA 的时钟以便配置 GPIO 引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置 ADC 时钟为 PCLK2 的 1/6RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 定义一个 GPIO 初始化结构体GPIO_InitTypeDef GPIO_InitStructure;// 设置引脚模式为模拟输入GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;// 设置要配置的引脚为 PA0GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;// 设置 GPIO 引脚的速度为 50MHzGPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;// 初始化 GPIOAGPIO_Init(GPIOA, GPIO_InitStructure);// 配置 ADC 的常规通道设置通道为 ADC_Channel_0序列为 1采样时间为 55.5 个周期ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);// 定义一个 ADC 初始化结构体ADC_InitTypeDef ADC_InitStructure;// 设置 ADC 工作模式为独立模式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;// 设置转换通道数量为 1ADC_InitStructure.ADC_NbrOfChannel 1;// 初始化 ADC1ADC_Init(ADC1, ADC_InitStructure);// 使能 ADC1ADC_Cmd(ADC1, ENABLE);// 复位 ADC 校准寄存器ADC_ResetCalibration(ADC1);// 等待复位完成while (ADC_GetResetCalibrationStatus(ADC1) SET);// 开始 ADC 校准ADC_StartCalibration(ADC1);// 等待校准完成while (ADC_GetCalibrationStatus(ADC1) SET);
}// 获取 ADC 转换值的函数
uint16_t AD_GetValue(void)
{// 启动软件触发的 ADC 转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待转换完成标志位设置while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET);// 返回 ADC 转换结果return ADC_GetConversionValue(ADC1);
}2、ADC多通道采集
#include stm32f10x.h // 引入 STM32F10x 设备头文件包含特定于设备的定义和功能// 初始化 ADC (模数转换器)
void AD_Init(void)
{// 使能 ADC1 的时钟确保 ADC1 可以正常工作RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// 使能 GPIOA 的时钟以便配置 GPIO 引脚用于 ADCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置 ADC 时钟为 PCLK2 的 1/6RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 定义一个 GPIO 初始化结构体用于设置 GPIO 的模式和速度GPIO_InitTypeDef GPIO_InitStructure;// 设置 GPIO 模式为模拟输入 (AIN)GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;// 设置要配置的引脚为 PA0, PA1, PA2 和 PA3GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;// 设置 GPIO 引脚的速度为 50MHzGPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;// 初始化 GPIOA应用上面的配置GPIO_Init(GPIOA, GPIO_InitStructure);// 定义一个 ADC 初始化结构体用于配置 ADC 参数ADC_InitTypeDef ADC_InitStructure;// 设置 ADC 工作模式为独立模式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;// 设置转换通道数量为 1ADC_InitStructure.ADC_NbrOfChannel 1;// 初始化 ADC1应用上面的配置ADC_Init(ADC1, ADC_InitStructure);// 使能 ADC1ADC_Cmd(ADC1, ENABLE);// 复位 ADC 校准寄存器ADC_ResetCalibration(ADC1);// 等待复位完成while (ADC_GetResetCalibrationStatus(ADC1) SET);// 开始 ADC 校准ADC_StartCalibration(ADC1);// 等待校准完成while (ADC_GetCalibrationStatus(ADC1) SET);
}// 获取指定 ADC 通道的转换值
uint16_t AD_GetValue(uint8_t ADC_Channel)
{// 配置 ADC 通道设置通道、序列和采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);// 启动软件触发的 ADC 转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待转换完成标志位设置while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET);// 返回 ADC 转换结果return ADC_GetConversionValue(ADC1);
}三、结语 关于STM32单片机的ADC原理及编程实现就分享到此了希望我的分享对你有所帮助 关于以上工程的源代码大家可以私信我收到后我会第一时间回复也可以回复“STM32ADC”