809|2

8

帖子

0

TA的资源

一粒金砂(中级)

先楫HPM5361EVK---ADC测试 [复制链接]

本帖最后由 Windccc 于 2023-12-10 23:49 编辑

一、参数介绍

        先楫HPM5361EVK具备2 个 2MSPS 16 位高精度 ADC,配置为 12 位精度 时转换率可达 4MSPS,多达 16 个模拟输入引脚;2 个 增益可编程的运算放大器,2 个模拟比较器和 2 个 1MSPS 12 位 DAC。

16 位模数转换 ADC 特性

image.png  

1、16 位模数转换器 ADC16 的主要功能和特性:

        ● 16 位逐次逼近型 ADC

        ● 最大 2MHz 采样率

        ● 支持单端输入

        ● 独立的 ADC 转换时钟

        ● 支持任意配置的 AD 转换分辨率

        ● 可配置采样周期数

        ● 内置 DMA 可直接把 ADC 转换结果写入内存

        ● 支持读取转换模式 – 读取结果寄存器直接触发转换

        ● 支持周期转换模式 – 内置定时器按周期进行转换 – 支持硬件阈值比较,对超出范围的转换结果报警

        ● 支持序列转换模式 – 可由软件或硬件触发 – 序列最长可达 16 – 支持单次转换或者连续转换 – 支持序列循环

        ● 支持抢占转换模式 – 可由软件或硬件触发 – 连续转换序列最长可达 4

        ● 支持生成各类中断

2、ADC 时钟

        ADC 时钟包括 ADC 控制器时钟和 ADC 转换时钟。 其中 ADC 转换时钟是 ADC 逐次逼近模拟转换节拍控制的时钟。 由 ADC 控制器时钟经过预分频得到,ADC 控制器时钟由系统控制模块配置,默认为系统总线时钟 200MHz(与电机系统时钟同步)。 可以通过设置 CONVCFG1[CONVCLKDIV] 寄存器位,配置 ADC 转换时钟相对于 ADC 控制器时钟的预分频的值。CONVCFG1[CONVCLKDIV] 值为 0 时,代表预分频值为/1;值为 1 时,预分频值为/2,最大为/16。 ADC16 转换时钟最大频率为 50MHz。

3、ADC 输入通道配置:

可以使用 SAMPLE_CFGx [SAMPLE_CLOCK_NUMBER] 和 [SAMPLE_CLOCK_NUMBER_SHIFT] 位来设置通道的采样时间。采样时间由 SAMPLE_CLOCK_NUMBER 乘以 2 的 SAMPLE_CLOCK_NUMBER_SHIFT 次方个时钟周期组成。最短的采样时间为 1 个时钟周期。为了达到 16 位的转换精度,需要将 CONV_CFG1[CONVERT_CLOCK_NUMBER] 配置为 21,即转换时间为 21 个时钟周期。

如果用户不需要 16 位的精度,但希望更快地获得结果,可以通过缩短转换时间来实现。用户需要同时改变 CONV_CFG1[CONVERT_CLOCK_NUMBER] 和 ADC16_CONFIG1[COV_END_CNT]。COV_END_CNT = 21 - CONVERT_CLOCK_NUMBER;

  1. 当 CONVERT_CLOCK_NUMBER = 21 时,ADC16 在完全的 16 位模式下工作;
  2. 当 CONVERT_CLOCK_NUMBER = 14 时,ADC16 大约在 12 位模式下工作;
  3. 当 CONVERT_CLOCK_NUMBER = 11 时,ADC16 大约在 10 位模式下工作;
  4. 当 CONVERT_CLOCK_NUMBER = 9 时,ADC16 大约在 8 位模式下工作;

其他数值也可以工作,用户可以根据精度和速度需求自由选择。每个通道的转换时间是采样时间和转换时间的总和。

4、ADC采样转换模式

先楫HPM5361EVK的16位ADC共支持四种采样模式,分别是读取转换模式、周期转换模式、序列转换模式和抢占转换模式。

 

读取转换模式:

        读取转换模式可以直观地获取 ADC 某个输入通道的转换结果。这在需要尽快了解某个通道的结果,并且在此之前没有其他任务可执行的情况下非常适用。

读取 BUS_RESULTx 寄存器将触发对 ADC 输入 x 的一次转换。一旦转换完成,结果将直接返回。根据不同的 ADC 通道配置,返回转换结果的时间也会有所不同。

