本帖最后由 jinglixixi_457498010 于 2024-1-7 11:19 编辑

MM32F5333内置了2 个 12 位模拟/数字转换器,单个 ADC的最高转换率可达 3MSPS。
ADC1 和ADC2 最多均可达14 个外部通道,其中 12 个ADC1 和 ADC2的通道在引脚排布上是复用的,因此共有16 个可用的 ADC 外部输入引脚。对于这些复用引脚,可以将ADC1 和 ADC2 并行使用来获得最高 6MSPS 的转换率。
此外,ADC2 还配有 2 个内部通道,分别连接到温度传感器和电压传感器。
在工作方式上,ADC 支持单次单周期和连续扫描转换模式。
通过厂家所提供的例程可学习其使用发及功能的验证,在使用板载信号模拟电路的情况下,可进行多通道数据采集的检测,其效果如图2所示。
image.png
图1信号模拟电路

image.png
图2检测效果

在掌握ADC的用法后,可将NTC热敏电阻与其配合实现温度的检测。NTC热敏电阻的检测电路如图3所示,为了避开信号模拟电路所占用的通道,热敏电阻的信号被连接到PA6。
image.png
图3测温电路

实现该通道数据采集及温度变换的函数为:
void ADC_InjectionChannel_Polling_Sample(void)
  • {
  •     float RVxVoltage];
  •     int u,V;
  •     ADC_Configure();
  •     while (1)
  •     {
  •         ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
  •         while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_INJEOS));
  •         ADC_ClearFlag(ADC1, ADC_FLAG_INJEOS);
  •         RVxVoltage= (float)ADC_GetInjectedChannelConvertedValue(ADC1, ADC_InjectedChannel_3) * (float)3.3 / (float)4096.0;
  •         u=(int)(RVxVoltage*1000);
  •         if((u<=1644)&&(u>1268)) V=10+(1644-u)/37;
  •         if((u<=1268)&&(u>947)) V=20+(1268-u)/32;
  •         if((u<=947)&&(u>692)) V=30+(947-u)/25;
  •         ...
  •         printf("\r\nVoltage=%0.3f mV    T=%d C", RVxVoltage[3],V);
  •         OLED_ShowNum(36,5,V,3,16);
  •         PLATFORM_DelayMS(500);
  •     }
  • }
  • 复制代码

    在连接串口通信的情况下,其测试效果如图4所示。
    image.png
    图4测试结果

    实现图5和图6所示效果的主程序为:
    int main(void)
  • {
  •     PLATFORM_Init();
  •     GPIO_OLED();
  •     Init_OLED();
  •     OLED_Clear();
  •     OLED_ShowString(20,0,"MM32F5333 ",16);
  •     OLED_ShowString(20,2,"NTC  TEST",16);
  •     ADC_InjectionChannel_Polling_Sample();
  •     while (1);
  • }
  • 复制代码

    image.png
    图5室温检测

    image.png
    图6体温检测

    相较于数字式的传感器模块,采用NTC进行温度检测会有更宽的温度检测范围,可用于工业控制等领域。