【东软载波ESF0654 PDS开发板活动】测试ADC功能

2020-03-11 19:37发布

ES32F065板卡支持1 路模数转换器(ADC0)。ADC(Analog to Digital Convertor) 是 12 位分辨率的逐次逼近型模数转换器。它具有多达 19 个复用通道,可测量从管脚输入的16 个外部信号、3 个内部信号。这些通道的模数转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的16 位数据寄存器中。ADC 模块具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。ADC 支持触发DMA 数据传输的功能。先看一下板卡的原理图,电位器R1 接到了PB0,对应着ADC0的通道14


BSP库中两个重要函数:1.ADC 模块初始化  这里我将其改为ADC0的通道14 对应着板子的旋钮。

  1. oid adc_module_init(void)
  2. {
  3.     /* clear lpuart_handle_t structure */
  4.     memset(&h_adc, 0x0, sizeof(adc_handle_t));
  5.     /* clear adc_nch_conf_t structure */
  6.     memset(®_config, 0x0, sizeof(adc_nch_conf_t));

  7.     adc_pin_init();

  8.     /* Initialize adc */
  9.     h_adc.perh = ADC0;
  10.     h_adc.init.data_align = ADC_DATAALIGN_RIGHT;
  11.     h_adc.init.scan_mode  = DISABLE;
  12.     h_adc.init.cont_mode  = DISABLE;
  13.     h_adc.init.nch_len    = ADC_NCH_LEN_1;
  14.     h_adc.init.disc_mode  = ADC_ALL_DISABLE;
  15.     h_adc.init.disc_nbr   = ADC_DISC_NBR_1;
  16.     h_adc.init.conv_res   = ADC_CONV_RES_10;
  17.     h_adc.init.clk_div    = ADC_CKDIV_128;
  18.     h_adc.init.neg_ref    = ADC_NEG_REF_VSS;
  19.     h_adc.init.pos_ref    = ADC_POS_REF_VDD;
  20.     ald_adc_init(&h_adc);
  21.     /* Initialize regular convert channel */
  22.     reg_config.channel       = ADC_CHANNEL_14;
  23.     reg_config.rank          = ADC_NCH_RANK_1;
  24.     reg_config.samp_time     = ADC_SAMPLETIME_4;
  25.     ald_adc_normal_channel_config(&h_adc, ®_config);
  26.     return;
  27. }

复制代码2. ADC读数据函数,每20次取一个平均。

  1. uint32_t adc_average(void)
  2. {
  3.     int32_t i;
  4.     uint32_t adc_max, adc_min, adc_sum, adc_value;
  5.     uint32_t reg_value;
  6.     /* Start rejular convert */
  7.     adc_max = 0,
  8.     adc_min = 0xffffffff;
  9.     adc_sum = 0;
  10.     for (i = 0; i < 20>
  11.     {
  12.         ald_adc_normal_start(&h_adc);
  13.         /* Polling convert finish and read result */
  14.         if (ald_adc_normal_poll_for_conversion(&h_adc, 5000) == OK)
  15.             reg_value = ald_adc_normal_get_value(&h_adc);
  16.         if (reg_value > adc_max)
  17.             adc_max = reg_value;

  18.         if (reg_value < adc>
  19.             adc_min = reg_value;
  20.         adc_sum = adc_sum + reg_value;
  21.     }
  22.     adc_sum = adc_sum - adc_max - adc_min;
  23.     adc_sum = adc_sum / 18;
  24.     adc_value = 3300 * 10 / 4096 * adc_sum / 10;
  25.     return adc_value;
  26. }

复制代码主函数代码打印ADC的值

  1. #include "main.h"
  2. unsigned char Sendbuf[7] ;
  3. uint32_t temper;
  4. int main()
  5. {
  6.         ald_cmu_init();      // Initialize ALD
  7.         led_module_init();   //LED初始化
  8.         bsp_key_init();      //按键初始化
  9.         adc_module_init();   //ADC模块初始化
  10.         uart_232_module_init(115200);       
  11.         while (1)
  12.         {
  13.             ald_delay_ms(1000);
  14.                   temper =  adc_average();
  15.                   Sendbuf[0] =  temper /10000 + 0x30;
  16.                   Sendbuf[1] =  temper 000/1000 + 0x30;
  17.                   Sendbuf[2] =  temper 00/100 + 0x30;
  18.                   Sendbuf[3] =  temper 0/10 + 0x30;
  19.                   Sendbuf[4] =  temper + 0x30;
  20.                   Sendbuf[5] =  ' ';
  21.                   Sendbuf[6] =  ' ';
  22.                   bsp_uart_232_send(Sendbuf,7);
  23.         }
  24. }

旋转电位器串口助手打印出的AD值如下:


444.jpg  

0条回答

一周热门 更多>