在 ADC 完成转换之前,它会阻塞相关的外设总线访问,而由于转换引起的阻塞时间可能会比较长。可以通过将 BUF_CFG0 [WAITDIS] 设置为 1 来关闭总线阻塞。这样,当读取 BUS_RESULTx 寄存器时,它将直接返回上一次转换的结果。当 BUS_RESULTx [VALID] 为 1 时,表示 ADC 转换已完成,此时 BUS_RESULTx 寄存器中保存了最近一次的转换结果。

 

周期转换模式:

        周期转换模式适用于需要按计划进行转换或监测某个通道是否超过阈值的情况。

        通过设置 PRD_CFGx [PRD_CNT] 和 [PRESCALE] 寄存器位,可以定义周期的长度,即 PRD_CNT 乘以 2 的 PRESCALE 次方。每个 ADC 时钟周期,计数器会减 1,当计数器计数到 0 时,转换开始,并且计数器重新加载。

        需要注意的是,将 PRD_CFGx [PRD_CNT] 位清零表示关闭该输入通道的周期转换。周期转换的结果保存在 PRD_RESULTx 寄存器中,可以从中读取输入通道 x 的最近一次转换结果。值得注意的是,PRD_RESULTx 寄存器始终保存着 ADC 输入通道 x 的最近一次转换结果。PRD_RESULTx 不仅保存周期转换模式的结果,还保存其他转换模式的结果。可以通过设置 PRD_THSHD_CFGx[THSHDH] 和 PRD_THSHD_CFGx[THSHDL] 来监测输入通道 x 的转换结果。一旦转换结果超出范围(结果大于 THSHDHx 或小于 THSHDLx),将触发报警,相应的标志位 INT_STS[ADWDGx] 会被置为 1。如果启用了相应的中断使能,还会产生中断。

        ADC 转换结果的检测不仅限于周期转换模式,对于所有读取模式都有效。如果设置的阈值不正确,例如将 THSHDHx 设为 0,那么每当通道转换结束时都会触发报警。如果有多个通道同时到达计时期限需要开始转换,较小序号的输入通道将先进行转换。

 

序列转换模式:

       这种模式适用于需要连续转换某个或多个通道,并且数据量较大的情况,例如测试信噪比或等效位数(ENOB)。

       可以通过依次配置 SEQ_QUE0 到 SEQ_QUE15 寄存器来指定转换序列的目标输入通道。SEQ_QUE0 [CHAN_NUM] 位域用于配置序列转换触发后的第一次转换的通道序号,SEQ_QUE1 [CHNUM] 位域配置第二次转换的通道序号,以此类推,SEQ_QUE15 [CHNUM] 位配置第16次转换的通道序号。此外,需要配置 SEQ_CFG0 [SEQ_LEN] 位来指定转换序列的长度,ADC的转换序列最长可达16个通道。序列的开始转换可以通过软件或硬件触发实现:

  • 通过软件触发:首先将 SEQ_CFG0 [SW_TRIG_EN] 位置1,然后将 SEQ_CFG0 [SW_TRIG] 位置1,即可触发序列转换。
  • 通过硬件触发:将 SEQ_CFG0 [HW_TRIG_EN] 位置1,当触发引脚(STRGI)上检测到上升沿时,即可触发序列转换。

一旦触发,ADC将按照顺序根据 SEQ_QUE0 的配置开始转换输入通道。转换完成后,标志位 INT_STS [SEQ_CVC](转换完成)将被置为1。此时:

  • 如果 SEQ_CFG0 [CONT_EN] 位置1,ADC将自动根据 SEQ_QUE1 的配置开始下一次转换,直到达到指定的序列长度 SEQ_QUEn。
  • 如果 SEQ_CFG0 [CONT_EN] 位清零,ADC将等待下一次软件或硬件触发才会开始下一个通道的转换。

