This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:如何配置 ADC 以使用内部1.4V 基准

Guru**** 2393725 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1469847/cc2340r5-how-do-i-configure-the-adc-to-user-the-internal-1-4v-reference

器件型号:CC2340R5
主题中讨论的其他器件:SysConfig

工具与软件:

你好。 我使用默认设置进行 ADC 转换、但我无法更改这些默认设置。

TI 驱动程序 ADC.h 似乎包含执行此操作的函数、但我找不到任何有关如何使用它的文档。 它是特定于设备的、我怀疑这个处理器的驱动程序尚未实现此函数的任何功能。

int_fast16_t   ADC_CONTROL (ADC_Handle handle、uint_fast16_t cmd、void * arg)

我曾尝试直接设置 ADC 控制寄存器。

uint32_t ADC_ctl_3 = ADC_CTL3_ASCVRSEL_INTREF | ADC_CTL3_ASCSTIME_SEL_SCOMP0 | DIO_ADC_0_CHANNEL;
HWREG (ADC_BASE + ADC_O_CTL3)= ADC_ctl_3;

adc_ctl_3 = HWREG (ADC_BASE + ADC_O_CTL3);

我将0x00002007写入 ADC_0_CTL3、但当我读回它时、值为0。

如果对如何配置 ADC 以使用内部基准、分辨率等有任何建议、我将不胜感激

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、您好!

    我使用默认设置转换 ADC、但我无法更改这些默认设置。

    因此、您需要一个运行时 API 来更改参考源、并且无法利用编译时 SysConfig ADC 模块的 ADC 通道->参考源选项?

    Unknown 说:
    关于如何配置 ADC 以使用内部参考、分辨率

    问题有两个方面

    1. ADC_Config 结构将 hwAttrs 定义为常量
    2. adc_convert 直接引用 hwAttrs、以通过 ADC Driverlib API 配置分辨率和输入参考

    因此、如果您要在运行时更改 ADC、则可能会破坏 ADC_CONVERT API、直接使用它使用的函数 。  请参考 来自的 ADCLPF3_CONVERT \source\ti\drivers\adc\ADCLPF3.c、了解更多详细信息。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、 。 我可以使用静态 syscfg 方法。 然而、我们尝试支持多个处理器、并想定义一个使用 ADC 的通用抽象。 TI 在运行时进行配置的能力似乎有限。 对于我的应用、我想我只需要说明 TI 芯片不支持通过抽象层指定参考。

    有什么想法?我想知道为什么无法直接写入 ADC 寄存器? 我在写入后不会进行转换、因此如果 adc_convert 根据 hwAttrs 以某种方式对它们进行复位、我应该仍然会看到写入的影响。 为了绕过 TI 驱动程序、我以前曾需要直接访问寄存器、但现在似乎不起作用。

    我感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很难理解这个、因为我运行相同的测试、可以查看 ADC.CTL3寄存器更新、并且 ADC_ctl_3在之后保留其值:

    我的代码添加如下:

    #include <ti/devices/cc23x0r5/inc/hw_adc.h>
    #include <ti/devices/cc23x0r5/inc/hw_memmap.h>
    #include <ti/devices/cc23x0r5/inc/hw_types.h>
    
    //...
    
        uint32_t adc_ctl_3 = ADC_CTL3_ASCVRSEL_INTREF | ADC_CTL3_ASCSTIME_SEL_SCOMP0 | ADC_CTL3_ASCCHSEL_CHAN_0;
        HWREG(ADC_BASE + ADC_O_CTL3) = adc_ctl_3;
        adc_ctl_3 = HWREG(ADC_BASE + ADC_O_CTL3);

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有意思。 我拥有这些功能。 我只是再次检查,但仍然没有运气。

    总之、我会在运行时禁用配置基准的功能。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用 F3 SDK v8.40、TI Clang v3.2.2.LTS、默认 SysConfig 器件配置、没有对 adcsinglechChannel 示例项目进行编译器优化的更改、以防有助于算出增量。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经能够更新 ADC 配置、包括基准、分辨率等 我可以使用 TI 驱动程序来打开和关闭 ADC、但除此之外、我还可以使用"adc.h/c"中的函数、这样可以直接写入 ADC 寄存器、而无需手动指定位和偏移。我将在此处发布我的函数、以可能对他人有所帮助。

    这是我设置转换的函数。

    static void _adc_setup_conversion(uint16_t channel, uint32_t internal_ref, uint32_t resolution)
    {
        // TODO: revisit this when enabling standby
        //Power_setConstraint(PowerLPF3_DISALLOW_STANDBY);
    
        // Specify our channel range. We just keep converting a single channel.
        ADCSetMemctlRange(channel, channel);
    
        // Repeat converting a single channel.
        ADCSetSamplingMode(ADC_SAMPLE_MODE_AUTO);
        ADCSetSequence(ADC_SEQUENCE_REPEATSINGLE);
    
        /* Set divider and duration
         * We don't expose this through the HAL; we just pick a reasonable value.
         * Dividing the 48 MHz clock by 4 and converting 256 samples, a conversion takes about 22 uS.
         * The ISR triggers every 25 uS, presumably due to the overhead of restarting the conversions in the ISR.
         */
        ADCSetSampleDuration(ADC_CLOCK_DIVIDER_4, 256);
    
        // Configure the user specified resolution.
        ADCSetResolution(resolution);
    
        // Set reference source
        ADCSetInput(internal_ref, channel, 0);
        ADCSetAdjustmentOffset(internal_ref);
    
        // We trigger with software, so no need to configure an event.
        ADCSetTriggerSource(ADC_TRIGGER_SOURCE_SOFTWARE);
        ADCSetTriggerPolicy(ADC_TRIGGER_POLICY_AUTO_NEXT, 0);
    
        // Start the conversion and enable interrupts.
        ADCEnableConversion();
        ADCClearInterrupt(ADC_INT_MEMRES_00);
        ADCEnableInterrupt(ADC_INT_MEMRES_00);
    }

    并开始转换

    void _adc_start_conversion()
    {
        ADCClearInterrupt(ADC_INT_MEMRES_00);
        ADCStartConversion();
    }

    并停止转换

    void hal_adc_conversion_abort()
    {
        ADCDisableInterrupt(ADC_INT_MEMRES_00);
        ADCDisableConversion();
    }