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/MSP430G2553:ADC 定序问题

Guru**** 2605765 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652684/ccs-msp430g2553-adc-sequencing-issue

器件型号:MSP430G2553

工具/软件:Code Composer Studio

您好!

我无法理解我的代码中的问题、因此我无法获得正确的 ADC 计数。

硬件配置:

  1. MCU MSP430G2553以1MHz 运行。
  2. A1、A2、A3是 ADC 输入(P1.1、P1.2、P1.3)
  3. 在 A1引脚上施加2.4VDC。
  4. ADC 基准电压与电源电压相同。

代码:

#include 
#include "main.h"#include


unsigned int adc [10];

int main (void)
{
//时钟---------------
WDTCTL = WDTPW + WDTHOLD; //如果
(CALBC1_1MHz=0xFF)则停止 WDT//如果校准常数被擦除
{
while (1); //不加载,陷阱 CPU!!
}
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;//设置范围
DCOCTL = CALDCO_1MHZ;
BCSCTL2 &=~(DIVS_3);// SMCLK = DCO = 1MHZ


// ADC ------

ADC10CTL1 =INCH_3+CONSEQ_1 +ADC10SSEL_3;
ADC10CTL0 =SREF_0 + ADC10SHT_0 + MSC+ ADC10ON + ADC10IE;
ADC10AE0 |= 0x0E;
ADC10DTC1 = 3;//三次转换。
ADC10SA = ADC; // ADC10数据传输起始地址。
while (ADC10CTL1 & ADC10BUSY);//等待 ADC10内核被激活
ADC10CTL0 |=ENC + ADC10SC;//在

(1)期间开始对话;
}


// ADC10中断服务例程
#pragma vector=ADC10_vector
__interrupt void ADC10_ISR (void)
{
ADC10CTL0 &=~ADC10IFG;//清除中断标志
ADC10SA = ADC;// ADC10数据传输起始地址。
ADC10CTL0 |=ENC + ADC10SC; //开始对话
} 

结果:

ADC[0]= 34  

ADC[1]=35

ADC[2]=167

问题:

1.如果我施加2.4伏电压,那么为什么我没有得到相等的2.4×1023/3 = 818? 我的配置中缺少什么? 请提供指导。

2.该 ADC 阵列是否会按顺序存储所用通道的值、仅像 ADC[0]= A1通道的计数、ADC[1]= A2通道的计数等? 还是始终从 A0开始(即使我没有使用)?

请提供指导。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我错过了代码中的一行:
    _ENABLE_INTERRUPT ();//启用中断。
    while (1);
    请考虑一下、如果您能提供解决上述问题的建议、这将非常有帮助。

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

    我建议您参考代码示例。 单序列模式的代码如下: dev.ti.com/.../

    您可以首先运行此代码、然后针对您的通道和配置进行修改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wei、

    我已经对它进行了测试、它运行正常、但我对非阻塞方法感兴趣、例如使用中断。 您能不能指导我如何使用中断执行相同的操作。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1)(a)如果这是 Launchpad:如何设置 J4 ("桥接器")跳线、尤其是 RXD/TXD? (b)您的 SHTs 非常短(4usec)、这可能无法为采样电容器提供足够的时间。 运行 SLAU144J 22.2.5.1小节中的公式和/或只增加 SHTS、看看会发生什么情况。

    2) ADC (在序列模式中)从英寸开始递减计数、因此 ADC[0]= A3、ADC[1]= A2、ADC[2]= A1。 它将转换 A0、但由于 DTC1=3、结果将安静地位于 ADC10MEM 中并被遗忘。 这是 SLAU144J 图22-6和22-10的交叉点"正常工作"之一;一个结果是、当您进入 ISR 时、ADC 可能已经完成、也可能尚未完成。 我建议您设置 DTC1=4 (采用 ADC[3])以确保 ADC10IFG 意味着您的目标。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的解释、现在更清楚、ADC 计数在范围内。

    在考虑之前的反馈后、仍然有一个与存储器地址相关的问题、其中产生的值(即800)被转移到另一个存储器位置。

    我的预期结果如下所示、如果我进行单步调试、则可以正常工作。

    ADC[0]= 0;

    ADC[1]=0;

    ADC[2]=800;

    ADC[3]=0;

    如果我执行自由运行并暂停调试、 我正在获得

    ADC[0]= 800;

    ADC[1]=0;

    ADC[2]=800;

    ADC[3]=0;

    ADC[0]= 0;

    ADC[1]=800;

    ADC[2]=800;

    ADC[3]=0;

    原因可能是什么? 请提供指导。

    感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还在 F2中观察到了这一点、我很确定它与一些在断点处被停止的时钟有关、而与某些时钟无关。 MCLK 肯定在一个断点处停止、DTC 取决于它。 如果 ADC 时钟(我通常使用 ADC10OSC、但 SMCLK 可能也是如此)在您处于断点时保持运行、ADC 将溢出 ADC10MEM、并且当 DTC (MCLK)再次启动时、它将查看"错误"值。

    由于每次您分配 ADC10SA 时、DTC 都会被重置(另请参见 SLAU144J 图22-10)、因此它应该在下一次自行校正。

    如果 ADC 始终运行(断点运行时的概率很高)、这种影响就会变得更加明显;在我的应用中、这种情况很少见、而我的 ADC 采样是固定速率(基于计时器)、采样之间的时间相对较长。