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:MSP430双通道 ADC

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/684190/ccs-msp430g2553-msp430-2-channel-adc

器件型号:MSP430G2553

工具/软件:Code Composer Studio

大家好、我能够对由具有1个模拟输入的计时器 CC ISR 触发的 ADC ISR 进行编码。
我已经尝试为2个引脚编写 ADC 代码数天了、但到目前为止还不能。

定时器 ISR 由捕捉比较模式触发。
在我的定时器 ISR 内部、我想制作一个 A3引脚的 ADC 并将其保存到可变温度1中。
在第1个 ADC 之后、我尝试将通道切换为 A4、但通道永远不会切换。

我还尝试切换 ADC 中断中的通道、但这也不起作用。

这是我的代码:(我希望有人能帮我)

#include 
#include 

long temp1;
long temp2;

void main (void){

__ENABLE_INTERRUPT ();
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

TACTL = tassel_1 + MC_1;// ACLK-CLOCK+ tempup模式
CCTL0 = CCIE;// CCR0中断使能
CCR0 = ADC104

= ADC10_INCH;// ADC104 = ADC10_INCH;ADC10_CCTL1 = ADC10_INCH;ADC10_CCTL1//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div)
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +//
ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入
P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4

P1DIR |= 0x00;// ADC 输入 P1.3

P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4
P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2


}

#pragma vector = TIMER0_A0_vector;
__interrupt void 计时器(void){

ADC10CTL1 = INCH_3;//为 ADC 选择通道 A3;
ADC10ENSC = ADC10EN0 | ADC10ENC// ADC10SC =0 >>无样本启动会话+ ENC == EnableConversation
temp1 = ADC10MEM;//将 ADC 测量值保存在第1个温度变量
中 while (!ADC10BUSY)//等待 ADC 不再繁忙
{
ADC10CTL0 &=~ENC;//禁用会话
}
ADC10CTL0 &=~ADC10IFG;//删除下一个对话的 ADC10CTL1

= INCH_4;//选择通道 A4作为输入
ADC10CTL0 |= ADC10SC + ENC;
if (ADC10CTL1 =INCH_4) temp2 = ADC10MEM;//在第2个温度变量中保存 ADC 测量
,而(!ADC10BUSY)
{
和 ADC10CTL= ENC


标志};//删除 ADC10CTL=~~TACF (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置)
}


#define A0 0x00
#define A1 BIT0
#define A2 BIT0 + BIT1
#define A3 BIT0 + BIT1 + BIT2

#define B0 0x00
#define B1 BIT3
#define B2 BIT3 + BIT4
#define B3 BIT3 + BIT4 + BIT4 + BIT4

#pragma vector = ADC10_vector;
_interrupt void ADC (void){

const int output1[4]={A0、A1、A2、A3};
const int output2[4]={B0、B1、B2、B3};

if (temp1 >= 0 & temp1 <= 50) p2OUT = output1[0];
否则 if (1 >= 50)<= p2150;out1
= 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1
else P2OUT = output1[3];

if (temp2 >=0 && temp2 <= 50) P2OUT |= output2[0];
否则、if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1];
否则(temp2 >=400 &temp2 <= 750) P2A4 |=output2




