STM32F0_CubeMX配置ADC采样 - 单通道、单通道中断、多通道、多通道DMA传输

STM32F0_CubeMX配置ADC单通道采样


CubeMX中ADC配置参数

配置项参数
ADC_Seting
ADC设置
Clock Prescaler(时钟预分频)1、Asynchronous clock mode(异步时钟模式)
2、Synchronous clock mode divided by 2(同步时钟模式2分频)
2、Synchronous clock mode divided by 4 (同步时钟模式4分频)
Resolution(分辨率)1、ADC 12-bit resolution(12位分辨率)
2、ADC 10-bit resolution(10位分辨率)
3、ADC 8-bit resolution(8位分辨率)
4、ADC 6-bit resolution(6位分辨率)
Data Alignment(数据对齐)1、Right alignment (右对齐)
2、Left alignment(左对齐)
Scan Conversion Mode(扫描转换模式)1、Forward (从前往后)
2、Backward(从后往前)
Continuous Conversion Mode(连续转换模式)1、Disabled
2、Enable
Discontinuous Conversion Mode(非连续转换模式)1、Disabled
2、Enable
DMA Continuous Reqursts(DMA转换请求)1、Disabled
2、Enable
End Of Conversion Selection(转换选择结束)1、End of single conversion(单次转换结束)
2、End of sequence of converslon (顺序转换结束)
Overrun behaviour(数据溢出)1、Overrun data preserved(保存溢出数据)
2、Overrun data overwritten(覆盖溢出数据)
Low Power Auto Wait(低功耗自动等待)1、Disabled
2、Enable
Low Power Auto Power Off(低功耗自动关机)1、Disabled
2、Enable
ADC Regular ConversionMode
ADC规则转换模式
Sampling Time(采样时间)1、1.5 Cycles
2、7.5 Cycles
3、13.5 Cycles
4、28.5 Cycles
5、41.5 Cycles
6、55.5 Cycles
7、71.5 Cycles
8、239.5 Cycles
External Trigger Conversion Source(外部触发源)1、Reqular Conversion launched by software(由软件启动的规则转换)
2、Timer 1 Trigger Out event(定时器1触发输出事件)
3、Timer 1 Capture Compare 4 event(定时器1捕获比较4事件)
3、Timer 2 Trigger Out event(定时器2触发输出事件)
4、Timer 3 Trigger Out event(定时器3触发输出事件)
External Trigger Conversion Edge(外部触发源边沿)1、Trigger detection on the rising edge(上升沿触发检测)
2、Trigger detection on the falling edge(下升沿触发检测)
3、Trigger detection on the rising and fallings edge(在上升和下降沿触发检测)
WatchDog
看门狗
Enable Analog WatchDog Mode(开启模拟看门狗模式)
Low Threshold(低阈值)

理解与注释

Scan Conversion Mode(扫面转换模式)

Scan Conversion Mode是指STM32微控制器内部模数转换器(ADC)的一种工作模式,这种模式特别适用于需要依次采集多个模拟输入通道的情形。

在Scan Conversion Mode下,ADC能够按照预先设定的顺序连续或循环地转换多个通道的输入信号。具体来说:

  • 当Scan Conversion Mode配置为(Forward),ADC会按照用户在序列寄存器中配置的通道顺序从前向后逐个转换各个通道的数据。
  • 当Scan Conversion Mode配置为(Backward),ADC会按照用户在序列寄存器中配置的通道顺序从后往前逐个转换各个通道的数据。

Continuous Conversion Mode(连续转换模式)

  • 如果是Discontinuous Conversion Mode(间断模式)也被使能,ADC会在完成一轮预设通道序列后停止转换,直到再次触发。
  • 若Continuous Conversion Mode(连续转换模式)也被使能,ADC将在完成一轮通道扫描后自动从头开始下一轮转换,形成一个连续不断的过程。

通过结合Scan Conversion Mode和Continuous Conversion Mode,开发者可以根据实际应用需求实现对多个模拟信号的同时监测或者周期性采样。通常配合DMA(直接内存访问)传输功能可以更高效地获取并处理转换后的数据,避免在转换过程中丢失数据。

Sampling Time-采样时间

和采样的精准度有关系

End Of Conversion Selection(转换结束选择)

“End Of Conversion Selection”(EOC Selection,转换结束选择)是一个与ADC模数转换过程相关的配置选项。这个选项用于决定何时产生一个ADC转换结束事件(EOC,End Of Conversion)信号。

ADC在完成一次模拟信号到数字信号的转换后,会生成一个EOC标志位或中断请求信号。End Of Conversion Selection允许你选择是在每个通道转换结束后还是在一个序列(即多个通道顺序转换完成后)结束时触发EOC信号。

  • 对于单通道转换,EOC通常表示该通道的转换已经完成,数据已准备好在结果寄存器中读取。
  • 对于多通道顺序转换(Scan Conversion Mode),EOC Selection可能允许你选择:
    • 在每个通道转换完毕后立即产生EOC信号,这样可以针对每个通道单独响应。
    • 在整个通道序列转换完成后才产生EOC信号,这样在所有通道转换完毕后再统一处理数据。

