打印
[STM32H7]

STM32H743-单路ADC-多通道采样

[复制链接]
357|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ADC概述
STM32的ADC(Analog-to-Digital Converter,模拟数字转换器)是STM32微控制器系列中集成的一种功能强大的模块,用于将模拟信号转换为数字信号。

模拟量(Analog Quantity)是指在一个连续范围内可以取任意值的物理量。这种物理量的值可以是任意的实数,通常用来表示那些变化是渐进的、连续的特征,而不是离散的。

模拟量:可以在一个连续的范围内变化,例如温度可以是25.1°C、25.2°C等,具有无限个可能值。

数字量:只能取有限的离散值,例如开关的开(1)和关(0)状态,或者数字传感器读取的值。

使用STM32CubeIDE配置
选择使用的ADC通道



配置ADC的DMA



开启DMA中断



配置一些参数



Clock Prescaler:时钟分频,时钟频率越高,采样速度越快,越费电,精准度也会略微低一点;

Resolution:分辨率,支持6位、8位、10位、12位可选,这个功能不错,不过我默认习惯用12位。

Continuous Convertion Mode:连续转换模式,开启后,AD转换功能一直运行。

Discontinuouse Convertion Mode:非连续转换模式,又叫做间断模式。



应用处理ADC数据
因为STM32H743中拥有高速缓存区(I-Cache和D-Cache),并且已经使能高速缓存区,所以对于DMA的使用会有影响。(关于高速缓存区I-Cache和D-Cache的介绍和对DMA的影响可以自行查询,在本章不过多陈诉)

在DMA的半完成中断和完成中断中,失能接收DMA的数据缓存区,使后面应用拿到的数据是新的;

#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t)220)
ALIGN_32BYTES(uint16_t buf_adc1_value[ADC_CONVERTED_DATA_BUFFER_SIZE]);
__IO uint32_t adc1_conversion_completed = 0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
/* Invalidate Data Cache to get the updated content of the SRAM on the second half of the ADC converted data buffer: 32 bytes */
  if(hadc->Instance == ADC1)
  {
    SCB_InvalidateDCache_by_Addr((uint32_t *) &buf_adc1_value[ADC_CONVERTED_DATA_BUFFER_SIZE/2], ADC_CONVERTED_DATA_BUFFER_SIZE);
    // 转换完成标志置位
    adc1_conversion_completed = 1;
  }
}

void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance == ADC1)
  {
    SCB_InvalidateDCache_by_Addr((uint32_t *) &buf_adc1_value[0], ADC_CONVERTED_DATA_BUFFER_SIZE);
  }
}

//等待ADC采集完毕
adc1_conversion_completed = 0;
  ret = HAL_ADC_Start_DMA(&hadc1, (uint32_t *)buf_adc1_value, ADC_CONVERTED_DATA_BUFFER_SIZE);
  if (ret != HAL_OK)
  {
    printf("\r\n get_adc1_value failed\r\n");
  }
  else
  {
    while (adc1_conversion_completed == 0)
    {
      osDelay(1);
    }
  }

/* 数据分组 将四通道ADC数据分离出来 */
  uint16_t temp = 0;
  for (uint8_t i = 0; i < ADC_CONVERTED_DATA_BUFFER_SIZE;)
  {
    app_at6xx_info.adc_value[0][temp] = buf_adc1_value[i++];
    app_at6xx_info.adc_value[1][temp] = buf_adc1_value[i++];
    app_at6xx_info.adc_value[2][temp] = buf_adc1_value[i++];
    app_at6xx_info.adc_value[3][temp] = buf_adc1_value[i++];
    temp++;
  }

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/sanyuedtaifen/article/details/144963465

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

70

帖子

0

粉丝