You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在STM32CubeIDE中创建数组并填充ADC采集的LDR值(STM32L476G)

实现LDR ADC采集值存入数组的方案

1. 定义ADC采集数组

在你的/*User Begin PV*/和/*User End PV*/区间添加数组定义(全局变量便于DMA直接访问):

/*User Begin PV*/
#define ADC_LDR_BUFFER_SIZE 10  // 可根据需求调整数组长度
uint16_t adc_ldr_buffer[ADC_LDR_BUFFER_SIZE] = {0};  // 存储LDR采集值的数组
uint16_t value_DAC = 0;uint16_t value_ADC =0;uint32_t state_DAC = 0;
/*User End PV*/

2. 修改ADC DMA启动配置

将原单值采集逻辑改为数组批量采集,若需要持续循环填充数组,需确保DMA配置为循环模式:

/*User Begin 2*/
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); // Calibrate ADC

// 调整DMA启动参数,指向数组首地址,传输长度设为数组大小
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_ldr_buffer, ADC_LDR_BUFFER_SIZE);

// 前置配置:在STM32CubeMX中找到对应ADC的DMA通道,将Mode设为Circular(循环模式)
// 若仅需单次采集一轮数组,保持Normal模式即可

HAL_DAC_Start(&hdac1, DAC_CHANNEL_2); // Start the DAC
/*User End 2*/

3. 处理DMA采集完成回调

当DMA完成一轮数组填充后,会触发HAL_ADC_ConvCpltCallback函数,可在此对采集到的LDR数据做后续处理:

/*User Begin 4*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance == ADC1)
  {
    // 此时adc_ldr_buffer已存满LDR的采集值
    // 示例:计算数组平均值
    uint32_t sum = 0;
    for(int i=0; i<ADC_LDR_BUFFER_SIZE; i++)
    {
      sum += adc_ldr_buffer[i];
    }
    uint16_t avg_value = sum / ADC_LDR_BUFFER_SIZE;
    
    // 可添加自定义业务逻辑,比如将平均值输出到DAC
    value_DAC = avg_value;
    HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value_DAC);
  }
}
/*User End 4*/

核心注意事项

  • DMA模式:循环模式下,DMA会自动重复填充数组;正常模式下仅完成一轮采集后停止。
  • 内存增量:确保CubeMX中DMA配置开启Memory Increment(默认开启),否则DMA会一直覆盖数组第一个元素。
  • 数据类型匹配:ADC为12位采集,uint16_t类型刚好适配,无需额外类型转换。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:13:31