根据应用的具体需求,可以通过相应的寄存器配置来选择EOC事件触发的时机,以便正确地读取数据或执行后续处理操作。

Overrun behavior(溢出行为)

Overrun behavior(溢出行为)特指在ADC连续转换或扫描转换期间,当一个新的转换结果被存储到数据寄存器(通常是ADC_DR)时,如果前面的转换结果还没有被读取,则会发生ADC数据溢出。

具体来说,在ADC连续工作模式下,如果连续不断地进行模数转换并且没有及时将转换结果读取至CPU缓存或通过DMA(直接内存访问)传输到指定内存区域,当新的转换结果准备写入ADC数据寄存器时,先前未读取的结果将会被新数据覆盖,这就发生了Overrun情况。

在STM32F031的ADC模块中,一旦发生Overrun,相关的 overrun 标志位(如ADC_SR中的OVR标志)会被硬件自动置位,表明发生了数据溢出事件。为了防止数据丢失和正确处理这种情况,应用程序应当定期检查这个标志位,并采取适当措施(如立即读取和处理ADC数据,或通过DMA方式自动传输数据)来避免连续的Overrun事件发生。同时,在每次读取ADC数据之前,通常需要清除Overrun标志以确认并处理这一事件。

ADC 采样单通道读取示例

参数配置

在这里插入图片描述
在这里插入图片描述

示例代码

配置采样通道 AN0

/**
  * @brief  获取ADC的采样结果
  * @param  无
  * @retval uint16_t ADC_Value;
  */
uint16_t drv_adc_get_value(void)
{
	uint16_t ADC_Value;
	HAL_ADC_Start(&hadc);														//开启ADC,开启常规组转换
	HAL_ADC_PollForConversion(&hadc,50);										//等待常规组转换完成。
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))			//判断通道转换已完成 HAL_ADC_STATE_REG_EOC是否为1
	{
		ADC_Value = HAL_ADC_GetValue(&hadc);
	}
	return ADC_Value;
}
uint16_t sample_ch0_value;
 
void user_1ms_Task(void)
{
	sample_ch0_value = drv_adc_get_value();
}

ADC 采样多通道读取示例

参数配置

在这里插入图片描述

示例代码

配置采样通道 AN0、AN1、AN4、AN5

/**
  * @brief  获取ADC的采样结果
  * @param  无
  * @retval uint16_t ADC_Value;
  */
uint16_t drv_adc_get_value(void)
{
	uint16_t ADC_Value;
	HAL_ADC_Start(&hadc);														//开启ADC,开启常规组转换
	HAL_ADC_PollForConversion(&hadc,50);										//等待常规组转换完成。
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))			//判断通道转换已完成 HAL_ADC_STATE_REG_EOC是否为1
	{
		ADC_Value = HAL_ADC_GetValue(&hadc);
	}
	return ADC_Value;
}

uint16_t sample_value[4];

void user_100ms_Task(void)
{
	static uint8_t i;
	for(i=0;i<4;i++)
	{
		sample_value[i] = drv_adc_get_value();
	}
	HAL_ADC_Stop (&hadc);
}

ADC 采样单通道中断读取示例

参数配置

在这里插入图片描述
勾选ADC中断使能
在这里插入图片描述

示例代码

配置采样通道 AN0
ADC中断的回调函数代码

uint16_t adc_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc_t)
{
	if(hadc_t == &hadc)
	{
		uint16_t adc_value = HAL_ADC_GetValue(hadc_t);
		printf("refresh adc value:%1.3fV\r\n", adc_value*3.3/4096.0);
		
		HAL_ADC_Start_IT(&hadc);	// 重新开启ADC中断
	}
}

主函数main

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_ADC_Init();
  /* USER CODE BEGIN 2 */
	HAL_ADC_Start_IT(&hadc);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  user_main_Task();
  }
  /* USER CODE END 3 */
}

ADC 采样多通道DMA读取示例

参数配置

在这里插入图片描述
在这里插入图片描述

示例代码

配置采样通道 AN0、AN1、AN4、AN5

uint16_t adc_dma_address_value[4] = {0};

int main(void)
{
  /* USER CODE BEGIN 1 */
	
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC_Init();
  /* USER CODE BEGIN 2 */
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_ADCEx_Calibration_Start(&hadc);
  HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_dma_address_value, 4);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	printf("-------------------- \r\n");
	printf("adc value[0]:%1.3fV \r\n", adc_dma_address_value[0]/4096.0*3.3);
	printf("adc value[1]:%1.3fV \r\n", adc_dma_address_value[1]/4096.0*3.3);
	printf("adc value[2]:%1.3fV \r\n", adc_dma_address_value[2]/4096.0*3.3);
	printf("adc value[3]:%1.3fV \r\n", adc_dma_address_value[3]/4096.0*3.3);


  }
  /* USER CODE END 3 */
}

  • 39
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式Stark

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

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

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

打赏作者

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

抵扣说明:

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

余额充值