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/MSP430F5659:MSP430F5659中的 ADC 12问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/707486/ccs-msp430f5659-adc-12-problem-in-msp430f5659

器件型号:MSP430F5659

工具/软件:Code Composer Studio

您好!

我在 MSP430F5659中的 ADC12有一些问题、我需要在没有中断的情况下读取 ADC 读数、但问题是我没有在存储器寄存器中获得结果、执行也会等待在存储器中加载结果(IFG 正在等待)。我在下面发布代码请解决此问题、希望您能轻松解决。

int main (空)

WDTCTL = WDTPW+WDTHOLD;//停止看门狗计时器
P6SEL |= BIT7;//启用 A/D 通道输入
ADC12CTL0 = ADC12ON;//打开 ADC12、延长采样时间
//以避免结果溢出
ADC12CTL1 = ADC12CONSEQ_3+ADC12SSEL_3;//使用采样计时器、重复序列
ADC12CTL2=ADC12RES_2;
ADC12MCTL7 = ADC12INCH_7;// ref+=AVcc、channel = A0

ADC12CTL0 |= ADC12ENC;//启用转换
ADC12CTL0 |= ADC12SC;//开始转换-软件触发器

while (1)

ADC12CTL0 |= ADC12SC;//开始转换
while (!(ADC12IFG 和 ADC12IFG7));
结果= ADC12MEM7;
__no_operation();//在此设置断点

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aju、
    因为 ADC 正在等待 SAMPCON 的另一个上升沿来启动下一个通道、而在您的配置中、这是由 ADC12SC 直接控制的。 要修复此问题、请设置 ADC12SHP 和 ADC12MSC。 完成此操作后、您应该需要第二个 ADC12SC、但它也不会影响任何东西。

    此外、您正在执行重复的通道序列、仅测量1、这将导致 ADC 扫描其他通道时出现延迟。 对于重复的单通道、您可能需要更改为 ADCCONSEQ_2。 然后、您需要为 MCTL7设置 CSTARTADD 或更改 INCH_7以存储到 MCTL0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Cameron P. LaFollowette:
    感谢您的支持。
    我根据您的意见更改了我的代码、但仍在等待(!(ADC12IFG 和 ADC12IFG0))。我将此代码更改为 while (!(ADC12IFG 和 ADC12IFG7);但代码仍在等待。我的代码中是否有任何错误、请帮助我纠正此错误。
    int main (空)

    WDTCTL = WDTPW+WDTHOLD;//停止看门狗计时器
    P6SEL |=BIT7;
    ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_8;
    ADC12CTL0|=ADC12SC;
    ADC12CTL1=ADC12CONSEQ_2+ADC12SSEL_3;
    ADC12CTL2=ADC12RES_2;
    ADC12MCTL0=ADC12INCH_7;//

    ADC12CTL0 |=ADC12ENC;


    while (1)

    ADC12CTL0 |= ADC12SC; //开始转换
    while (!(ADC12IFG 和 ADC12IFG0));
    结果= ADC12MEM0;
    // sprintf (result_ch、"ADC result=%ld \n\r\n、结果);
    // send_string (result_ch);
    __no_operation(); //在此处设置断点



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

    您好、Aju、

    您仍然需要设置 ADC12SHP 位。 尝试一下、让我知道它是如何工作的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Cameron P. LaFollowette:
    感谢您的支持,我已正确获取代码。我将其发布在下面,这可能会对其他人有所帮助。


    Aju S


    void ADC_Init()

    P7SEL|= 0x20; //启用 A/D 通道输入
    ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8;//打开 ADC12、延长采样时间
    ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2; //使用采样计时器、重复序列
    ADC12MCTL0 = ADC12INCH_14; // ref+=AVcc、channel = A0
    ADC12CTL0 |= ADC12ENC; //启用转换
    ADC12CTL0 |= ADC12SC; //开始转换-软件触发器

    int adc_read ()

    while (!(ADC12IFG 和 ADC12IFG0));
    返回(ADC12MEM0);