TI中文支持网
TI专业的中文技术问题搜集分享网站

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
}

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

step by step:

你好,

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

Fish Fly:

回复 step by step:

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

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

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

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

step by step:

回复 Fish Fly:

了解,可以参考下面的代码,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; }}

Fish Fly:

回复 step by step:

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

step by step:

回复 Fish Fly:

你好,

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

Fish Fly:

回复 step by step:

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

step by step:

回复 Fish Fly:

楼主,

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

Zhenting Liu:

回复 step by step:

请问,我现在要采集两路数据,采用定时器触发多通道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么

赞(0)
未经允许不得转载:TI中文支持网 » ADC12_A怎么使用TB0,自动启动AD转换?
分享到: 更多 (0)