TA的每日心情 | 开心 昨天 13:36 |
|---|
签到天数: 203 天 连续签到: 3 天 [LV.7]常住居民III
进士
- 积分
- 2735
|
本帖最后由 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模式
- void init_oneshot_config(void)
- {
- adc16_channel_config_t ch_cfg;
- /* get a default channel config */
- adc16_get_channel_default_config(&ch_cfg);
- /* initialize an ADC channel */
- ch_cfg.ch = BOARD_APP_ADC16_CH_1;
- ch_cfg.sample_cycle = APP_ADC16_CH_SAMPLE_CYCLE;
- adc16_init_channel(BOARD_APP_ADC16_BASE, &ch_cfg);
- adc16_set_nonblocking_read(BOARD_APP_ADC16_BASE);
- #if defined(ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT) && ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT
- /* enable oneshot mode */
- adc16_enable_oneshot_mode(BOARD_APP_ADC16_BASE);
- #endif
- }
复制代码
2、EUI设备初始化及数码管显示电压数值函数
- #include "board.h"
- #include "hpm_eui_drv.h"
- #include "hpm_interrupt.h"
- #include "hpm_clock_drv.h"
- #include "common.h"
- static const uint8_t s_disp_code_8_seg[] = BOARD_EUI_SEG_ENCODE_DATA;
- static uint32_t s_eui_clock_freq;
- void init_eui_config(void)
- {
- eui_ctrl_config_t ctrl_config;
- clock_add_to_group(BOARD_EUI_CLOCK_NAME, 0);
- s_eui_clock_freq = clock_get_frequency(BOARD_EUI_CLOCK_NAME);
- eui_get_default_ctrl_config(BOARD_EUI, &ctrl_config);
- ctrl_config.work_mode = eui_work_mode_8x8;
- ctrl_config.clko_freq_khz = 100;
- ctrl_config.key_filter_ms = 50;
- ctrl_config.disp_data_invert = 0xFF;
- ctrl_config.scan_invert = 0x00;
- ctrl_config.dedicate_out_cfg = BOARD_EUI_DEDICATE_OUT_LINES;
- ctrl_config.dedicate_in_cfg = 0x0000;
- eui_config_ctrl(BOARD_EUI, s_eui_clock_freq, &ctrl_config);
- /*
- printf("clko_tm_us:%d, slot_tm_us:%d, hold_tm_us:%d, disp_tm_us:%d, filter_tm_us:%d\n\n",
- 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),
- 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),
- eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_filter_time));
- eui_set_irq_enable(BOARD_EUI, eui_irq_area_mask);
- intc_m_enable_irq_with_priority(BOARD_EUI_IRQ, 1);
- */
- eui_set_enable(BOARD_EUI, true);
- }
- void adc_led_disp(uint16_t val)
- {
- float f_val=val*3.3/65535;
- printf("f_val:%f\r\n",f_val);
- eui_scan_disp_data_t disp_data;
- disp_data.data_8x8[0] = s_disp_code_8_seg[((uint16_t)f_val)%10]|BOARD_EUI_SEG_DP_BIT_MASK;
- disp_data.data_8x8[1] = s_disp_code_8_seg[((uint16_t)(f_val*10))%10];
- disp_data.data_8x8[2] = s_disp_code_8_seg[((uint16_t)(f_val*100))%10];
- disp_data.data_8x8[3] = s_disp_code_8_seg[((uint16_t)(f_val*10000))%10];
- disp_data.data_8x8[4] = s_disp_code_8_seg[((uint16_t)(f_val*100000))%10];
- eui_set_scan_disp_data(BOARD_EUI, 0, &disp_data);
- }
复制代码
3、oneshot采集处理,增加了调用adc_led_disp函数部分
- void oneshot_handler(void)
- {
- uint16_t result;
- if (adc16_get_oneshot_result(BOARD_APP_ADC16_BASE, BOARD_APP_ADC16_CH_1, &result) == status_success) {
- if (adc16_is_nonblocking_mode(BOARD_APP_ADC16_BASE)) {
- adc16_get_oneshot_result(BOARD_APP_ADC16_BASE, BOARD_APP_ADC16_CH_1, &result);
- }
- printf("Oneshot Mode - %s [channel %02d] - Result: 0x%04x\n", BOARD_APP_ADC16_NAME, BOARD_APP_ADC16_CH_1, result);
- adc_led_disp(result);
- }
- board_delay_ms(500);
- }
复制代码
4、EUI初始化
- init_eui_pins(BOARD_EUI);
- init_eui_config();
复制代码
5、采集通道修改
从原理图上可以看出ADC对应管脚PF18(ADC_IN11)
所以需要将BOARD_APP_ADC16_CH_1修改为11U
修改
#define BOARD_APP_ADC16_CH_1 (11U)
三、运行效果
串口输出
在跳冒断开的情况下,手触碰jp7,可以改变PF18输入电压,可以看到数码管显示电压随之改变。
|
|