函数原型分析

void ADC_RegularChannelConfig(
    ADC_TypeDef* ADCx,          // ADC外设(如ADC1、ADC2)
    uint8_t ADC_Channel,        // 通道号(0-17,具体取决于型号)
    uint8_t Rank,               // 规则组中的转换顺序(1-16)
    uint8_t ADC_SampleTime      // 采样时间(时钟周期数)
);

参数详解(以您的调用为例)

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
参数 说明
ADCx ADC1 选择ADC1外设
ADC_Channel ADC_Channel_0 选择通道0(对应GPIO引脚PA0)
Rank 1 规则组转换序列中的第1个位置
ADC_SampleTime ADC_SampleTime_55Cycles5 采样时间=55.5个ADC时钟周期(中速采样,适合大多数模拟信号)

关键概念解析

1. 规则组(Regular Group)
  • STM32的ADC有两种转换组:

    • 规则组:用于常规通道转换(最多16个通道按顺序转换)

    • 注入组:用于高优先级中断插入的转换(类似"插队"机制)

  • 您配置的是规则组,适用于大多数普通场景。

2. Rank(转换顺序)
  • 决定通道在规则组中的转换优先级

  • 范围1-16,数值越小优先级越高

  • 示例:若配置3个通道:

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ...); // 第1转换
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ...); // 第2转换
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ...); // 第3转换

3. 采样时间(ADC_SampleTime)
宏定义 采样周期数 适用场景
ADC_SampleTime_1Cycles5 1.5 高速信号(>1MHz)
ADC_SampleTime_7Cycles5 7.5 中高速信号
ADC_SampleTime_13Cycles5 13.5 通用场景
ADC_SampleTime_28Cycles5 28.5 高阻抗信号(如温度传感器)
ADC_SampleTime_41Cycles5 41.5 超高阻抗源
ADC_SampleTime_55Cycles5 55.5 您选择的配置(平衡速度和精度)
ADC_SampleTime_71Cycles5 71.5 超低噪声应用
ADC_SampleTime_239Cycles5 239.5 最慢但精度最高

选择原则
输入信号源阻抗越高,需要更长的采样时间以保证电容充电充分。


硬件连接对应关系

对于STM32F103系列:

  • ADC_Channel_0 → PA0引脚

  • ADC_Channel_1 → PA1引脚

  • ...

  • ADC_Channel_15 → PC5引脚

注意:具体通道对应引脚需查阅芯片数据手册的"Pinout and pin description"章节


完整配置流程示例

// 1. 配置GPIO为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// 2. 配置ADC规则通道
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

// 3. ADC基础配置(单次转换模式)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &ADC_InitStructure);

// 4. 启动转换并读取
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
uint16_t value = ADC_GetConversionValue(ADC1);

常见问题解答

Q1:如果多个通道使用相同的Rank会怎样?
A1:后配置的通道会覆盖之前的配置,最终只有最后一个通道生效。

Q2:采样时间如何影响转换结果?
A2:采样时间不足会导致:

  • 输入电容充电不充分

  • 转换结果低于实际电压值

  • 数据出现规律性波动

Q3:规则组和注入组能否同时使用?
A3:可以,但注入组会中断规则组的转换(类似中断嵌套)。


进阶技巧

  1. 动态修改采样时间

    // 运行时调整通道0的采样时间
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);

  2. 多通道扫描模式配置

    // 通道1第1顺位,通道5第2顺位
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_28Cycles5);
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 2;

  3. 配合DMA自动传输

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adc_values;
    DMA_InitStructure.DMA_BufferSize = 2; // 传输2个通道数据

Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