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 值均为0x0000

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1390540/mspm0g3507-all-adc-values-are-0x0000

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

工具与软件:

与其他线程类似、我只返回0x0000。

我已经把 POWERDOWN 模式设置为手动模式、并且延长了采样周期。

   SYSCFG_DL_init ();
   NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);
   NVIC_EnableIRQ (ADC12_1_INST_INT_IRQN);

   forever (

       DL_ADC12_enableConversions (ADC12_1_INST);//?? 是否需要在每次转换后再次执行此操作?  没有获得第二次转换、因此添加了
       DL_ADC12_startConversion (ADC12_1_INST);

      gStateAdc[1]= adcBusy;

       while (gStateAdc[1]!=adcComplete)

       //在中断之后才能到达此点:DL_ADC12_IIDX_MEM4_Result_Loaded

       for (uint16_t delay=0;delay<0xF000;delay++)_NOP ();//这是调试代码、因为 Janz Bai 质疑是否有足够的时间来获取任何值。

       gRegSpace[REG_AdcAmp0]= DL_ADC12_getMemResult (ADC12_1_INST、DL_ADC12_MEM_IDX_0);
       gRegSpace[REG_AdcAmp1]= DL_ADC12_getMemResult (ADC12_1_INST、DL_ADC12_MEM_IDX_1);
       gRegSpace[REG_AdcAmp2]= DL_ADC12_getMemResult (ADC12_1_INST、DL_ADC12_MEM_IDX_2);
       gRegSpace[REG_AdcAmp3]= DL_ADC12_getMemResult (ADC12_1_INST、DL_ADC12_MEM_IDX_3);
       gRegSpace[REG_Adc48v ]= DL_ADC12_getMemResult (ADC12_1_INST、DL_ADC12_MEM_IDX_4);

       

   )

void ADC12_1_INST_IRQHandler (void)

   DL_ADC12_IIDX 挂起中断= DL_ADC12_getPendingInterrupt (ADC12_1_INST);
   开关(PendingInterrupt){
       案例 DL_ADC12_IIDX_MEM4_RESULT_LOADED:
           //DL_ADC12_stopConversion (ADC12_1_INST);
           //DL_ADC12_disableConversions (ADC12_1_INST);
           gStateAdc[1]= adcComplete;//停止转换后更改状态
           休息;
}

