回答

收藏

[评测分享] 【RISC-V 先楫半导体HPM5E00 MCU开发板试用体验】2、16位ADC采样实验

#板卡评测 #板卡评测 570 人阅读 | 0 人回复 | 2025-07-08

本帖最后由 eefocus_3941691 于 2025-7-8 08:30 编辑


HPM5E00支持高达16位的ADC采样。
SDK中提供了ADC采样示例位于:sdk_env_v1.10.0\hpm_sdk\samples\drivers\adc\adc16

本文对示例做适当修改,将采集数据转换为电压并通过LED数码管显示。

一、生成工程


二、软件部分


1、初始化oneshot模式
  1. void init_oneshot_config(void)
  2. {
  3.     adc16_channel_config_t ch_cfg;

  4.     /* get a default channel config */
  5.     adc16_get_channel_default_config(&ch_cfg);

  6.     /* initialize an ADC channel */
  7.     ch_cfg.ch           = BOARD_APP_ADC16_CH_1;
  8.     ch_cfg.sample_cycle = APP_ADC16_CH_SAMPLE_CYCLE;

  9.     adc16_init_channel(BOARD_APP_ADC16_BASE, &ch_cfg);

  10.     adc16_set_nonblocking_read(BOARD_APP_ADC16_BASE);

  11. #if defined(ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT) && ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT
  12.     /* enable oneshot mode */
  13.     adc16_enable_oneshot_mode(BOARD_APP_ADC16_BASE);
  14. #endif
  15. }
复制代码

2、EUI设备初始化及数码管显示电压数值函数
  1. #include "board.h"
  2. #include "hpm_eui_drv.h"
  3. #include "hpm_interrupt.h"
  4. #include "hpm_clock_drv.h"
  5. #include "common.h"


  6. static const uint8_t s_disp_code_8_seg[] = BOARD_EUI_SEG_ENCODE_DATA;
  7. static uint32_t s_eui_clock_freq;

  8. void init_eui_config(void)
  9. {
  10.     eui_ctrl_config_t ctrl_config;

  11.     clock_add_to_group(BOARD_EUI_CLOCK_NAME, 0);
  12.     s_eui_clock_freq = clock_get_frequency(BOARD_EUI_CLOCK_NAME);

  13.     eui_get_default_ctrl_config(BOARD_EUI, &ctrl_config);
  14.     ctrl_config.work_mode = eui_work_mode_8x8;
  15.     ctrl_config.clko_freq_khz = 100;
  16.     ctrl_config.key_filter_ms = 50;
  17.     ctrl_config.disp_data_invert = 0xFF;
  18.     ctrl_config.scan_invert = 0x00;
  19.     ctrl_config.dedicate_out_cfg = BOARD_EUI_DEDICATE_OUT_LINES;
  20.     ctrl_config.dedicate_in_cfg = 0x0000;
  21.     eui_config_ctrl(BOARD_EUI, s_eui_clock_freq, &ctrl_config);


  22. /*
  23.     printf("clko_tm_us:%d, slot_tm_us:%d, hold_tm_us:%d, disp_tm_us:%d, filter_tm_us:%d\n\n",
  24.             eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_clko_time), eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_slot_time),
  25.             eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_hold_time), eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_disp_time),
  26.             eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_filter_time));

  27.     eui_set_irq_enable(BOARD_EUI, eui_irq_area_mask);
  28.     intc_m_enable_irq_with_priority(BOARD_EUI_IRQ, 1);
  29. */
  30.     eui_set_enable(BOARD_EUI, true);
  31. }


  32. void adc_led_disp(uint16_t val)
  33. {
  34.   float f_val=val*3.3/65535;
  35.   printf("f_val:%f\r\n",f_val);
  36.   eui_scan_disp_data_t disp_data;
  37.   disp_data.data_8x8[0] = s_disp_code_8_seg[((uint16_t)f_val)%10]|BOARD_EUI_SEG_DP_BIT_MASK;
  38.   disp_data.data_8x8[1] = s_disp_code_8_seg[((uint16_t)(f_val*10))%10];
  39.   disp_data.data_8x8[2] = s_disp_code_8_seg[((uint16_t)(f_val*100))%10];
  40.   disp_data.data_8x8[3] = s_disp_code_8_seg[((uint16_t)(f_val*10000))%10];
  41.   disp_data.data_8x8[4] = s_disp_code_8_seg[((uint16_t)(f_val*100000))%10];
  42.   eui_set_scan_disp_data(BOARD_EUI, 0, &disp_data);
  43. }
复制代码

3、oneshot采集处理,增加了调用adc_led_disp函数部分
  1. void oneshot_handler(void)
  2. {
  3.     uint16_t result;


  4.     if (adc16_get_oneshot_result(BOARD_APP_ADC16_BASE, BOARD_APP_ADC16_CH_1, &result) == status_success) {
  5.         if (adc16_is_nonblocking_mode(BOARD_APP_ADC16_BASE)) {
  6.             adc16_get_oneshot_result(BOARD_APP_ADC16_BASE, BOARD_APP_ADC16_CH_1, &result);
  7.         }
  8.         printf("Oneshot Mode - %s [channel %02d] - Result: 0x%04x\n", BOARD_APP_ADC16_NAME, BOARD_APP_ADC16_CH_1, result);
  9.         adc_led_disp(result);
  10.     }
  11.     board_delay_ms(500);
  12. }
复制代码

4、EUI初始化
  1. init_eui_pins(BOARD_EUI);
  2. init_eui_config();
复制代码

5、采集通道修改
从原理图上可以看出ADC对应管脚PF18(ADC_IN11)
所以需要将BOARD_APP_ADC16_CH_1修改为11U




修改
#define BOARD_APP_ADC16_CH_1     (11U)

三、运行效果

串口输出





在跳冒断开的情况下,手触碰jp7,可以改变PF18输入电压,可以看到数码管显示电压随之改变。

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

2735 积分
4 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条