当ADC完成整个序列的转换(长度由 SEQ_CFG0 [SEQ_LEN] 位设置)后,标志位 INT_STS [SEQ_CMPT](序列转换完成)将被置为1。此时:

  • 如果 SEQ_CFG0 [RESTART_EN] 位置1且 SEQ_CFG0 [CONT_EN] 位置1,ADC将自动根据 SEQ_QUEx 的配置,从 SEQ_QUE0 开始连续依次转换。
  • 如果 SEQ_CFG0 [RESTART_EN] 位置0且 SEQ_CFG0 [CONT_EN] 位置1,ADC将在下一次软件或硬件触发后连续转换直到整个序列完成。
  • 如果 SEQ_CFG0 [CONT_EN] 位置0,无论 SEQ_CFG0 [RESTART_EN] 位置1还是0,ADC将在下一次软件或硬件触发后重新根据 SEQ_QUEx 的配置开始转换。

        如果在ADC序列转换过程中接收到新的序列转换触发信号,ADC将忽略该触发。如果是通过软件触发序列转换,INT_STS [SEQ_SW_CFLCT] 位将被置为1。如果是由 STRGI 引发的硬件触发序列转换,INT_STS [SEQ_HW_CFLCT] 位将被置为1。

        ADC序列转换模式支持内置DMA,可以直接将转换结果写入用户指定的内存缓冲区。用户可以通过 SEQ_DMA_ADDR 寄存器配置目标地址,并通过 SEQ_DMA_CFG [BUF_LEN] 设置数据区域的长度,从而为ADC的序列转换结果配置一个循环缓冲区。

抢占转换模式:

        ADC支持抢占转换模式,这是优先级最高的转换模式,适用于对电机控制系统中实时性要求较高的情况,需要在指定时间对指定通道进行转换。

        ADC支持12组抢占转换序列,触发信号来自芯片的片上互联模块,共有12个抢占触发源。这些抢占转换序列可以通过寄存器CONFIGx进行配置。抢占转换是通过硬件触发实现的,当PTRGIxA、PTRGIxB或PTRGIxC上出现上升沿时,会触发相应的抢占序列xA、xB或xC。首先,用户需要通过CONFIGx寄存器的[TRIG_LEN]位来配置抢占转换的序列长度,最多可以设置为4,即每个触发最多可以触发一次长度为4的转换。可以通过CONFIGx寄存器配置抢占转换的转换顺序。通过配置寄存器的[CHAN0]、[CHAN1]、[CHAN2]和[CHAN3]位域,依次配置触发后的第1、2、3、4次转换的AD输入通道号码。

        一旦抢占转换开始,ADC会根据[TRIG_LEN]的配置连续进行转换,完成整个抢占序列。在抢占序列的第x次转换完成后,如果CONFIGx寄存器的[INTENx]位置为1,INT_STS[TRIG_CMPT]标志位会被置为1。如果相应的中断控制位也被置为1,ADC会生成中断。在ADC抢占转换过程中,如果接收到新的抢占转换触发信号,ADC不会响应新的触发。但是,根据触发源是软件还是硬件,INT_STS[TRIG_SW_CFLICT]标志位或INT_STS[TRIG_HW_CFLICT]标志位会被置为1,表示发生了抢占转换触发冲突。如果对应的中断控制位也被置为1,ADC会产生中断报警。

        如果多个不同的抢占转换同时触发,ADC会按照以下优先顺序进行响应:较小组号的抢占转换优先,例如PTRGI0A优先于PTRGI1A;同一组中,xA优先于xB,xB优先于xC,例如PTRGI0A优先于PTRGI0B。同时,INT_STS[PTCHWCFLICT]标志位会被置为1。

        ADC抢占转换模式也支持内置DMA,可以直接将转换结果写入用户指定的内存缓冲区中。

二、实际测试

        首先是硬件初始化和配置时钟,这里我们的程序采用ADC0的11通道进行测试,查看芯片的数据手册可以看到ADC0_IN11所在端口是在PB08

image.png  

 

 

