ADC功能的测试也非常方便,板载了电位器可以让我们非常快速的进行功能测试,硬件原理图如下:
image.png

       可以看到对应的采集引脚是PC2,数据手册中可以看到:
image.png

       PC2对应AIN2,原理图中的命名其实可以统一一下。
       ES32VF2264支持1路高速模数转换器(ADC)。ADC(Analog to Digital Convertor)是12位分辨率的逐次逼近型模数转换器。具有多达20个复用通道,可测量从管脚输入的17个外部信号、3个内部信号(包括1路温感通道、1路1/4VDD和1路内部VREF 1.2V)。这些通道的模数转换可在单次、连续、扫描或不连续采样模式下进行。ADC的结果存储在一个左对齐或右对齐的16位数据寄存器中。
接下来我们进行一下初始化,IO口初始化:
  1. #define ADC_CHANNEL2_PIN  ALD_GPIO_PIN_2
  2. #define ADC_CHANNEL2_PORT GPIOC

  3. void init_adc_pin(void)
  4. {
  5.     /* Initialize adc gpio pin: PC0 */
  6.     ald_gpio_init_t gpio_init;
  7.     memset(&gpio_init, 0x0, sizeof(ald_gpio_init_t));
  8.     gpio_init.mode = ALD_GPIO_MODE_CLOSE;
  9.     gpio_init.pupd = ALD_GPIO_FLOATING;
  10.     gpio_init.odrv = ALD_GPIO_OUT_DRIVE_NORMAL;
  11.     gpio_init.flt  = ALD_GPIO_FILTER_DISABLE;
  12.     gpio_init.type = ALD_GPIO_TYPE_CMOS;
  13.     gpio_init.func = ALD_GPIO_FUNC_0;
  14.     ald_gpio_init(ADC_CHANNEL2_PORT, ADC_CHANNEL2_PIN, &gpio_init);

  15.     return;
  16. }
      adc初始化:
  1. ald_adc_handle_t g_adc_config;
  2. ald_adc_nch_conf_t g_nch_config;

  3. void init_ADC(void)
  4. {

  5.     memset(&g_adc_config, 0x0, sizeof(ald_adc_handle_t));
  6.     memset(&g_nch_config, 0x0, sizeof(ald_adc_nch_conf_t));

  7.     /* Initialize adc */
  8.     g_adc_config.perh            = ADC;
  9.     g_adc_config.init.align      = ALD_ADC_DATAALIGN_RIGHT;
  10.     g_adc_config.init.scan       = ENABLE;
  11.     g_adc_config.init.cont       = DISABLE;
  12.     g_adc_config.init.disc       = ALD_ADC_ALL_DISABLE;
  13.     g_adc_config.init.disc_nr    = ALD_ADC_DISC_NR_1;
  14.     g_adc_config.init.data_bit   = ALD_ADC_CONV_BIT_12;
  15.     g_adc_config.init.div        = ALD_ADC_CKDIV_16;
  16.     g_adc_config.init.nche_sel   = ALD_ADC_NCHESEL_MODE_ALL;
  17.     g_adc_config.init.nch_nr     = ALD_ADC_NCH_NR_1;
  18.     g_adc_config.init.n_ref      = ALD_ADC_NEG_REF_VSS;
  19.     g_adc_config.init.p_ref      = ALD_ADC_POS_REF_VDD;
  20.     g_adc_config.normal_cplt_cbk = normal_convert_complete;
  21.     ALD_ADC_ENABLE(&g_adc_config);
  22.     ALD_ADC_DISABLE(&g_adc_config);
  23.     ald_adc_init(&g_adc_config);

  24.     /* Initialize nromal convert channel */
  25.     g_nch_config.ch   = ALD_ADC_CHANNEL_2;
  26.     g_nch_config.idx  = ALD_ADC_NCH_IDX_1;
  27.     g_nch_config.samp = ALD_ADC_SAMPLETIME_4;
  28.     ald_adc_normal_channel_config(&g_adc_config, &g_nch_config);
  29.    
  30.     ald_mcu_irq_config(ADC_IRQn, 4, ENABLE);
  31. }
      回调函数:
  1. uint32_t g_adc_result;

  2. void normal_convert_complete(ald_adc_handle_t *arg)
  3. {
  4.     g_adc_result = ald_adc_normal_get_value(&g_adc_config) * 3300 / 4095;
  5.     return;
  6. }
      在线调试看一下,我们转动电位器,可以发现g_adc_result的数值不断发生变化。