[APM32E0] 【APM32E030R Micro-EVB开发板评测】+ADC

[复制链接]
meiyaolei 发表于 2025-8-24 21:03 | 显示全部楼层 |阅读模式

在嵌入式应用中,模拟到数字转换器是将现实世界中的模拟信号温度、光照、电压转换为微控制器可以处理的数字值的关键外设。
APM32E030R内置一个12位精度的逐次逼近型ADC,支持多达10个外部通道。
我奖详细评测如何在该开发板上使用ADC,并以​​PA0​​(ADC通道0)为例,读取模拟电压并通过串口打印结果。

一、硬件连接与原理
​​ADC通道与引脚对应关系​​:
APM32E030R的ADC通道0对应引脚为 ​​PA0​​。这是本次评测的目标引脚。
开发板上PA0引脚已引出,方便连接。
8869768ab0d2f9702c.png 1001268ab0d3c1af53.png
二、连接图与解释
​​信号源选择​​
电位器​​:将电位器的三个引脚分别连接到开发板的3.3V、GND和中间引脚连接到PA0。旋转电位器即可改变PA0的输入电压(0~3.3V)。
可调电源​​:使用一个精确的可调电源,将其正极连接到PA0,负极连接到GND。缓慢调节电压进行测试。
分压电路​​:使用两个电阻构成分压电路,为PA0提供一个固定的电压。这样就可以出来一个固定的电压值,这里我用电位器来模拟,就以高低来实现效果。
9944168ab0c44987e8.png
三、代码
  1. void ADC_Isr()
  2. {
  3.     uint32_t adcData = 0;
  4.     uint32_t voltage = 0;

  5.     APM_TINY_LEDOff(LED2);
  6.     APM_TINY_LEDOff(LED3);

  7.     if (ADC_ReadIntFlag(ADC_INT_FLAG_CS) == SET)
  8.     {
  9.         /* The interrupt flag bit must be cleared first. */
  10.         ADC_ClearIntFlag(ADC_INT_FLAG_CS);
  11.         /* Read ADC Conversion value */
  12.         adcData = ADC_ReadConversionValue();
  13.         /*  voltage(mV) =  adcData * (3300mV / 4095) */
  14.         voltage = (adcData * 3300) / 4095;
  15.         /* output to serial port */
  16.         printf("\r\n volatage : %" PRId32 "  mV\r\n", voltage);
  17.                         Delay_2s();
  18.     }

  19.     if (ADC_ReadIntFlag(ADC_INT_FLAG_AWD) == SET)
  20.     {
  21.         /* The interrupt flag bit must be cleared first. */
  22.         ADC_ClearIntFlag(ADC_INT_FLAG_AWD);

  23.         if (adcData < awltVoltage)
  24.         {
  25.             APM_TINY_LEDOn(LED2);
  26.             APM_TINY_LEDOff(LED3);
  27.         }
  28.         else if (adcData > awhtVoltage)
  29.         {
  30.             APM_TINY_LEDOff(LED2);
  31.             APM_TINY_LEDOn(LED3);
  32.         }

  33.         printf("\r\n Analog watchdog interrupt !\r\n");
  34.                                 Delay_2s();
  35.     }
  36. }
  37. int main(void)
  38. {
  39.     APM_TINY_LEDInit(LED2);
  40.     APM_TINY_LEDInit(LED3);
  41.     APM_TINY_COMInit(COM1);
  42.     ADCInit();
  43. Delay_2s();
  44.     printf("The analog watchdog High threshold : %d mV\r\n", (awhtVoltage * 3300) / 4096);
  45.        
  46. Delay_2s();

  47.     printf("The analog watchdog low threshold  : %d mV\r\n", (awltVoltage * 3300) / 4096);

  48.     /* Wait until ADC is ready */
  49.     while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
  50. Delay_2s();
  51.     ADC_StartConversion();
  52. Delay_2s();
  53.     for (;;)
  54.     {
  55.     }
  56. }
四、实际输出结果
1569368ab0bb70cd4d.png

寂静小夜曲 发表于 2025-8-25 14:28 | 显示全部楼层
3300 应该代表着ADC的基准电压吧!
这个是内部产生的,还是咱们取了一个概数啊
cooldog123pp 发表于 2025-8-25 18:28 | 显示全部楼层
APM32E030R内置一个12位精度的逐次逼近型ADC,支持多达10个外部通道。厉害厉害
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

258

主题

829

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部