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.

[参考译文] MSPM0L1105:读取 ADC 和 GPIO 值问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1354971/mspm0l1105-read-adcs-and-gpios-values-issues

器件型号:MSPM0L1105

e2e.ti.com/.../mspm0l1105_5F00_fw_5F00_ccs.zip

尊敬的 TI 团队:

我们有许多读取值问题、请帮助检查如何修复这些问题。
已附加源项目。

正如您在源代码中所看到的、我们有8个可读取的 ADC 通道以及8个 GPIO (称为 Px_nFLT、X=0、1、2、…) 要读取(通过 i2c)。
但到目前为止、有些情况令人奇怪:
1.全部读取 GPIO 0
从我们的硬件设计来看、如果相应的 ADC 具有值、那么 GPIO 也应该为1。
但我们读取的是全部为0、甚至某些 ADC 的值。
ADC 读数值不正确
当我插入端口3时、我可以读取 ADC3的值、没错。
但是、即使我没有将任何内容插入端口7、adc7也会显示值、并且 HW 测量值也为0。

您能帮助指导我们如何检查这些问题吗?

谢谢!

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

    您好、 

    Unknown 说:
    1. 全部读取 GPIO 0

    您是否在使用 LaunchPad? 确保 GPIO 设置正确并已连接、请参阅 LP 的原理图: https://www.ti.com/lit/pdf/slau869

    如果没有、请通过将这些引脚拉至3.3V 或 GND 来手动检查这些引脚。

    P2_nFLT 是 syscfg 中的输出引脚。

    Unknown 说:
    2. ADC 读取值不正确

    这些异常值是什么?  出现一些小噪声是正常的。

    此外、尝试测试这些手动 拉 至3.3V 或 GND 的 ADC 输入。

    此致、

    赫利克

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

    您好、Helic、

    来自我们的 ADC 8通道读数的 ADC 读取值不正确。 读取结果结果[4]等于结果[0],结果[5]等于结果[1]...等。 您能帮助我们查看我们的代码、并检查是否有错误。

     

    谢谢!  

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

    您好、 

    Unknown 说:
    2. ADC 读取值不正确

    更改 ADC 通道配置后、需要启用并开始转换。

    对于使用信道开关进行的 ADC 转换、应遵循以下逻辑:

        while (1) {
    
            // Configure MEM0-3 channels to original settings
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_0,
               DL_ADC12_INPUT_CHAN_1, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM0, ADC channel 1
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_1,
               DL_ADC12_INPUT_CHAN_0, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM1, ADC channel 0
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_2,
               DL_ADC12_INPUT_CHAN_9, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM2, ADC channel 9
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_3,
               DL_ADC12_INPUT_CHAN_8, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM3, ADC channel 8
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    
            //Enable ADC conversion
            DL_ADC12_enableConversions(ADC12_0_INST);
            //Start ADC conversion
            DL_ADC12_startConversion(ADC12_0_INST);
    
            /* Wait until all data channels have been loaded. */
            while (gCheckADC == false) {
                __WFE();
            }
            gCheckADC = false;
    
            /* Store ADC Results into their respective buffer */
            gAdcResult[0] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
            gAdcResult[1] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
            gAdcResult[2] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_2);
            gAdcResult[3] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_3);
    
            // Reconfigure MEM0-3 to different channels
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_0,
               DL_ADC12_INPUT_CHAN_5, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,  // MEM0, ADC channel 5
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_1,
               DL_ADC12_INPUT_CHAN_4, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,  // MEM1, ADC channel 4
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_2,
               DL_ADC12_INPUT_CHAN_3, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM2, ADC channel 3
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
            DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_3,
               DL_ADC12_INPUT_CHAN_2, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED, // MEM3, ADC channel 2
               DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
               
            //Enable ADC conversion
            DL_ADC12_enableConversions(ADC12_0_INST);
            //Start ADC conversion
            DL_ADC12_startConversion(ADC12_0_INST);
    
            /* Second pass. Wait until all data channels have been loaded. */
            while (gCheckADC == false) {
                __WFE();
            }
            gCheckADC = false;
    
            /* Store ADC Results into their respective buffer */
            gAdcResult[4] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
            gAdcResult[5] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
            gAdcResult[6] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_2);
            gAdcResult[7] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_3);
        }
        
        
        
    /* Check for the last result to be loaded then change boolean */
    void ADC12_0_INST_IRQHandler(void)
    {
        switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
            case DL_ADC12_IIDX_MEM3_RESULT_LOADED:
                gCheckADC = true;
                break;
            default:
                break;
        }
    }

    在单个主 while (1)循环中、

    将 Configrue ADC 通道设置为1并开始转换、等待结果、将结果存储到 RAM。

    然后重新配置另一组 ADC 通道、然后再次启动 ADC 并等待结果。

    此致、

    赫利克