我确实获得了中断、但每次转换(包括第一个转换)都是值0x0000

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

    您好、

    我明天会给你答复。

    此致、

    Janz Bai

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

    您好!

    我想与您分享一些重要的要点:  

    1)。 如果将"trigger source"设置为 "software"、当您希望进行 ADC 转换时应该使用"startConversion"指令、例如使用计时器和 定期在计时器中断中启动转换。

    2)。 如果您不想使用计时器中断、但想使用计时器进行定期转换、则应将"trigger source"设置为"event"并在 SysConfig 上进行相关配置。  

    3)。 如果未点击 SysConfig 上的"Enable Repeat Mode"、则应在进行 ADC 转换之前调用"enable_conversions"指令。

    4)。 我认为与您的问题相关的主要原因是、您在读取结果之前没有给 ADC 足够的时间来进行采样和转换。 在代码中、您在"开始转换"之后立即读取 ADC 存储器、这将导致您从 ADC 存储器中读取0x0。

    5)。 您可以从 TI.com 下载我们的 SDK。 您可以在 SDK 中找到示例项目:"adc12_triggered_by_timer_event_lp_MSPM0L3507"。 您可以参阅我们的技术参考手册中的此示例和相关器件(第 ADC 章)、该手册可从 TI.com 下载以获取详细信息。  

    此致、

    Janz Bai

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

    我拥有 SDK、我根据您提供的示例对代码进行了建模。  尽管该示例没有再次发生、但我代码中的注释表明、我发现我需要 DL_ADC12_enableConversions (ADC12_1_INST)以获得第二次转换。

    很抱歉我粘贴的初始代码不完整、我没有注意到我删除了太多代码。  我已经修复了原来的帖子
    直线:
    "while ("

    应该是的

    "while ( gStateAdc[1]!= adcComplete )等待"

    此外、我没有明确显示该行、但我也在开始转换后设置 gStateAdc[1]= adcBusy。

    我已单步执行代码、看起来各项设置和工作正常。

    因此回答您的观点:
    1)是的,它在我的代码
    2)这不是我选择的模式
    3)是的,它在我的代码
    4) 4)由于作为实验我在单步执行代码时看不到延迟、我等了多长时间才收到 DL_ADC12_IIDX_MEM4_RESULT_LOADED、然后我做了:
       for (uint16_t delay=0;delay<0xF000;delay++){
           __ NOP();
       }
    即使有这个额外的延迟、我仍然看到0x0000
    5)是的,我在这个和许多其他例子上设计了我的代码

    我不想公开上传我的整个源代码,但如果你想看我的代码,我可以私下分享。

    我查看了 syscfg 并按照示例中的说明将时钟从 sysosc 修改为 ulpclk、但这并没有改变行为

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

    您好!

    1)。 是的、您确实需要"enable_conversions"进行第二次转换、因为完成一次转换后、ADC 将是"disable conversion"。

    2)。 我想您可以修改"while (gStateAdc[1]!=adcComplete)"菜单、 "至"while (gStateAdc[1]!=adcComplete){_WFI ()}"、这将帮助您节省电量、即使这不是问题的原因。

    3)。 您能否将示例代码从 SDK 直接下载到 M0中? 如果这样做、您是否能够看到 ADC 的正确结果?

    4)。 也许您还需要检查信号是否太小而无法进行采样。

    此致、

    Janz Bai

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

    1)是的,这是在代码,当我第一次启动票.  我已经把它弄明白了。  感谢您确认它已获得充分利用。

    2) 2)我的代码更复杂、我的两个 ADC 通道的读数均为5个引脚。  还运行了 SPI 外设。  我仅在不在协议事务过程中时将 ADC 值传输到寄存器... 我想当这些事情都没有发生时、我可以设置一个 WFI、但一旦一切正常运行、我就会担心这个问题。  感谢您的建议。

    3) 3)是的、我得到一些值。  我开始检查有什么不同、与一般设置不同的是时钟差、我更改了。  否则我看不出什么是功能上的不同,但我可以忽略的东西。  我将从参考开始、并开始逐步进行更改、直到它与我的设计相匹配。  我还不能这样做,因为其他义务,我希望你可能有一些见解,我可以回到它.  

    我已经必须执行此操作一次、因为无法连接中断例程(一直获取默认处理程序、因此我必须从超基本设计开始、逐步添加器件、直到我重新创建设计并创建有效函数)

    4) 4)我将使用显示正确的3V 外部基准。  其中一些信号约为2.3V

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

    您好!

    根据您的 ADC 器件配置、我当前没有找到错误。 由于代码更复杂、我认为使用调试器进行更多的调试也是查找根本原因的好方法。 在对其进行调试时、请注意不同电源模式下的时钟使用和外设使用情况、您可以参阅我们的 G 系列技术参考手册中的表2-1。  

    有两种简单的测试方法:1)。 只需按照本文中所述配置 ADC 器件、而无需配置任何其他无相关外设(单独测试 ADC 模块)并检查是否可以获得正确的值。 2)。 尝试将示例代码中的 ADC 模块直接放入您自己的代码中、并检查是否可以得到正确的值。

    总之、技术参考手册可以为您提供很大帮助: MSPM0 G 系列80MHz 微控制器技术参考手册(修订版 A)(TI.com)

    此致、

    Janz Bai

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

    我已经将问题追溯到尝试使用 VREF。

    使用示例代码、我转动2个 ADC、每个5通道、我仍然获得值。

    然后我添加了

    并修改了通道的2个

    完成此操作后、2个通道我更改了读回0、而它们以前并不是。

    为了使这项工作有效、我还需要做些什么吗?  可以在其中一个电路板上进行测试吗?

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

    您好!

    您的意思是"使用示例代码、我把2-ADC 转换为5个通道、我仍然得到了值"、但是当您将 VREF 模块添加到代码中、并将 ADC 通道0和1的基准从 VDDA 修改为 VREF、而不用进行其他修改时、您会发现结果是0x0、对吧?

    您能否检查基准引脚上是否有去耦电容器? 您可以仔细检查以下内容:

    希望这些信息可以帮助您进行调试工作。

    此致、

    Janz Bai

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

    在我的设计中、如果我仅将通道更改为使用 VDDA 而不是 VREF、我将获得这些通道的值。

    这里有一个参考设计 adc12_single_conversion_vref_external
    这会显示相同的结果(我只更改了封装、ADC 通道以使用内部电源以及 Vref 的电压设置。


    至于我的外部 Vref、我有2.2U 可降低基准噪声、并有一个靠近微控制器的0402 1UF 旁路电容器。

    使用万用表时、我看到它非常接近3.0V

    我的 VDD 是3.3V

    有些采样值接近0、有些值为2.5V、外加测量内部温度和 VCORE 显示相同的行为。

    如其他线程所述、由于存在噪声和偏移、即使是0V 信号也不会读回0x0000。

    您能否验证基准是否正常工作?  即使您没有实际的基准、也可以将 Vref 的引脚连接到不同的引脚并输出3.3V... 它不是一个干净的基准、而是一个可用于测试的电压?

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

    几个相关的其他问题

    1)
    在哪里可以找到有关所有内部寄存器定义、寄存器以及每个位的功能的文档?

    2)
    我看到 SYSCFG_DL_VREF_init ()

    作为 SYSCFG_DL_init ()的一部分

    我在 ADC12_single_conversion_Vref_external 样本中未调用任何其他 DL_VREF。  使用前是否需要调用任何其他函数?

    3)

    使用外部基准时、Vref 寄存器中应该有什么值?

    VREF            
       VREF_GPRCM            
       VREF_CLKDIV   0x00000000   时钟分频器[存储器映射]    
       VREF_CLKSEL   0x00000000   时钟选择[存储器映射]    
       VREF_CTL0   0x00000000   控制0 [存储器映射]    
       VREF_CTL1   0x00000000   控制1 [存储器映射]    
       VREF_CTL2   0x00000000   控制2 [存储器映射]    

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

    您好!

    关于当前问题、请允许我进行总结:  

    1)。 使用"adc12_triggered_by_timer_event_LP_MSPM0L3507"示例代码可行、但只需将 VDDA 修改为 VREF 就可起作用(读出0x0)

    2)。 无需进行任何修改、直接使用带有外部基准的"adc12_single_conversion_vref_external"示例代码、它是否可以运行? 或者它不能工作,除非你把引用更改为内部? (很抱歉、我不明白"这显示了相同的结果(.. ...)",所以请帮助我确认它)

    3)。 原因似乎是外部 VREF。 本周我将进行一些测试。  

    以及关于您的其他问题:  

    1)。 我之前已经向您发送了 TRM 的链接、您可以在其中找到每个寄存器的说明和功能: MSPM0 G 系列80MHz 微控制器技术参考手册(修订版 A)(TI.com)。请阅读它。

    2)。 您不需要调用其他函数、因为当您在 SysConfig 中配置 ADC 和 VREF 器件时、它已完全配置。

    3)。 请参阅 TRM。

    此致、

    Janz Bai

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

    我将开始新的测试、并记录步骤和结果
    1) 1)导入 adc12_single_conversion_vref_external_LP_MSPM0G3507_nortos_ticlang
    2) 2)将封装更改为 VQFN-32、因为这就是我的板上的封装。
    3) 3)修改 VREF ->基本配置->外部电压= 3.0V
    4) 4)我在查看调试器时发现此代码不会向我显示 adcResult 的值、我可以查看汇编代码并查看正在使用的内核寄存器、但是为了更清楚此示例的内容、我修改了代码、如下所示:
    4a)在 main 之外添加了一个易失性 uint16_t gPrevAdcVal
    4b)添加了 gPrevAdcVal = adcResult;
    5) 5)调试运行
    6) 6)暂停并检查值、gPrevAdcVal 为0x0000
    7) 7)修改 ADC12_0 -> ADC 转换内存配置-> ADC 转换内存0配置->基准电压= VDDA (以前为 VREF)
    8) 8)编译项目、调试、暂停
    9) gPrevAdcVal = 0xBED

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

    是否有任何更新?  您是否能够找到具有 Vref 引脚的电路板?  您看到了什么行为?

    谢谢。

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

    你好、WorkBee、

    我在我这边用示例项目"adc12_single_conversion_vref_external"和 MSPM0G3507 LaunchPad 完成了一些测试、并使用3.3V 外部源作为外部基准。 将3.3V 源设置为基准、将1.1V 源设置为 ADC 输入后、我进入调试模式、可以正确获取不为0的 ADC 结果。 这是我使用的代码。  

    e2e.ti.com/.../adc12_5F00_single_5F00_conversion_5F00_vref_5F00_external_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang.zip

    我想、您可能需要确认、当您的 MCU 已通电并且 ADC 开始工作时、您的基准电压已被记为3V (您在前面的回复中使用的值)。

    此致、

    Janz Bai

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

    感谢您对此进行深入了解。  我把你的项目,并在与 CCS 战斗(最终重新安装一切)后,我现在运行相同版本的软件与你。

    代码在我的 LaunchPad 上运行、但无法正常工作(我认为全部为0xFF、但可以对此进行解释、因为我的 LaunchPad 在基准引脚上没有外部电压。)

    然后、我在我的电路板上运行代码(不更改 SysConfig 中的封装类型)、我不确定这是否可行、或者我是否需要修改一些内容... 在内部我假设它使用相同的内部资源,所以它仍然可以工作。  我读回0x0000

    然后、我将 SysConfig 更改为正确的封装、我读回0x0000

    我仔细检查了数据表、SysConfig、引脚排列、并通过 PCB 查看器进行了验证、 引脚看起来是正确的。

    我正在查看器件旁边的通孔:


    万用表显示为2.997、运行时振荡上的差频显示为3.064-3.068

    我偶然间发现了焊料问题、打开了一个新电路板、现在对其进行测试。  我仍然看到0x0000。

    我有一个较早的部分、不确定这是否重要...

    Mspm0
    G3507S
    TIX3688
    AL01 G4

    感谢您的持续支持。

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

    你好、WorkerBee、

    所以、您的意思是、使用我发送给您的示例代码不能正常工作、您回读的结果仍然是0x0? 这是非常陌生的。 在我之前的答复中、我提到当 ADC 开始工作时、你必须确认、外部基准必须稳定、这是因为如果不稳定、ADC 可能会根据错误的基准电压值计算结果。 关于它的另一点是您在 VREF 附近使用的电容。 在 LaunchPad 上、VREF+和 VREF-之间的电容约为1uF。 在数据表中、数据表提到了当您使用外部基准时、应根据源值选择电容值。 但您使用的电容可能有点大。

    此致、

    Janz Bai

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

    我可以详细说明之前的内容
    "运行时振荡上的差动 prope 显示3.064-3.068"
    使用定期对通道(使用的 Vref)进行采样的采样代码

    我使用差分探头、使用峰值检测采集模式来捕获信号中的任何干扰。

    我把触发电压调得尽可能低、直到几乎没有任何触发、这就意味着得到了最坏情况的波形。

    您可以看到、它非常接近3.0V

    即使信号不是超级稳定、我也无法看到它如何导致读数为0x0000。  如果基准电压过低、那么我会认为捕捉到的值人为地过高... 就像在我的 LaunchPad 上没有 Vref 时、它会读回最大值。

    除了外部基准的电容过高之外、我不认为微控制器存在此问题、因为它仅使用此电压、并未尝试调节此电压。  需要使用电容来平缓任何电流尖峰、电容的任何问题都是器件中用于调节电压、在本例中、LM4040的规定如下:
    "LM4040无需在阴极和阳极之间使用输出电容器即可确保稳定性。 但是、如果需要输出旁路电容器、LM4040被设计为在所有容性负载下保持稳定"

    同样、如果这是个问题、我仍然不希望该值为"0x0000"、我希望该值过高。

    对于一个不同的 ADC 问题、TI 的回应是他们并不期望该值为0x0000、因为即使是0电压信号也会有一些非零值。

    我已经联系了我的 FAE、并将其链接到该主题。  你还有其他想法吗?

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

    你好、WorkerBee、

    请让我做一个总结:

    1)。 我可以使用我发送的示例代码获取正确的值;

    2)。 您无法使用由我发送的示例代码(始终为0x0h)获得正确的值;

    3)。 但是、当您将参考值从外部更改为 VDDA 时、您可以获得正确的值;

    您能否将 MSPM0G3507 LaunchPad 与外部基准配合使用进行简单测试、以检查在 LaunchPad 上添加外部基准时是否可以获得正确的值。

    最好联系我们的 FAE、可能需要 FAE 来检查您的硬件电路。 根本原因似乎是硬件。

    希望您能解决这个问题、祝您工作愉快

    此致、

    Janz Bai