STM32F103C8T6 ADC1 连续采样和单次采样配置教程
STM32F103C8T6 ADC1 连续采样和单次采样配置教程
本教程将介绍如何使用 STM32F103C8T6 芯片的 ADC1 模块,实现 ADC 连续采样(通道 1)和单次采样(通道 2)的配置方法,并提供代码示例。
目标:
- 使用 ADC1 完成 ADC 采样任务,不使用 ADC2 的资源。
- 通道 1 需要连续转换,周期在 10us 以内。
- 通道 2 需要 50ms 转换一次,优先级不高,甚至 100ms 转换一次都是可以被允许的。
配置步骤:
-
初始化 ADC1 模块:
- 设置 ADC 时钟:使用默认的 APB2 时钟(一般为 72MHz)。
- 使能 ADC1 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)。 - 设置 ADC1 为独立模式:
ADC_CommonInitTypeDef.ADC_Mode = ADC_Mode_Independent。 - 初始化 ADC1:
ADC_Init(ADC1, &ADC_InitStructure)。 - 使能 ADC1:
ADC_Cmd(ADC1, ENABLE)。
-
配置 ADC1 的通道 1 (ch1):
- 设置 ADC1 的转换模式:
ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous。 - 设置 ADC1 的转换通道:
ADC_InitStructure.ADC_RegularChannelConfig = ADC_Channel_1。 - 设置 ADC1 的采样时间:
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_XXcycles(根据实际需求设置)。 - 配置 ADC1 的转换参数:
ADC_Init(ADC1, &ADC_InitStructure)。 - 使能 ADC1 的通道 1:
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_XXcycles)。
- 设置 ADC1 的转换模式:
-
配置 ADC1 的通道 2 (ch2):
- 设置 ADC1 的转换模式:
ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous。 - 设置 ADC1 的转换通道:
ADC_InitStructure.ADC_RegularChannelConfig = ADC_Channel_2。 - 设置 ADC1 的采样时间:
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_XXcycles(根据实际需求设置)。 - 配置 ADC1 的转换参数:
ADC_Init(ADC1, &ADC_InitStructure)。 - 使能 ADC1 的通道 2:
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_XXcycles)。
- 设置 ADC1 的转换模式:
-
配置 ADC1 的转换触发源和优先级:
- 设置 ADC1 的转换触发源:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None。 - 设置 ADC1 的转换优先级:
ADC_InitStructure.ADC_RegularPriority = ADC_PriorityLevel_X(根据实际需求设置)。 - 配置 ADC1 的转换触发源和优先级:
ADC_Init(ADC1, &ADC_InitStructure)。
- 设置 ADC1 的转换触发源:
-
启动 ADC1 的转换:
- 启动 ADC1 的软件触发转换:
ADC_SoftwareStartConvCmd(ADC1, ENABLE)。
- 启动 ADC1 的软件触发转换:
-
在需要的地方读取 ADC1 的转换结果:
- 等待 ADC1 的转换完成:
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)。 - 读取 ADC1 的转换结果:
uint16_t adcResult = ADC_GetConversionValue(ADC1)。
- 等待 ADC1 的转换完成:
代码示例:
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc1;
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hadc->Instance==ADC1)
{
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**ADC1 GPIO Configuration
PA1 ------> ADC1_IN1
PA2 ------> ADC1_IN2
*/
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
/* Peripheral clock disable */
__HAL_RCC_ADC1_CLK_DISABLE();
/**ADC1 GPIO Configuration
PA1 ------> ADC1_IN1
PA2 ------> ADC1_IN2
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2);
}
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
uint16_t adcResult = HAL_ADC_GetValue(&hadc1);
// 使用 adcResult 进行后续处理
}
}
注意:
- 以上代码示例仅供参考,实际代码实现需要根据使用的开发环境和库函数进行调整。
- 采样时间
ADC_SampleTime_XXcycles需要根据实际需求设置,建议参考 STM32 的参考手册。 - 优先级
ADC_PriorityLevel_X需要根据实际需求设置,建议参考 STM32 的参考手册。 - 转换触发源
ADC_ExternalTrigConv_None可根据实际需求进行调整,例如使用定时器触发等。 - 转换结果的读取需要等待 ADC1 的转换完成,可以使用
HAL_ADC_PollForConversion()函数进行等待。 - 转换结果的存储和处理需要根据实际需求进行设计。
原文地址: https://www.cveoy.top/t/topic/br99 著作权归作者所有。请勿转载和采集!