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.

[参考译文] MSPM0L1306:ADC 结果

Guru**** 2513185 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/1536853/mspm0l1306-adc-result

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

工具/软件:

我正在尝试 了解更多 MSPM0 板。 我尝试使用电位器来调整 RGB LED 的切换速度、从而在 R、G 和 B 之间切换。目前、 POT 连接 到地、3.3V 和 PA25。 我已经将 ADC12 设置为通道 2 和转换存储器 0。 我使用两种不同的方法来尝试它、一种是由 ADC 值的变化引起的 ISR、另一种是通过被调用函数不断检查 ADC 值。 调试后、LED 以初始设定的延迟速率在 R、G 和 B 之间切换、但调整 POT 不会导致切换速度发生任何变化。 对此事的任何帮助都将非常感谢。

ISR 代码:  

包含“ti_msp_dl_config.h"</s>“

/*假设 32MHz CPU_CLK */、这会导致大约 1s 的延迟
int32_t 延迟= 32000000

Volatile uint16_t gAdcResult = 3000

内部 main (void)
  SYSCFG_DL_init ();
  NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);

  //默认值:除绿色 LED 外的所有引脚均关闭
  DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);
  DL_GPIO_setPins (GPIO_LEDS_PORT、GPIO_LEDS_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);

  DL_ADC12_enableConversions (ADC12_0_INST);
  DL_ADC12_startConversion (ADC12_0_INST);

  while (1){
    
    /*开始我们的 ADC 转换*/

    /*当前在模式*/中的 RGB LED 之间切换

    延迟= (32000000*2*gAdcResult)/4096
    //delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_RED_LED_1_PIN | GPIO_LEDS_USER_LED_2_PIN);
    
    延迟= (32000000*2*gAdcResult)/4096
    //delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);

    延迟= (32000000*2*gAdcResult)/4096
    //delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_USER_LED_3_PIN | GPIO_LEDS_LED_1_PIN);
  }
}

//新 ADC 值的中断信号
void ADC12_0_INST_IRQHandler (void){
  开关 (DL_ADC12_getPendingInterrupt (ADC12_0_INST)){
    用例 DL_ADC12_IIDX_MEM0_RESULT_LOADED:
      gAdcResult = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
      休息
    默认值
      休息
  }
}
函数调用代码:
包含“ti_msp_dl_config.h"</s>“

/*假设 32MHz CPU_CLK */、这会导致大约 1s 的延迟
int32_t 延迟= 32000000
#define DELAY_MIN (10000000)
#define DELAY_MAX (64000000)
 
Volatile uint16_t gAdcResult = 3000

int32_t get_delay (void){

  int32_t ADC_Result = 0

  DL_ADC12_startConversion (ADC12_0_INST);

  DELAY_CYCLES (1000);//延迟以使 ADC 更新

  ADC_RESULT = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
  
  int32_t 延迟=(ADC_RESUL*DELAY_MAX)/4096 + DELAY_MIN;

  返回延迟;
}

