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.

ADC12_A怎么使用TB0,自动启动AD转换?



代码  如下

P6SEL|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;//A0,A1,A2,A3,A4,A5,A6,A7第二功能
P7SEL|=BIT4+BIT5+BIT6;//A12,A13,A14第二功能
P5SEL|=BIT0+BIT1;//vref+,vref-
ADC12CTL0 &= ~ADC12ENC; //只有在ENC复位的情况下才能对ADC12CTL0、1进行设置
REFCTL0=REFON+REFOUT+REFVSEL_2+REFMSTR;// 2.5V REFMSTR 参考电压输出
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12REFON+ADC12REF2_5V+ADC12SHT0_2+ADC12SHT1_2; // Turn on ADC12, set sampling time
// ADC12CTL0=ADC12TOVIE+;
//ADC12SHT0x 0010b=16ADC12CLKcycles
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3+ADC12SHS_2+ADC12SSEL_2+ADC12DIV_4; // Use sampling timer, single sequence
//01b=Sequence-of-channels timer1 MCLK
ADC12CTL2=ADC12REFOUT+ADC12RES_2;
//参考输出开启+ADC12_A分辨率控制位12位13个时钟周期
ADC12MCTL0=ADC12INCH_0+ADC12SREF_1;//ADC12MCTL0的输入通道为A0,参考电压源为Vref+,AVss
ADC12MCTL1=ADC12INCH_1+ADC12SREF_1;//ADC12MCTL1的输入通道为A1,参考电压源为Vref+,AVss
ADC12MCTL2=ADC12INCH_2+ADC12SREF_1;//ADC12MCTL2的输入通道为A2,参考电压源为Vref+,AVss
ADC12MCTL3=ADC12INCH_3+ADC12SREF_1;//ADC12MCTL3的输入通道为A3,参考电压源为Vref+,AVss
ADC12MCTL4=ADC12INCH_4+ADC12SREF_1;//ADC12MCTL4的输入通道为A4,参考电压源为Vref+,AVss
ADC12MCTL5=ADC12INCH_5+ADC12SREF_1;//ADC12MCTL5的输入通道为A5,参考电压源为Vref+,AVss
ADC12MCTL6=ADC12INCH_6+ADC12SREF_1;//ADC12MCTL6的输入通道为A6,参考电压源为Vref+,AVss
ADC12MCTL7=ADC12INCH_7+ADC12SREF_1;//ADC12MCTL7的输入通道为A7,参考电压源为Vref+,AVss
ADC12MCTL8=ADC12INCH_12+ADC12SREF_1;//ADC12MCTL12的输入通道为A12,参考电压源为Vref+,AVss
ADC12MCTL9=ADC12INCH_13+ADC12SREF_1;//ADC12MCTL13的输入通道为A13,参考电压源为Vref+,AVss
ADC12MCTL10=ADC12INCH_14+ADC12SREF_1+ADC12EOS;//ADC12MCTL14的输入通道为A14,参考电压源为Vref+,AVss 序列结束标志位
//ADC12IE = 0x08; // Enable ADC12IFG.3
ADC12CTL0 |= ADC12ENC; // Enable conversions

ADC12CTL0 |= ADC12SC;

定时器初始化

void init_TB0(void)
{
TBCCTL0 = CCIE; //Interrupt enable
TB0CCR0 = 12500 - 1;
TB0CTL |= TBSSEL_2 + MC_1 + TBCLR;

__bis_SR_register(GIE); // Enter LPM3, enable interrupts
}

