STM32F103RC 芯片中,ADC(模数转换器)的18个复用通道包括16个外部模拟输入通道(对应GPIO引脚)和2个内部信号通道(温度传感器和内部参考电压)。以下是详细解析:


1. 16个外部通道(IN0~IN15)

  • 作用:测量外部模拟信号(如传感器、电位器、电池电压等)。

  • 对应引脚(以ADC1为例):

    通道编号 引脚 复用功能
    ADC1_IN0 PA0 外部信号输入0
    ADC1_IN1 PA1 外部信号输入1
    ADC1_IN9 PB1 外部信号输入9
    ADC1_IN10 PC0 外部信号输入10
    ADC1_IN11 PC1 外部信号输入11
    ADC1_IN15 PC5 外部信号输入15

    📌 注意

    • STM32F103RC的ADC1和ADC2共享这16个外部通道,ADC3有独立通道(部分型号支持)。
    • 实际可用引脚需参考芯片数据手册的引脚定义表(如PC2~PC5可能用于其他功能)。
  • 关键特性

    • 输入电压范围:0~VREF+(通常接3.3V)。
    • 支持单次/连续转换、扫描模式、DMA传输。

2. 2个内部通道(IN16和IN17)

无需外部引脚,直接测量芯片内部信号:

  1. 温度传感器(IN16)

    • 功能:监测芯片内部温度(精度约±1.5℃)。
    • 启用方法
      ADC_TempSensorVrefintCmd(ENABLE);  // 开启内部通道
      
    • 采样要求
      因高阻抗特性,需设置较长采样时间(推荐239.5周期):
      ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
      
    • 温度计算公式(参考数据手册):
      [
      T(℃) = \frac{(V_{25} - V_{Sense})}{Avg_Slope} + 25
      ]
      其中:
      • (V_{25}):25℃时的传感器电压(典型值1.43V)。
      • (Avg_Slope):温度系数(4.3mV/℃)。
  2. 内部参考电压(IN17)

    • 功能:测量芯片内部基准电压(典型值1.2V),用于校准或电源监测。
    • 使用方法
      ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_239Cycles5);
      
    • 应用场景
      • 检测VDDA电压波动(通过比较VREFINT与理论值)。
      • 提高ADC测量精度(动态校准参考电压)。

3. 通道复用机制

  • 分时复用:通过多路开关(MUX)切换通道,同一时间仅一个通道被采样。

  • 配置方式

    • 规则组(Regular Group):用于常规多通道采样(按顺序转换)。
    • 注入组(Inject Group):用于高优先级中断采样(可打断规则组)。
  • 示例代码(扫描模式测量IN0、IN5、IN16):

    // 配置规则组通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0,  1, ADC_SampleTime_55Cycles5);  // PA0
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5,  2, ADC_SampleTime_55Cycles5);  // PA5
    ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_239Cycles5); // 温度传感器
    
    // 启用扫描模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 3;
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // 启动DMA传输(可选)
    ADC_DMACmd(ADC1, ENABLE);
    

4. 关键注意事项

  1. 参考电压(VREF+)

    • 若需高精度测量,建议外接低噪声基准电压源(如2.5V或3.0V)到VREF+引脚。
    • 默认情况下,VREF+与VDDA(3.3V)相连。
  2. 采样时间选择

    信号类型 推荐采样时间 原因
    外部低阻抗信号 55.5周期 快速稳定(如电位器)
    内部通道 239.5周期 高阻抗信号需更长采样时间
  3. 校准与精度

    • 上电后需执行ADC校准:
      ADC_ResetCalibration(ADC1);
      while(ADC_GetResetCalibrationStatus(ADC1));
      ADC_StartCalibration(ADC1);
      while(ADC_GetCalibrationStatus(ADC1));
      
    • 避免在ADC转换期间操作相关寄存器。

5. STM32F103RC的ADC通道总结

通道类型 通道编号 信号源 典型应用场景
外部通道 IN0~IN15 PA0~PC5 传感器电压、电池监测
温度传感器 IN16 芯片内部温度 过热保护、环境监测
内部参考电压 IN17 VREFINT(≈1.2V) ADC校准、电源稳定性检测

6. 常见问题解答

Q1:如何判断某个引脚是否支持ADC?
A1:查阅芯片数据手册的引脚定义表(Pinout and Pin Definitions),标注"ADCx_INy"的引脚即为ADC通道(如PC3标注"ADC1_IN13"表示支持ADC1通道13)。

Q2:内部温度传感器的测量值为何不准确?
A2:

  • 温度传感器出厂未校准,仅适合监测相对温度变化
  • 确保采样时间≥239.5周期,并参考数据手册的公式计算。

Q3:能否同时使用ADC1和ADC2采样?
A3:可以!ADC1和ADC2可独立工作(需注意通道冲突),例如:

  • ADC1测量IN0(PA0)和IN16(温度)。
  • ADC2测量IN1(PA1)和IN17(VREFINT)。

7. 代码示例:内部温度传感器读取

float Read_ChipTemperature(void) {
    ADC_TempSensorVrefintCmd(ENABLE);  // 开启内部通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    uint16_t adcValue = ADC_GetConversionValue(ADC1);
    
    // 计算温度(公式参考数据手册)
    float V_sense = adcValue * 3.3f / 4095;  // 假设VREF+=3.3V
    float temperature = (1.43f - V_sense) / 0.0043f + 25.0f;
    return temperature;
}

总结

  • STM32F103RC 的18个ADC通道包括16个外部引脚+2个内部信号,通过复用器分时采样。
  • 内部通道(温度/VREFINT)无需外部电路,但需注意采样时间和校准。
  • 多通道应用时,优先使用扫描模式+DMA以提高效率。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