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.

[参考译文] MSP430G2553:ADC10具有恒定不变的读数

Guru**** 2551300 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/840774/msp430g2553-adc10-has-a-constant-and-unchanged-reading

器件型号:MSP430G2553

我编写了一个程序来将游戏手柄与 ADC10连接。 在调试期间、发现 ADC10MEM 的内容不会改变(常量0x0006)、这意味着它在某个位置读取一个无效值、但我不能确定代码的错误位置。 可以有人帮我解决这个问题吗? 谢谢你。

代码就在这里。  

本视频中复制了整个过程(抱歉、是因为质量较低。 我自己动手):

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

    视频的 URL 位于 此处

    图片显示了变化:

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

    萧生、您好、

    遗憾的是、我现在没有时间查看您的固件、但我们在 http://dev.ti.com/tirex/explore/node?node=ALFfIDtjUH-HwRytz.WJPQ__IOGqZri__LATEST 上提供了一组 MSP430F2553的 ADC 示例 

    我将按原样测试示例、以查看 ADC 是否正常工作、然后将其与您的固件进行比较。  

    祝您好运!

    JD  

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

    JD、您好!

    感谢您的快速回复。 您提供给我的链接是我在设计中所考虑的。 我希望这是电气连接错误。 与我的结果相比、期待您的测试!

    一个

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

    ADC10MEM 的内容(当 BUSY=0时)并不是很有趣、因为这是 A0 (P1.0)的结果、你已经将它驱动为低电平(SS)。 有趣的是我在这里没有看到的 X_Y[](DTC 目标)的内容。

    您发现了什么研究结果?

    未经请求:您启动转换(序列)、但在数据完成之前获取数据、因此您的结果通常是过时的。 示例 ADC10_05 (JD 指向你)显示了如何使用忙位等待。

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

    感谢您的回复。 X_Y[]的内容也是持续的{0x0006、0}、这可以在视频中看到:LED 按0b00000110、0b00000000序列点亮。  

    我已经检查了我的代码、等待 BUSY 位的方式与您在示例中所示的方式相同:

    while (ADC10CTL1和 ADC10BUSY);//等待 ADC10内核处于活动状态 

    和... 我不在 ADC10AE 中启用 BIT0、只有 BIT7和 BIT6被启用。 我甚至不知道0x0006来自哪里。

    我遵循的是示例 ADC10_10.c 和此 链接。 除了 LPM0模式、其余所有模式都是相同的。 但是、ADC10中断似乎不是很必要、它无法进入 LPM0、因为 SPI 无法工作、这是我的经验、即使只使用 SPI 也是如此。

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

    对于 CONSEQ=1、ADC10始终从 INCH 向下计数至0 [参考 UG (SLAU144J)图22-6]。 ADC10AE 只是调节引脚电路。 如果 A0结果恰好与 A7结果匹配,我会说这是巧合;当输入实际为0V 时,我通常会看到小整数(>0)--可能是热噪声。

    你有一个 ADC10BUSY 的旋转等待、但是在设置 ADCSC 和获取结果(X_Y)之间没有一个、所以你在获取结果之前获取结果。 (如果您在那里等待、则不需要上面有 clear-ENC-and-wait。)

    --------

    您的 SPI Rx ISR 仅有条件地获取 RXBUF。 如果它没有读取 RXBUF、RXIFG 将保持有效、并且 ISR 将被反复调用。 我建议您(无条件)将 RXBUF 读取为一个临时变量、然后决定如何处理它。

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

    嗯、我找到了它显示0x0006的原因。 有跳线可将 TXD 和 RXD (P1.6和 P1.7)连接到评估板上的调试器。 现在我将其删除、现在它显示常量{0、0}。

    我实际上执行了你所说的操作(即使它与给出的示例 ADC10_10.c 不同)。 它仍然显示相同的结果(常数{6、0}、之后是{0、0})。 我发现 ADC 在 ADCSC 置1后读取并移动值、无论在何处放置等待循环、这意味着数据已被正确转换并放入数组。

    我甚至还会做进一步的研究:

    X_Y[]初始化为8元素数组并进行 DTC 8转换,但它仍然是{6,0,0,...} (之后在{0、0、...}上)、这意味着只有 A7被读取到存储器中并传输到 X_Y[]、而其余的读取为0。

    2.我拔下操纵杆的插头-- ADC10读不出任何内容,应该为0。 但它仍然是{6、0}(之后是{0、0})。

    我开始想:我的代码有什么问题吗? 还是序列转换只能从英寸到 A0?

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

    > 还是序列转换只能从英寸到 A0?

    CONSEQ=1始终从 INCH 变为 A0。 如果 DTC 计数小于该值、则会停止、但 ADC 会继续。

    > ADC 在 ADCSC 置1后立即读取并移动该值、无论在何处放置等待循环

    是的。 部分幻想是,在16MHz 时,CPU 运行得非常快(与 ADC 相比),以至于在原始代码中,ADC 在设置 ENC=0时没有完成,所以忙回路就是它完成的地方。 例如、MCLK = 1MHz 时、您会看到不同的症状。

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

    是的、你是对的。

    我发现我应该将所有 ADC 代码放入一个函数中、并通过调试器在循环中运行它。 使用原始代码、它只能读取一个通道。 当 ADCSC 和转换之间等待时、整个转换实际上可以完成。

    感谢您的帮助和快速响应。 这已解决