实验没有采集到数据,急等,希望各位给点指导

  • 你好,

        如果我没理解错的话楼主是想用TimerB来触发采样吧。我建议先调通ADC12模块,能够正常采到数据,这里可以参考430ware中的范例代码。然后再实现TimerB0的定时器中断,也可以参考430ware。

  • 我的意思是不明白这个配置过程:

    1、定时器寄存器都是有那些相关设置,只有找到一个OUTMOD设置

    2、ADC寄存器相关的设置在哪里,只有找到一个使用ADC12SHS

    还有没有其他需要设置的寄存器

  • 了解,可以参考下面的代码,TB0触发ADC12采样,DMA转移采样结果,希望对你有帮助:

    //******************************************************************************
    // MSP430F532x Demo - DMA0, Single transfer using ADC12 triggered by TimerB
    //
    // Description: This software uses TBCCR1 as a sample and convert input into
    // the A0 of ADC12. ADC12IFG is used to trigger a DMA transfer and DMA
    // interrupt triggers when DMA transfer is done. TB1 is set as an output and
    // P1.0 is toggled when DMA ISR is serviced.
    // ACLK = REFO = 32kHz, MCLK = SMCLK = default DCO 1048576Hz
    //
    // MSP430F532x
    // -----------------
    // /|\| XIN|-
    // | | | 32kHz
    // --|RST XOUT|-
    // | |
    // | P1.0|-->LED
    // | P5.7|-->TB1 output
    // | |
    // | P6.0|<--A0
    //
    // Bhargavi Nisarga
    // Texas Instruments Inc.
    // April 2009
    // Built with CCSv4 and IAR Embedded Workbench Version: 4.21
    //******************************************************************************

    #include <msp430.h>

    unsigned int DMA_DST; // ADC conversion result is stored in this variable

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

    P1OUT &= ~BIT0; // P1.0 clear
    P1DIR |= BIT0; // P1.0 output
    P5SEL |= BIT7; // P5.7/TB1 option select
    P5DIR |= BIT7; // Output direction
    P6SEL |= BIT0; // Enable A/D channel A0

    //Setup Timer B0
    TBCCR0 = 0xFFFE;
    TBCCR1 = 0x8000;
    TBCCTL1 = OUTMOD_3; // CCR1 set/reset mode
    TBCTL = TBSSEL_2+MC_1+TBCLR; // SMCLK, Up-Mode

    // Setup ADC12
    ADC12CTL0 = ADC12SHT0_15+ADC12MSC+ADC12ON;// Sampling time, MSC, ADC12 on
    ADC12CTL1 = ADC12SHS_3+ADC12CONSEQ_2; // Use sampling timer; ADC12MEM0
    // Sample-and-hold source = CCI0B =
    // TBCCR1 output
    // Repeated-single-channel
    ADC12MCTL0 = ADC12SREF_0+ADC12INCH_0; // V+=AVcc V-=AVss, A0 channel
    ADC12CTL0 |= ADC12ENC;

    // Setup DMA0
    DMACTL0 = DMA0TSEL_24; // ADC12IFGx triggered
    DMACTL4 = DMARMWDIS; // Read-modify-write disable
    DMA0CTL &= ~DMAIFG;
    DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst, Int
    DMA0SZ = 1; // DMA0 size = 1

    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM0);
    // Source block address
    __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &DMA_DST);
    // Destination single address
    __bis_SR_register(LPM0_bits + GIE); // LPM0 w/ interrupts
    __no_operation(); // used for debugging
    }

    //------------------------------------------------------------------------------
    // DMA Interrupt Service Routine
    //------------------------------------------------------------------------------
    #pragma vector=DMA_VECTOR
    __interrupt void DMA_ISR(void)
    {
    switch(__even_in_range(DMAIV,16))
    {
    case 0: break;
    case 2: // DMA0IFG = DMA Channel 0
    P1OUT ^= BIT0; // Toggle P1.0 - PLACE BREAKPOINT HERE AND CHECK DMA_DST VARIABLE
    break;
    case 4: break; // DMA1IFG = DMA Channel 1
    case 6: break; // DMA2IFG = DMA Channel 2
    case 8: break; // DMA3IFG = DMA Channel 3
    case 10: break; // DMA4IFG = DMA Channel 4
    case 12: break; // DMA5IFG = DMA Channel 5
    case 14: break; // DMA6IFG = DMA Channel 6
    case 16: break; // DMA7IFG = DMA Channel 7
    default: break;
    }
    }

  • i非常感谢你的代码,但是我配置之后,每一路AD采集值计算之后都是大体相同的,即使没有外加电流或电压信号,都会产生一个大体固定的数值,麻烦再指点一下吧

  • 你好,

       你是使用上面的代码测试的吗?上面代码好像只有一个通道。如果楼主修改了代码,修改了那些地方?

  •   ADC12CTL1 &= ~ADC12SHP;
     ADC12CTL1 |= ADC12CONSEQ_1+ADC12SHS_2+ADC12SSEL_2+ADC12DIV_4;       // Use sampling timer, single sequence
         
    void init_TB0(void)
    {  
            TBCCTL0 = CCIE;         //Interrupt enable
            TB0CCR0 = 12500-1;    
            TB0CCTL0 = OUTMOD_4;
            TB0CTL |= TBSSEL_2 + MC_1 + TBCLR;
            
            
    }
  • 楼主,

        还没有调出来吗?你可以用前面发的那段代码先试一下 确认硬件OK之后再调软件。

  • 请问,我现在要采集两路数据,采用定时器触发多通道ADC12采样,一路采集,DMA转移数据的话按照例子做到了;现在要做两路,查看手册:

    When CONSEQx = {1,3}, the ADC12IFG flag for the last ADC12MEMx in the sequence can trigger a DMA transfer. Any ADC12IFG flag is automatically cleared when the DMA controller accesses the corresponding ADC12MEMx.

    单路可以直接取:

    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM0);
    // Source block address
    __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &DMA_DST);

    多路如何取采样值?难道要用多路DMA么