内部 main (void)
  SYSCFG_DL_init ();
  DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);
  DL_GPIO_setPins (GPIO_LEDS_PORT、GPIO_LEDS_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);

  DL_ADC12_enableConversions (ADC12_0_INST);
  DL_ADC12_startConversion (ADC12_0_INST);

  while (1){

    /*当前在模式*/中的 RGB LED 之间切换

    delay = get_delay ();
    delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_RED_LED_1_PIN | GPIO_LEDS_USER_LED_2_PIN);
    
    delay = get_delay ();
    delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);

    delay = get_delay ();
    delay_cycles (delay);
    DL_GPIO_togglePins (GPIO_LEDS_PORT、
      GPIO_LEDS_USER_LED_3_PIN | GPIO_LEDS_LED_1_PIN);
  }
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Carwyn、  

    感谢您联系我们。 此外、对于 ADC 配置、您是否可以访问 SysConfig 并截取 ADC 转换存储器 0 配置、高级配置和中断配置的屏幕截图? 此外、如果您可附加 ti_msp_dl_config.c 文件、会有所帮助。  

    此致、Jojo

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

    我不能完全确定我理解这是如何工作的、但我有一些观察结果:

    1) 我的计算器说这一行

        int32_t delay =(ADC_Result*DELAY_MAX)/4096 + DELAY_MIN;

    易于溢出。 尝试更改:

    #define DELAY_MAX (64000000)

    收件人:
    #define DELAY_MAX (64000000ULL)
    2) 使用电位器的一个常见问题是输入阻抗很容易变得非常高,需要相当长的采样/保持时间。 硬件开发指南 (SLAAE76B) 第 6.1 节[适用于 G 系列、但我认为 ADC 是相同的]有一个公式、但请尝试在 SysConfig 中延长采样时间(可能从 10 倍开始,因为您的代码不赶时间)。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提交此信息。 您是否按照 Bruce 的说明、使用 10 倍的采样时间进行了测试? 这是偶然的吗?

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

    1ms 实际上是相当长的采样/保持时间。

    我(仍然)建议修复上面的溢出物[(1)]。

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

    我已解决溢出问题、但问题仍然存在。 调试时、 即使在 ADC_RESULT   = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0) 之后、ADC_RESULT 始终保持 0。 目前、LED 以设定的 MIN_DELAY 速度在 R、G 和 B 之间切换正常。

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

    我刚注意到:

    > DL_ADC12_enableFIFO (ADC12_0_INST);

    我建议您不要启用 FIFO,因为您正在使用 getMemResult () 进行读取。 TRM (SLAU847D) 第 14.2.12.2 节说“对于基于 CPU 或 DMA 的操作、不建议使用启用了 FIFO 的单次转换模式。“ 我预计这是因为“MEMCTLx 与 MEMRESx 不相关。“ 因为“MEMRES0、1、2、….N [IS](组织为 FIFO)“。 在任何情况下、如果您不需要 FIFO、FIFO 都会使事情复杂化。

    要禁用 FIFO、请取消选中“ANALOG ->ADC12->ADC12_0->Advanced->Enable FIFO Mode“中的 SysConfig 框。

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

    FIFO 模式已关闭、但仍无法获取 ADC 读数。 这是 main.c 中的当前代码:  

    #include "ti_msp_dl_config.h"
    
    int32_t DELAY;
    int32_t ADC_RESULT;
    #define DELAY_MIN (3000000) // roughly 0.3s
    #define DELAY_MAX (64000000ULL) // roughly 2s
    
    uint32_t get_delay(void) {
    
        DL_ADC12_startConversion(ADC12_0_INST);
    
        delay_cycles(1000); //allow ADC to update
    
        ADC_RESULT = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0); //ADC result
        
        int32_t delay = ((ADC_RESULT*(DELAY_MAX-DELAY_MIN))/4096) + DELAY_MIN; //calculate delay value
    
        return delay;
    }
    
    int main(void)
    {
        /* Power on GPIO, initialize pins as digital outputs */
        SYSCFG_DL_init();
    
        // Default: all pins off apart from red LED of RGB LED
        DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);
        DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_TEST_PIN | GPIO_LEDS_USER_LED_1_PIN );
    
        DL_ADC12_startConversion(ADC12_0_INST);
    
        while (1) {
    
            // Currently switches between RGB LEDs in sequence
    
            DELAY = get_delay();
            delay_cycles(DELAY);
            DL_GPIO_togglePins(GPIO_LEDS_PORT,
                 GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_LED_2_PIN);
            
            DELAY = get_delay();
            delay_cycles(DELAY);
            DL_GPIO_togglePins(GPIO_LEDS_PORT,
                GPIO_LEDS_USER_LED_2_PIN | GPIO_LEDS_USER_LED_3_PIN);
    
            DELAY = get_delay();
            delay_cycles(DELAY);
            DL_GPIO_togglePins(GPIO_LEDS_PORT,
                GPIO_LEDS_USER_LED_3_PIN | GPIO_LEDS_USER_LED_1_PIN);
        }
    }

    我已将 POT 连接至 PA25、接地端和由 J1 引脚接头提供的 3.3V 电压。 从与 SDK 中的其他 ADC 文件相比、我看不到清除错误。

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

    您使用的是 Launchpad? 原理图[Ref Launchpad UG (SLAU869E) 第 5 节]显示了 PA25 也连接到 J4。 您是否移除了该跳线?

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

    是的、我正在使用 Launchpad、我不知道 J1 和 J4 之间没有跳线。 我看不到物理连接。

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

    如果 PA25 上安装了跳线块、则 J4 会将其连接到 GND(也连接到光电二极管)。 我想您得到跳线块后就安装了。 应将其删除。

    [免责声明:我很确定 L1306 Launchpad 有两个版本。 LaunchPad 用户指南的修订版 E(而非修订版 D)与我获得的(后续)电路板版本相匹配。]

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

    PA25 上没有跳线块

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

    如果您将电压表连接到 J4 的高侧、它会显示什么? (可能是引脚离电路板边缘更远。)

    我已将 POT 连接至 PA25、接地端和由 J1 引脚接头提供的 3.3V 电压。  

    我在 J1 上没有看到 3.3V 或 GND。 我看到 PA25、PA15 和热敏电阻电路。 现在我想知道我们是否要查看同一个板 (Rev)。

    [编辑:我想我现在看到: Booster Pack 标头也被命名为 J1-J4 ,即 指示符是重复的 (!)。 我想到的是电路板底部的 J4(以及 J5/J6)。]

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

    您好 Carwyn、  

    希望您度过美好的一天。 不过,我想根据 Bruce 的最后一条评论来验证是否有任何关于这一点的更新。 如果没有,请也告诉我。  

    此致、Jojo

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

    您好:

    CCS 中创建了一个新工程、并创建了类似的代码。 这个新版本完全可以正常工作,没有错误。 我不确定之前的问题是什么。

    感谢您的帮助。