;= output2[INCH}/ADC102]/ INCH = output2[INCH;选择 output2]/ output2[INCH

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

    我刚刚认识到、由于存在冗余 while 环路、ENC 永远不会被重置。
    usersguid 告诉您,必须重新对编码进行处理才能在 ADC 中进行任何注册表更改。

    因此、我重新计算了代码、现在能够在通道之间切换。
    它运行良好、但仅在调试 Mide 中、当我逐行调试时。

    当我不设置断点时、我的 ADC10MEM 中的温度值会达到1023、但我不知道为什么。

    以下是我的更新代码:

    #include 
    #include 
    
    long temp1;
    long temp2;
    
    void main (void){
    
    __ENABLE_INTERRUPT ();
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    TACTL = tassel_1 + MC_1;// ACLK-CLOCK+ tempup模式
    CCTL0 = CCIE;// CCR0中断使能
    CCR0 = ADC10_1
    
    ;// ADC10L1 = ADC10_INCH = ADC1050;ADC10_CCTL1 = ADC10_CCTR1;//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div)
    ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +//
    ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入
    P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4
    
    P1DIR |= 0x00;// ADC 输入 P1.3
    
    P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4
    P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2
    
    
    
    
    }
    
    #pragma vector = TIMER0_A0_vector;
    __interrupt void 计时器(void){
    
    ADC10CTL1 = INCH_3;//为 ADC 选择通道 A3;
    ADC10ENSC = ADC10EN0 | ADC10ENC// ADC10SC =0 >>无样本启动会话+ ENC == EnableConversation
    temp1 = ADC10MEM;//将 ADC 测量值保存在第一个温度变量
    中 while (ADC10CTL1 & ADC10BUSY);
    ADC10CTL0 &=~ENC;//禁用对话
    ADC10CTL0 &=~ADC10IFG
    
    = ADC10CL4 INCH;/ ADC10CTL4 INCH =下一个会话中断//选择通道 A4作为输入
    ADC10CTL0 |= ADC10SC + ENC;
    if (ADC10CTL1 =INCH_4) temp2 = ADC10MEM;//在
    (ADC10CTL1 & ADC10BUSY)期间将 ADC 测量值保存在第二个温度变量中;
    ADC10CTL0 &=~ENC;
    
    //TACTL &=~TAG/标志删除 (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置)
    }
    
    
    #define A0 0x00
    #define A1 BIT0
    #define A2 BIT0 + BIT1
    #define A3 BIT0 + BIT1 + BIT2
    
    #define B0 0x00
    #define B1 BIT3
    #define B2 BIT3 + BIT4
    #define B3 BIT3 + BIT4 + BIT4 + BIT4
    
    #pragma vector = ADC10_vector;
    _interrupt void ADC (void){
    
    const int output1[4]={A0、A1、A2、A3};
    const int output2[4]={B0、B1、B2、B3};
    
    if (temp1 >= 0 & temp1 <= 50) p2OUT = output1[0];
    否则 if (1 >= 50)<= p2150;out1
    = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1
    else P2OUT = output1[3];
    
    if (temp2 >=0 && temp2 <= 50) P2OUT |= output2[0];
    否则、if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1];
    否则(temp2 >=400 &temp2 <= 750) P2A4 |=output2
    
    
    
    
    ;= output2[INCH}/ADC102]/ INCH = output2[INCH;选择 output2]/ output2[INCH
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //
    //
    // MSP430x5xx
    // --------
    // /|\| XIN|-
    // || |
    // -|RST XOUT|-
    // | |
    // ADC->|P1.3 P1.0|->LED (红色)<- von ADC P1.3
    //|P2.1|->LED(红色)
    //|P2.2|->LED (红色)
    //|-----|
    //ADC->P1.4P2.3|->LED (绿色)<- von ADC P1.4
    //|->LED(绿色)
    //||->LED (绿色)
    
    /***
    
    
    
    
    
    
    #include 
    #include 
    
    void main (void){
    
    __ENABLE_INTERRUPT ();
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    TACTL |=(tassel_2 + ID_3 + MC_2 + TAIE);// ACLK-CLOCK+CCR UP 模式
    // CCTL0 = CCIE;// CCR0
    
    = ADC1050
    
    = ADC101;ADC101 = ADC1000;ADC10_INCH = ADC1000;ADC100 = ADC100 = ADC100 = ADC101//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div)
    ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +//
    ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入
    P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4
    
    P1DIR |= 0x00;// ADC 输入 P1.3
    
    P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4
    P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2
    
    }
    
    volatile long temp1;
    volatile long temp2;
    
    #pragma vector = TIMER0_A1_vector;
    __interrupt void 计时器(void){
    
    ADC10CTL1 = INCH_3;//为 ADC
    ADC10CTL0选择通道 A3 |= ADC10SC + ENC;// ADC10SC ==0 >>无采样开始会话+ ENC == EnableConversation
    temp1 = ADC10MEM;//将 ADC 测量值保存在第1个温度变量
    中,同时(ADC10CTL1 & ADC10BUSY);
    ADC10CTL0 & ADC10IFG ~0 & ADC10ENC conversation
    = ADC100;//禁用 ADC10IFG ~//删除下一个对话的 ADC10CTL1
    
    = INCH_4;//选择通道 A4作为输入
    ADC10CTL0 |= ADC10SC + ENC;
    temp2 = ADC10MEM;//在第2个温度变量中保存 ADC 测量
    值,同时(ADC10CTL1 & ADC10BUSY);
    ADC10CTL0 &=~
    
    ~ENC;//删除 TACFG 标志 (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置)
    }
    
    #define A0 0x00
    #define A1 BIT0
    #define A2 BIT0 + BIT1
    #define A3 BIT0 + BIT1 + BIT2
    
    #define B0 0x00
    #define B1 BIT3
    #define B2 BIT3 + BIT4
    #define B3 BIT3 + BIT4 + BIT4 + BIT4
    
    const int output1[4]={A0、A3};
    const int output2[4]={B0、B1、B2、B3};
    
    #pragma vector = ADC10_vector;
    __interrupt void ADC (void){
    
    if (temp1 >= 0 && temp1 <= 50) P2OUT = output1[0];
    否则(temp1 >=50 && temp1 <= 400)
    ;如果(temp2out1 = output1[0]);否则(temp2out1 = out1 = 400)=output1[p2[1];如果 temp2out1 = out1 = out1 = output1[0];否则= out1 = out1 = out1 = out1;如果 temp2[p2]]
    
    
    if (temp2 >= 0 && temp2 <= 50) P2OUT |= output2[0];
    否则 if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1];
    否则 if (temp2 >=400 && temp2 <= 750) P2OUT |= output2[2];
    else = output2[1]
    ;output2|out2
    

    好的、我已经解决了这个问题。

    我将代码重新考虑在内、并使用计时器继续模式 ISR、现在它可以正常工作。

    我的捕获比较中断在 ADC 转换完成后执行得更快吗?

    下面是工作代码:

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

    您似乎正在尝试设置计时器以触发 ADC 转换。 您可以将 ADC 设置为从计时器自动触发、然后读取 ADC ISR 中的值。 这可确保 ADC 在读取结果之前已经完成转换、并且无需也使用计时器 ISR。 我建议查看以下代码示例作为此类功能的基础:
    dev.ti.com/.../

    此致、
    Caleb Overbay