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.

[参考译文] CCS/MSP430F67791A:ADC 中断时序问题

Guru**** 2535150 points
Other Parts Discussed in Thread: MSP430F67791A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652403/ccs-msp430f67791a-adc-interrupt-timing-issue

器件型号:MSP430F67791A

工具/软件:Code Composer Studio

尊敬的所有人:

我必须对 ADC 进行配置、以便在 所有7个通道完成模数转换后、每200uSec 接收一次 ADC 中断。

我已将一个计时器配置为200uec、其中

SD24BIE |= SD24BIE6 (在最后一个通道的转换完成时启用中断)

我已为 MSP430F67791A 中可用于 SD24B 的7个通道配置了以下设置。

SD24时钟:SMCLK = 16MHz

OSR:256

SD24PDIV = 3

SD24DIV=0

左对齐

组转换

SD24BIE = SD24IE6 (为了在最后一个通道的转换完成时接收中断)

在 ADC 中断中:  

采集样本

SD24BIE &= ~SD24IE6;

代码运行完全正常、即如果未使用最后一个通道(通道6)读数、则我每200 μ 秒接收一次 ADC 中断。(为最后一个通道启用中断)

即使我将最后一个通道读数(SD24BMEMH6和 SD24BMEML6)移动到 temp_Variable 中、也不会每200uSec 获得一次 ADC 中断(它几乎翻了一番、大约为400uec)。

据观察、对于任何通道  SD24BIE |= SD24BIE6  ADC 中断被启用的情况、此行为重复、即如果在 处理第5通道( SD24BMEMH5和 SD24BMEML5)的结果时对第5通道 SD24BIE |= SD24BIE5启用了中断  ADC 中断时间被改变。

需要您的帮助来解决此问题。

此致、

