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.
请问一下,我用的430F2012,我想用A1和A3分别对两路模拟信号进行采样转换,然后根据所转换的对应的数据进行相关操作,有没有分时采样的简单例子? 谢谢!
A1和A3是不是说的通道,你就直接转换3路AD的数据,然后在把数据拿出来分别计算就可可以了。一般的是定义一个数组,把转换后的ad值放入数组,然后在分别计算。至于例子,ti的网站上的程序基本上都可以用。
wen Zhang1,
msp430x20x2_adc10_10.c ADC10, ADC10, DTC Sample A3/A2/A1, AVcc, Single Sequence, DCO
如附件所示。
/* --COPYRIGHT--,BSD_EX * Copyright (c) 2012, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************* * * MSP430 CODE EXAMPLE DISCLAIMER * * MSP430 code examples are self-contained low-level programs that typically * demonstrate a single peripheral function or device feature in a highly * concise manner. For this the code may rely on the device's power-on default * register values and settings such as the clock configuration and care must * be taken when combining code from several examples to avoid potential side * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware * for an API functional library-approach to peripheral configuration. * * --/COPYRIGHT--*/ //****************************************************************************** // MSP430F20x2 Demo - ADC10, DTC Sample A2-0, AVcc, Single Sequence, DCO // // Description: Sample A3/A2/A1 as single sequence with reference to AVcc. // Software sets ADC10SC to trigger sample sequence. In Mainloop MSP430 waits // in LPM0 to save power until ADC10 conversion complete, ADC10_ISR(DTC) will // force exit from any LPMx in Mainloop on reti. ADC10_ISR will force any LPMx // exit. ADC10 internal oscillator times sample period (16x) and conversion // (13x). DTC transfers conversion code to RAM 200h - 206h. P1.0 set at start // of conversion burst, reset on completion. // // MSP430F20x2 // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // | | // >---|P1.3/A3 P1.0|-->LED // >---|P1.2/A2 | // >---|P1.1/A1 | // // L. Westlund // Texas Instruments Inc. // May 2006 // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.41A //****************************************************************************** #include <msp430.h> int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT ADC10CTL1 = INCH_3 + CONSEQ_1; // A3/A2/A1, single sequence ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; ADC10DTC1 = 0x03; // 3 conversions ADC10AE0 |= 0x0E; // P1.3,2,1 ADC10 option select P1DIR |= 0x01; // Set P1.0 output for (;;) { ADC10CTL0 &= ~ENC; while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active ADC10SA = 0x200; // Data buffer start P1OUT |= 0x01; // P1.0 = 1 ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit P1OUT &= ~0x01; // P1.0 = 0 } } // ADC10 interrupt service routine #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) }
抱歉,忽然发现写的文字不见了,补充如下:
这个例子是MSP430Ware example code中的 为依次采样A1,A2,A3 chanel, 其实就是Conversion sequence mode select选择为:Sequence-of-channels。
希望对你有帮助!
你好,感谢你的回答。如果用Single Sequence,因为每次数据都是放在ADC10MEM中了,那我该如何判断现在这个ADC10MEM中的数据到底是A1通道的还是A3通道的,意思其实我是想把A1通道和A3通道的电压值都可以显示出来。
wen Zhang1,
例程中使用了ADC10的DTC功能,‘ DTC transfers conversion code to RAM 200h - 206h.’ 将数据依次存到了RAM中。
wen Zhang1,我个人觉得是可以的,就是禁止A2通道就行了。你试试吧。
ADC10AE0 |= 0x0E; // P1.3,2,1 ADC10 option select
更改这句为:
ADC10AE0 |= 0x0A; // P1.3,1 ADC10 option select
#include <msp430.h>
typedef unsigned int uint;
uint adc_sample[2]={0}; //存储ADC序列采样结果
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = INCH_3 + CONSEQ_3; // A3/A1, single sequence
ADC10CTL0 = ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
ADC10DTC1 = 0x02; // 2 conversions
ADC10AE0 |= BIT1 +BIT3; // P1.3,1 ADC10 option select
P1DIR |= BIT4 + BIT2; // Set P1.0 output
for(;;)
{
ADC10CTL0 &= ~ENC;
while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active
ADC10SA = (uint)adc_sample; // Data buffer start
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
if(adc_sample[0]<0x250)
P1OUT |= BIT2;
else
P1OUT &= ~BIT2;
if(adc_sample[1]<0x300)
P1OUT |= BIT4;
else
P1OUT &= ~BIT4;
}
帮我看一下呢
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
if(adc_sample[1]<0x250)
P1OUT |= BIT2;
else
P1OUT &= ~BIT2;
if(adc_sample[0]<0x300)
P1OUT |= BIT4;
else
P1OUT &= ~BIT4;
}
刚才的不对,A1通道的数据是放在adc_sample[1]里的,是这个,也不对
它的例子中就是禁止了A0通道吧。请问数据不对时怎么个不对法?是A3,A1全不对了,还是怎么不对了?
另外
ADC10DTC1 = 0x03; // 3 conversions
改成
ADC10DTC1 = 0x02; //2 conversions
wen Zhang1,
建议你直接将A3,A1先连接Vcc或GND,看看结果对不对,或者连接一个固定的电压,看看结果对不对。如果还不对,建议试试若是将两个通道挨在一起,例如A3,A2或者A2,A1又是什么情况?如果你方便做这些实验的话,麻烦你做做,并麻烦你将结果描述一下。
我试着找了找相关的解释或参考,没找到。一般大家用sequence of channels mode,都是连着采多个通道的。
wen Zhang1,根据user guide, Sequence-of-channels 模式下,总是从INCHx开始,逐步减到A0。 故从Ax~A0依次采样应该都不会出错的。但是没有地方提到,如果通道不连续,会怎么样。还是建议按照标准用法,从Ax~A0连续采样吧,肯定不会出错。O(∩_∩)O~
if(adc_sample[1]<0x000)
P1OUT |= BIT2;
else
P1OUT &= ~BIT2;
这个0x000到0x3F4都是方波,0x3F5及以上才是稳定的高电平,‘若是将两个通道挨在一起’的话没问题。