int main(void)
{
    uint8_t conv_mode;

    /* Bsp initialization */
    board_init();

    /* ADC pin initialization */
    board_init_adc16_pins();

    /* ADC clock initialization */
    board_init_adc16_clock(BOARD_APP_ADC16_BASE, true);

    printf("This is an ADC16 demo:\n");

    /* Get a conversion mode from a console window */
    conv_mode = get_adc_conv_mode();

    /* ADC16 common initialization */
    init_common_config(conv_mode);

    /* ADC16 read patter and DMA initialization */
    switch (conv_mode) {
        case adc16_conv_mode_oneshot:
            init_oneshot_config();
            break;

        case adc16_conv_mode_period:
            init_period_config();
            break;

        case adc16_conv_mode_sequence:
            init_sequence_config();
            break;

        case adc16_conv_mode_preemption:
            init_preemption_config();
            break;

        default:
            break;
    }

    /* Main loop */
    while (1) {
        board_delay_ms(1000);

        channel_result_out_of_threshold_handler();

        if (conv_mode == adc16_conv_mode_oneshot) {
            oneshot_handler();
        } else if (conv_mode == adc16_conv_mode_period) {
            period_handler();
        } else if (conv_mode == adc16_conv_mode_sequence) {
            sequence_handler();
        } else if (conv_mode == adc16_conv_mode_preemption) {
            preemption_handler();
        } else {
            printf("Conversion mode is not supported!\n");
        }
    }
}

 

        它首先初始化了一些硬件和ADC相关的配置,然后从控制台获取了一个转换模式,并根据不同的转换模式进行不同的初始化操作。接着进入一个主循环,每隔1秒进行一次延时,然后根据不同的转换模式调用不同的处理函数进行处理。如果转换模式不被支持,会输出一个错误信息。整体来说,这段代码是一个ADC16的演示程序,根据不同的转换模式进行不同的处理。

 

代码总共配置了四种转换模式,根据选择的模式进行初始化

hpm_stat_t init_common_config(adc16_conversion_mode_t conv_mode)
{
    adc16_config_t cfg;

    /* initialize an ADC instance */
    adc16_get_default_config(&cfg);

    cfg.res            = adc16_res_16_bits;
    cfg.conv_mode      = conv_mode;
    cfg.adc_clk_div    = adc16_clock_divider_4;
    cfg.sel_sync_ahb   = (clk_adc_src_ahb0 == clock_get_source(BOARD_APP_ADC16_CLK_NAME)) ? true : false;

    if (cfg.conv_mode == adc16_conv_mode_sequence ||
        cfg.conv_mode == adc16_conv_mode_preemption) {
        cfg.adc_ahb_en = true;
    }

    /* adc16 initialization */
    if (adc16_init(BOARD_APP_ADC16_BASE, &cfg) == status_success) {
        /* enable irq */
        intc_m_enable_irq_with_priority(BOARD_APP_ADC16_IRQn, 1);
        return status_success;
    } else {
        printf("%s initialization failed!\n", BOARD_APP_ADC16_NAME);
        return status_fail;
    }
}

采样精度设置为16位,时钟预分频为4分频模式。

 

这里我只测试了读取转换模式,模式配置和处理函数如下:

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 = 20;

    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
}

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);
    }
}

image.png  

结果处理函数:

hpm_stat_t adc16_get_oneshot_result(ADC16_Type *ptr, uint8_t ch, uint16_t *result)
{
    uint32_t bus_res;

    /* Check the specified channel number */
    if (ADC16_IS_CHANNEL_INVALID(ch)) {
        return status_invalid_argument;
    }

    bus_res = ptr->BUS_RESULT[ch];
    *result = ADC16_BUS_RESULT_CHAN_RESULT_GET(bus_res);

    if (ADC16_BUF_CFG0_WAIT_DIS_GET(ptr->BUF_CFG0)) {
        if (!ADC16_BUS_RESULT_VALID_GET(bus_res)) {
            return status_fail;
        }
    }

    return status_success;
}

程序调试:

连接板子并且打开串口,下载程序,

image.png   运行,打开串口助手,输入1进入直接转换模式。

image.png  

这里我给板子随便接个传感器看看采样数据是否变化,

 

1702222589311.jpg   可以观测到实际采样数据

image.png  

三、总结

        先楫HPM5361EVK的ADC功能非常出色!它提供了高精度、高性能和可靠性,能够准确地转换模拟信号为数字数据。其高分辨率和低噪声特性使其在各种应用中表现出色。两个16位的高精度ADC可以满足大多数实际工程需要,四种采样模式也可以满足不同用户的需求。

最新回复

ADC测试的准备工作做的很细了   详情 回复 发表于 2023-12-11 07:26

回复
举报

6785

帖子

10

TA的资源

版主

先楫HPM5361EVK的ADC功能非常出色!它提供了高精度、高性能和可靠性,能够准确地转换模拟信号为数字数据。其高分辨率和低噪声特性使其在各种应用中表现出色。两个16位的高精度ADC可以满足大多数实际工程需要,四种采样模式也可以满足不同用户的需求。

楼主辛苦了,分享这么好的ADC使用。


回复

6417

帖子

0

TA的资源

五彩晶圆(高级)

ADC测试的准备工作做的很细了


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表