Xiashiqi 发表于 2025-1-9 19:17

STM32H743-单路ADC-多通道采样

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);
__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);
    // 转换完成标志置位
    adc1_conversion_completed = 1;
}
}

void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1)
{
    SCB_InvalidateDCache_by_Addr((uint32_t *) &buf_adc1_value, 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 = buf_adc1_value;
    app_at6xx_info.adc_value = buf_adc1_value;
    app_at6xx_info.adc_value = buf_adc1_value;
    app_at6xx_info.adc_value = buf_adc1_value;
    temp++;
}

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

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

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

页: [1]
查看完整版本: STM32H743-单路ADC-多通道采样