Shweta Shelar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    向后工作:使用(读取)转换器6的 SD24BMEM 寄存器清除 IFG6。 相反,不读取结果寄存器不会清除 IFG --在这种情况下,IFG 总是挂起的,所以每200微秒就会看到一个"结果"(不一定是新结果)。

    另一个神秘之处是获得真实(新鲜)样本的周期(2倍)更长。 我的算术运算符、我认为它与您的运算符匹配、表示输出速率应为16MHz/8/1/256=7812.5Hz、或者大约128usec/样本。 基于此、在任何200uec 周期内应始终(至少)有一个输出样本、但这不是您看到的、因此我猜您的输出速率不是您认为的速率。

    您如何确定 SMCLK 实际上是16MHz? 是否设置 SD24BPRE 非0?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bruce:

    感谢你的帮助。

    我想问题是你提到的:
    向后工作:使用(读取)转换器6的 SD24BMEM 寄存器清除 IFG6。 相反,不读取结果寄存器不会清除 IFG --在这种情况下,IFG 总是挂起的,所以每200微秒就会看到一个"结果"(不一定是新结果)。

    当您读取转换器6的 SD24BMEM 寄存器时,如果将 SD24BIE|= SD24BIE6或置位,则2倍的周期更长
    当 u 读取转换器5的 SD24BMEM 寄存器时、当设置 SD24BIE |= SD24BIE5等时。
    对于您设置的任何中断使能、如果您读取该转换器的 SD24BMEM 寄存器、则会观察到更长的周期。
    如果 SD24BMEM 寄存器保持不变、它会每200uSec 正确地提供一次采样。 (这可确保正确设置采样率)

    如果我需要读取所有 SD24BMEM 寄存器、而无需2倍的周期即可获得真正的样本、该怎么办?

    因为我需要读取应用的所有通道。


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

    当需要200uS 时、将单次转换更改为组转换可将延迟降至240uC

    出现此问题的可能原因是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >如果 SD24BMEM 寄存器保持不变、则每200uSec 一次正确地提供一次采样。 (这可确保正确设置采样率)
    不、不是。 这样会始终保持 IFG 设置、因此无法测量采样(输出)速率。

    有许多因素会相互作用、导致输出周期更长。 是否设置 SD24SNGL? SD24INTDLYTM SD24BPRETM 如何触发?

    如果您可以发布初始化和 ISR 代码、这将节省大量猜测。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >如果 SD24BMEM 寄存器保持不变、则每200uSec 一次正确地提供一次采样。 (这可确保正确设置采样率)
    不、不是。 这样会始终保持 IFG 设置、因此无法测量采样(输出)速率。

    我想强调的是、我正在读取 SD24BMEM 寄存器中除最后一个通道之外的所有通道、然后我将得到200usec。
    如果我读取剩余通道的最后一个通道、那么它显示的时间会更长(现在连续转换设置为240usec)、再增加40 us


    ADC 初始化设置(在第一封邮件中提到)

    SD24时钟:SMCLK = 16MHz

    OSR:256

    SD24PDIV = 3

    SD24DIV=0

    左对齐

    连续转换
    使用 SD24BGRP0SC 进行组触发

    SD24BIE=SD24IE6


    请参阅第一条消息以了解详细说明


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

    Bruce 正在请求您的实际代码、而不仅仅是您认为器件正在运行的设置。 这样、我们就可以消除调试问题时涉及的大量猜测。 在这方面、即使是在不提供任何应用程序的情况下显示问题的简化示例也很有用。

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

    尊敬的 Bruce:

    请找到下面包含我正在处理的代码文件的存档。

    e2e.ti.com/.../ADC_5F00_MSP430F67791A_5F00_.zip

    它包含时钟设置、计时器设置、SD24B 设置 及其中断例程

    在 SD24B 中断例程中、我切换了 P1OUT 以观察 ADC 中断时间。

    当我注释以下行时、我得到 ADC 中断时间为200 μ s

    I_Sample[0]=(SD24BMEMH6<<8);//保存 CH6结果(清除 IFG)  
    I_Sampl[0]|=(SD24BMEML6>>8);

    如果它保持未注释状态、它将提供200uC 的中断时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、如果它仍然没有注释、则会给出240usec 的中断时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Praful、

    感谢您提供代码。 只要 SD24GRP0SC 被置位、SD24_B 就会持续转换、完全独立于一个外部定时器触发器。 Bruce 对128微秒/样本的分析仍然有效、但随后该通道组需要896微秒(长7倍)的采样时间。 通过不在 ISR 中读取/存储 SD24BMEMH6值、SD24IFG6保持置1状态、但您已经手动清除 SD24IE、因此在每200微秒发生一次计时器 A1中断之前不会重新进入 ISR。 不管怎样、很明显、只有极少数的结果会被正确采样和更新、我的建议是您重新访问采样频率要求并大幅降低 OSR。

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

    感谢您的回复。我只想尝试减少 OSR 并检查时间安排。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > SD24BCTL0 = SD24SSEL_1 //时钟为 SMCLK */
    > | SD24PDIV_3 /* 8分频=> ADC 时钟:2MHz */
    > | SD24DIV0

    SD24DIV0描述的除数为2、而不是1。 这会将输出周期增加到256 μ s (测量值非常接近240 μ s)。 请尝试

    > |(0*SD24DIV0)// SD24DIV_0 -> DIV=1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce、您好!
    感谢你的帮助。 我们将进一步处理您的输入以进行进一步测试。 我将返回给您以获得进一步的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ryan:

    尝试使用更少的 OSR 进行测试、每200微秒获得一次中断。

    如果进入连续触发模式、我对 ADC 中断间隔有疑问。

    如果我已设置
    OSR:128
    CLK:SMCLK:16MHz
    SD24CLKDIVx:0
    SD24CLKPDIVx:3.

    观察到的 ADC 间隔应为多少。

    进行计算
    fm = 16MHz/((SD24CLKDIVx+1)*2^SD24CLKPDIVx)(如用户手册中所述)

    FM = 2MHz

    采样率= FM/OSR = 16384

    采样间隔:60微秒

    但我观察到的是120微秒。

    当我将 OSR 设置为256时、情况也是如此

    预期间隔:120 μ s,但观察到的是240 μ s。

    我的计算出错了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > SD24CLKDIVx:0
    >将 OSR 设置为256时情况相同
    >预期间隔:120 μ s,但观察到的是240 μ s。

    是否确定 SD24[CLK]DIV=0? 这是您之前使用 SD24DIV=SD24DIV0 (不是=0)报告的测量值。 OSR=128时的测量值也与该设置一致。 您是否进行了我在上面建议的更改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据数据表,设置 SD24CLKDIVx: 0对应于/1。

    我已按照您的建议进行了更改、但结果是一致的。

    对于 OSR 为128
    采样间隔:60微秒

    但我观察到的是120微秒。

    当我将 OSR 设置为256时、情况也是如此

    预期间隔:120 μ s,但观察到的是240 μ s。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Praful、

    Bruce 非常耐心地解释说、SD24DIV0将字段的第一个位设置为1、而您的预期是将所有 SD24DIVx 位设置为零。 通过查看 MSP430F67791A 头文件可以清楚地说明这一点。 因此 SD24DIVx=0001b、这是一个除以2的结果、导致您观察到的采样问题。

    此致、
    Ryan