在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)
}
jiabao mo:
回复 Triton Zhang:
我在ccs中没有发现具体关于Sequence of channels,有更具体的一些历程吗?
Bing Liu9:
回复 Triton Zhang:
您好,我现在在用MSP430G2553和SHARP96,做AD转换并显示图像的程序。能请您指导一下吗
Ling Zhu2:
回复 Bing Liu9:
请问你遇到的具体问题是什么呢?
Bing Liu9:
回复 Ling Zhu2:
您好,这是我自己写的一个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 Prototypesvoid clockInit(void);void boardInit(void);void timerInit(void);void flashInit(void);void timerInit(void);void Delay_long(void);void Delay_short(void);// Global variablestContext 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;
}
梵者:
回复 Ling Zhu2:
序列通道多次转换是不是这样理解先把高通道采完在采第通道,如果是的话,那是不是可以直接用数组读取采样的数据呢?
那么问题有来了,这样是不是不能保证不同序列同时采样?
灰小子:
回复 梵者:
hi 梵者
你也用的msp430g2553吗?
这个mcu的adc模块是adc10,只有一个ADC10MEM寄存器,所以需要每个通道采集后都要及时存储到其他变量或数组,不然会被覆盖掉
Ling Zhu2:
回复 梵者:
梵者
序列通道多次转换是不是这样理解先把高通道采完在采第通道,如果是的话,那是不是可以直接用数组读取采样的数据呢?
那么问题有来了,这样是不是不能保证不同序列同时采样?
梵者:
回复 灰小子:
我刚学msp430,用的是f5310,那么能不能直接用数组把ad的采样值读出来,而不用dma呢?
梵者:
回复 Ling Zhu2:
在序列重复采样时,是不是可以直接用数组把采样值读出来,而不用dma呢?
TI中文支持网



