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.

[参考译文] MSPM0G3507:延迟和 ADC 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1397067/mspm0g3507-delay-and-adc-question

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

工具与软件:

我仍将移植 K350 BoosterPack 和 GRLib 的触控部分

在 MSP432P401R 代码中、代码如下所示:

static void touch_delay(){
    uint32_t i = 0;
    uint32_t time = 480000;

    for(i = 0; i < time; i++)
    {
        ;
    }
}

由于其他一些意见、我认为这是4ms 的延迟。

除了向此代码中添加一些"电压"外、是否有更好的实现延迟的方法? delay_cycles()更好吗? 在 delay_cycle()链中仍会发生中断、对吧?

此外、由于必须在 GPIO 和 ADC 之间切换、我会执行以下操作:

/* Sample the X+ ADC channel to check if there is currently a touch. */
    SYSCFG_DL_ADC12_0_init();
    gCheckADC0 = false;

    DL_ADC12_startConversion(ADC12_0_INST);

    while (false == gCheckADC0) {
        __WFE();
    }

    aDCTemp = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

我在其中一个 ADC 示例中盗走了这些东西。

我注意到、当我这样做时、有时会返回0值。 我是否需要在 init 和 startConversion 之间留出更多时间?

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

    您好!

    除了向该代码中添加一些"volatiles"外、是否有更好的方法来实现延迟? delay_cycles()更好吗? 在 delay_cycle()链中仍会发生中断、对吗?[/QUOT]

    有。 在 DELAY_CYCLE 期间、中断仍发生。 更好的方法是使用计时器中断来生成精确的4ms 延迟。

    我注意到我在执行此操作时有时返回0个值。 我是否需要在初始化和 startConversion 之间留出更多时间?[/QUOT]

    我认为它与初始化转换和开始转换之间的时间无关。 如何将 GPIO 功能从 GPIO 切换到 ADC? 可能与开关问题有关。  

    此致、

    Cash Hao

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

    首先、我想说的是 TI 制定了该延迟例程、而不是我。 8^)

    请随时参考基于其的 MSP432P401R GRLib 代码。 8^)

    我使用一些 SysConfig 滥用来提出 GPIO/ADC 开关。 我在 SysConfig 中设置 GPIO 并构建项目。 我窃取了 DL_CONFIG 初始化代码。 然后、我在系统配置中设置 ADC、并在编译工程时将其保留为原样、这样 ADC 代码在 SysConfig 初始化代码中、但 GPIO 不在。 在我的代码中、我执行以下操作:

    我有4个引脚:XMINUS、XPLUS、YMINUS、YPLUS。

    为了获得 X 值、我要使 X+和 X-引脚成为 GPIO 输出、将 Y 引脚设置为高阻态并读取 PB19上的 ADC_1通道6。

    /* Set X+ and X- as output and Y- as input (floating). */
        DL_GPIO_initDigitalOutput(GPIO_TOUCH_XPLUS_IOMUX);
        DL_GPIO_initDigitalOutput(GPIO_TOUCH_XMINUS_IOMUX);
    
        DL_GPIO_enableOutput(GPIO_TOUCH_XPLUS_PORT, GPIO_TOUCH_XPLUS_PIN);
        DL_GPIO_enableOutput(GPIO_TOUCH_YMINUS_PORT, GPIO_TOUCH_YMINUS_PIN);
    
        // Set to Hi Z?
        DL_GPIO_disableOutput(GPIO_TOUCH_YPLUS_PORT, GPIO_TOUCH_YPLUS_PIN);
        DL_GPIO_disableOutput(GPIO_TOUCH_YMINUS_PORT, GPIO_TOUCH_YMINUS_PIN);
    
        DL_GPIO_clearPins(GPIO_TOUCH_XPLUS_PORT, GPIO_TOUCH_XPLUS_PIN);
        DL_GPIO_setPins(GPIO_TOUCH_XMINUS_PORT, GPIO_TOUCH_XMINUS_PIN);
    
        // Set up ADC
        SYSCFG_DL_ADC12_1_init();
    
        DL_ADC12_startConversion(ADC12_1_INST);
    
        while (false == gCheckADC1) {
            __WFE();
        }
    
        gAdcResult1 = DL_ADC12_getMemResult(ADC12_1_INST, DL_ADC12_MEM_IDX_0);
    
    
        gCheckADC1 = false;
        DL_ADC12_enableConversions(ADC12_1_INST);
    
        return gAdcResult1;

    其中 SysConfig_DL_ADC_12_1_init ()位于 SysConfig 代码中:

    SYSCONFIG_WEAK void SYSCFG_DL_ADC12_1_init(void)
    {
        DL_ADC12_setClockConfig(ADC12_1_INST, (DL_ADC12_ClockConfig *) &gADC12_1ClockConfig);
        DL_ADC12_configConversionMem(ADC12_1_INST, ADC12_1_ADCMEM_0,
            DL_ADC12_INPUT_CHAN_6, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_ENABLED,
            DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
        DL_ADC12_configHwAverage(ADC12_1_INST,DL_ADC12_HW_AVG_NUM_ACC_32,DL_ADC12_HW_AVG_DEN_DIV_BY_32);
        /* Enable ADC12 interrupt */
        DL_ADC12_clearInterruptStatus(ADC12_1_INST,(DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED));
        DL_ADC12_enableInterrupt(ADC12_1_INST,(DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED));
        DL_ADC12_enableConversions(ADC12_1_INST);
    }

    我有什么问题吗?

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

    您好!

    那么、 Y 引脚是 PB19、对吧? 读取的是 ADC 结果 呢?

    此外、 我这边的 Hi-Z 函数看起来不正确。 您可以尝试以下配置。  

    此致、

    Cash Hao

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

    我正在 Y+上读取、即 PB19。

    Y-、PB16需要设置为 Hi-Z、以免干扰测量。

    触摸屏本质上是一个交叉形电阻器、4个引脚 X+、X-、Y+和 Y-在外点处、它们都在中间相交。

    R 的变化取决于触摸。 要读取 X 方向、您需要将位于 X-和 X+、Hi-Z Y-的 GPIO 通电、并使用 ADC 读取 Y+。

    我还应说明的是、当我运行调试器并在该代码中断时、我似乎总是能读取数据。 只有当我让它循环时、它才返回零。

                          

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

    > DL_GPIO_enableOutput (GPIO_TOUCH_YMINUS_PORT、GPIO_TOUCH_YMINUS_PIN);

    您是指在此启用 XMINUS 吗?

    > DL_GPIO_enableOutput (GPIO_TOUCH_XMINUS_PORT、GPIO_TOUCH_XMINUS_PIN);

    ---

    我是否正确地记得 K350触摸电阻非常弱(高值)? 如果是这样、这可能会解释延迟、尽管4ms 似乎是很长的时间。

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

    谢谢、Bruce、她解决了一个问题。

    以下是新的 ADC 读取函数

    这是我的测试函数

    void touch_calibrate(void)
    {
        touch_calibration calData;
        uint16_t xdata = 0;
        uint16_t ydata = 0;
    
        /* Zero out local copies of calibration data. */
        calData.xMin = 0;
        calData.xMax = 0;
        calData.yMin = 0;
        calData.yMax = 0;
    
        // Debug
    
        while (xdata < 10000)
        {
            xdata = touch_sampleX();
            touch_delay();
            touch_delay();
            touch_delay();
    
            ydata = touch_sampleY();
    
            touch_delay();
            touch_delay();
            touch_delay();
    
            sprintf(BufTemp, "X, Y: %d, %d", xdata, ydata);
            if (strcmp(BufTemp, BufXY) != 0)
            {
                Graphics_setForegroundColor(&g_sContext, ClrBlack);
                Graphics_drawStringCentered(&g_sContext,
                                            (int8_t *)BufXY,
                                            AUTO_STRING_LENGTH,
                                            LCD_HORIZONTAL_MAX / 2,
                                            150,
                                            OPAQUE_TEXT);
    
                strcpy(BufXY, BufTemp);
    
                Graphics_setForegroundColor(&g_sContext, ClrWhite);
                Graphics_drawStringCentered(&g_sContext,
                                            (int8_t *)BufXY,
                                            AUTO_STRING_LENGTH,
                                            LCD_HORIZONTAL_MAX / 2,
                                            150,
                                            OPAQUE_TEXT);
    
            }
    
    
        }
    

    当我在 spriintf()行上放置一个断点时、它在我继续步进时运行良好。 如果我让它自由运行、我只会得到 y 的零值、而我得到 X 的正常值。 我交换了 ADC 读取的顺序、但这并没有改变内容。

    新信息:如果我输入足够的延迟,它是有效的。

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

    您好!

    如果你  想在 touch_sampleX()和 touch_sampleY()之间设置延迟,那么你的意思是设置足够的延迟?

    此致、

    Cash Hao

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

    它们需要在*和* touch_sample()函数之前和之后。 (如上所示、每边3个)我需要每边大约10个。

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

    我仍然想知道(模糊记得)高电阻和10nF 电容器、我认为需要相当长的采样/保持时间。

    原始代码设置 SHT0=96 (尽管奇怪的是也设置 ADC_MANUAL_DIVERSION、 我只看到一个切换/转换)、但我 在 ADC 初始化中没有看到对 DL_ADC12_setSampleTime0 ()的调用、这意味着 SCOMP0=0 (非常短的 S/H)。  

    一个实验可能是将类似这样的内容放入 ADC 初始化中:

    > DL_ADC12_setSampleTime0 (ADC12_1_INST、200);

    看看会发生什么情况。 (SysConfig 可能也能够这样做。)

    [编辑:更正了拼写错误]

    [编辑:adc_manual_interation 指 MSC = 0、不是 SHP = 0]

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

    谢谢。

    我可以查看它们分别用于 MSP432P401R。

    但这不能解释为什么我在一个方向上获得值、而在另一个方向上获得值是0。 它应该读*某事*。

    现在情况变得更糟了! 它现在读数为0表示*both* channels - arrggh! -和重新刷新到已知的工作软件没有帮助。

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

    谢谢、Bruce。 我在 SysConfig 中设置了1ms 转换时间、现在一切似乎正常工作。 MSP432被设置为96个时钟-我不确定那意味着什么时候。