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中的ad序列转换怎么读取每次的采样值

Other Parts Discussed in Thread: MSP430G2553

在msp430中


  ADC10CTL0 &= ~ENC;
  ADC10CTL0 |= ADC10IE + ADC10ON  + REF2_5V + ADC10SHT_2;
     ADC10CTL1 |= CONSEQ_1+ INCH_2+SHS_0+ADC10SSEL_0;
     ADC10AE0 |= 0x07;
       _EINT();

while(1)

{

  ADC10CTL0 |= ENC + ADC10SC; //ad开始转化
    while(ADC10BUSY==1);
       if(ci==30)
             {
             ci=0;
            lcd_pos(1,0);
            ad_shuju(&ADC10_A[2]);
            lcd_pos(2,0);
            ad_shuju(&ADC10_A[1]);
            lcd_pos(3,0);
            ad_shuju(&ADC10_A[0]);
                }}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
 ADC10_A[ci]=ADC10MEM;
  ci++;  // Clear CPUOFF bit from 0(SR)
}

  • ADC10采样序列采样的结果都顺序地被放在ADC10MEM寄存器上。所以每次采样结果就会触发ADC的中断,在中断程序中去读取ADC10MEM的值。 就如你程序中的第4行一样。 01. #pragma vector=ADC10_VECTOR 02. __interrupt void ADC10_ISR(void) 03. { 04. ADC10_A[ci]=ADC10MEM; 05. ci++; // Clear CPUOFF bit from 0(SR) 06.} 另外,你也可以直接用ADC10DTC模块,将ADC的转换值直接搬运到ADC10_A[]这个数组中去,无需CPU参与,只占用2个MCLK时间。 具体你操作你可以参见TI的相关例程。
  • 我在ccs中没有发现具体关于Sequence of channels,有更具体的一些历程吗?

  • 您好,我现在在用MSP430G2553和SHARP96,做AD转换并显示图像的程序。能请您指导一下吗

  •  请问你遇到的具体问题是什么呢?

  • 您好,这是我自己写的一个AD转换并在SHARP96上显示模拟波形的程序,没有发现错误但是LCD上无法显示AD转换后的波形
    #include "msp430g2553.h"
    #include "grlib.h"
    #include "Sharp96x96.h"
    #include "HAL_MSP-EXP430G2_Sharp96x96.h"
    int p,v,i,b,pos,temp;
    long ad;
    const tRectangle myRectangle = { 10, 10, 90, 90};

    // Function Prototypes
    void clockInit(void);
    void boardInit(void);
    void timerInit(void);
    void flashInit(void);
    void timerInit(void);
    void Delay_long(void);
    void Delay_short(void);
    // Global variables
    tContext g_sContext;
    tRectangle g_sRect;

    void main(void)
    {
    // Stop WDT
    WDTCTL = WDTPW + WDTHOLD;

    // Initialize the boards
    boardInit();
    clockInit();
    timerInit();
    flashInit();

    __bis_SR_register(GIE);

    // Set up the LCD
    LCDInit();
    GrContextInit(&g_sContext, &g_sharp96x96LCD);
    GrContextForegroundSet(&g_sContext, ClrBlack);
    GrContextBackgroundSet(&g_sContext, ClrWhite);
    GrContextFontSet(&g_sContext, &g_sFontFixed6x8);
    GrClearDisplay(&g_sContext);
    GrFlush(&g_sContext);

    // Intro Screen
    GrStringDrawCentered(&g_sContext,
    "Start...",
    AUTO_STRING_LENGTH,
    25,
    5,
    TRANSPARENT_TEXT);
    GrFlush(&g_sContext);
    Delay_long();
    GrClearDisplay(&g_sContext);
    //GrRectDraw(&g_sContext, &myRectangle);
    //GrFlush(&g_sContext);
    //Delay_long();
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2|=SELM_0;

    P1DIR=0XFF;
    P1OUT=0XFF;
    ADC10CTL0=SREF_1+ADC10SHT_1+REF2_5V+REFON+ADC10ON+MSC; //选择参考电压(Vr+=Vref+,Vr-=AVss),Vref+=2.5V,内部参考电压发生器打开多次采样转换位
    ADC10CTL1=INCH_2+ADC10DIV_1+CONSEQ_2; // 选择2通道采样,ADC时钟2分频,单通道多次采样
    ADC10AE0|=BIT2;
    P2DIR|=0XFF;
    P2OUT=0X00;

    while(1)
    {
    ADC10CTL0|=ENC+ADC10SC; // 启动AD采样
    temp=ADC10MEM; //读取寄存器的值
    pos=80-((int)((temp/1024.0)*80));//描点的纵坐标
    GrCircleDraw(&g_sContext, i,pos,0.5);
    GrFlush(&g_sContext);
    Delay_long();


    }
    }
    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    {
    __bic_SR_register_on_exit(CPUOFF); //唤醒CPU
    }


    void clockInit(void)
    {
    // Set DCO frequency at 8MHz
    // ACLK = VLO/1
    // SMCLK= DCO/1
    // MCLK = DCO/1
    // If calibration constant erased
    if (CALBC1_8MHZ==0xFF)
    {
    // do not load, trap CPU!!
    while(1);
    }
    DCOCTL = 0;
    BCSCTL1 = CALBC1_8MHZ;
    DCOCTL = CALDCO_8MHZ;
    BCSCTL3|= LFXT1S_2;
    }

    void boardInit()
    {
    // Set all port as outputs and drive pins low
    P1OUT = 0;
    P2OUT = 0;
    P1DIR = 0xFF;
    P2DIR = 0xFF;
    }

    void flashInit()
    {
    // Configure flash memory timing
    // MCLK/18 for Flash Timing Generator
    // 8MHz/(16+1+1) = 444.44 KHz
    FCTL2 = FWKEY + FSSEL0 + FN4 + FN0;

    }

    void timerInit()
    {
    TA0CTL = TASSEL_2 +ID_3+ MC_1+ TAIE +TACLR;
    TA0CCTL0 |= CCIE;
    TA0CCR0 = 32000-1;
    }


    void Delay_long()
    {
    __delay_cycles(SYSTEM_CLOCK_SPEED * 4);
    }


    void Delay_short()
    {
    __delay_cycles(SYSTEM_CLOCK_SPEED * 0.25);
    }

    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void TIMER0_A0_ISR(void)
    {
    Sharp96x96_SendToggleVCOMCommand();
    TA0CCR0 += 32000-1;
    TA0CTL &= ~TAIFG;

    }

  • 序列通道多次转换是不是这样理解先把高通道采完在采第通道,如果是的话,那是不是可以直接用数组读取采样的数据呢?

    那么问题有来了,这样是不是不能保证不同序列同时采样?

  • hi 梵者

    你也用的msp430g2553吗?

    这个mcu的adc模块是adc10,只有一个ADC10MEM寄存器,所以需要每个通道采集后都要及时存储到其他变量或数组,不然会被覆盖掉

  • 梵者 说:

    序列通道多次转换是不是这样理解先把高通道采完在采第通道,如果是的话,那是不是可以直接用数组读取采样的数据呢?

    那么问题有来了,这样是不是不能保证不同序列同时采样?

    序列采样的意思就是按顺序一个通道一个通道采样,不会发生不同序列同时采样的情况。

  • 我刚学msp430,用的是f5310,那么能不能直接用数组把ad的采样值读出来,而不用dma呢?

  • 在序列重复采样时,是不是可以直接用数组把采样值读出来,而不用dma呢?

  • TI代理商,1816772808,提供技术支持,欢迎交流