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.
我使用MSP430f149 的8个ADC通道采集不同电压信号,通过按键切换采样通道,但每次切换时总是会停止采样,哪位大神帮忙看看,谢谢!
程序在附件!谢谢!
/********************************************************* �����ܣ���ADC��P6.3�˿ڵ�ѹ��ת�������ת�����ݺͶ�Ӧ�� ģ���ѹ����ʽͨ�����ڷ��͵�PC����Ļ����ʾ���� ʾ����Ϊ5V ----------------------------------------------------------- ͨ�Ÿ�ʽ��N.8.1, 9600 ----------------------------------------------------------- ����˵�������ڵ��Ծ��飬��ȷ����ͨ�Ÿ�ʽ���۲�������� **********************************************************/ #include <msp430x14x.h> #include "stdio.h" #define uchar unsigned char #define uint unsigned int #define Num_of_Results 32 static uint results[Num_of_Results]; //����ADCת����������� uchar m=10,adc_val; uint index = 0; /********************************************************* **********************��ʱ�ӳ���**************************/ void Delay_Soft(int Num) { for(int i=0;i<Num;i++) { for(int j=0;j<Num;j++); } } /********************************************************* *********************���ڳ�ʼ��***************************/ void Set_UART1(void) { P3SEL |= 0xc0; //��P3.6��P3.7ѡ��UART1��ͨ�Ŷ˿� ME2 |= UTXE1 + URXE1; //ʹ��USART1��TXD��RXD UCTL1 |= CHAR; //ѡ��8-bit�ַ� UTCTL1 |= SSEL0; //����ʱ��ѡ��ACLK UBR01 = 0x03; //������9600 UBR11 = 0x00; UMCTL1 = 0x4A; //���� UCTL1 &= ~SWRST; //��ʼ��UART״̬�� IE2 |= URXIE1; _EINT(); //���ж� } /******************************************************** ******************ADCת����ʼ��*************************/ void ADC12(uchar temp ) { P6SEL |=0Xff; //ʹ��ADCͨ�� ADC12CTL0=ADC12ON+SHT0_15+MSC;//��ADC,���ò���ʱ�䣬���ת�� ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_4; //ADC12MCTL0 |= SREF_0 + INCH_0; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A0 //ADC12MCTL1 |= SREF_0 + INCH_1; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A1 //ADC12MCTL2 |= SREF_0 + INCH_2; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A2 //ADC12MCTL3 |= SREF_0 + INCH_3; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A3 //ADC12MCTL4 |= SREF_0 + INCH_4; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A4 //ADC12MCTL5 |= SREF_0 + INCH_5; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A5 //ADC12MCTL6 |= SREF_0 + INCH_6; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A6 //ADC12MCTL7 |= SREF_0 + INCH_7+ EOS; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A7 switch (temp) { case 10: ADC12MCTL0 |= SREF_0 + INCH_0+ EOS; ADC12IE =0X01;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A0 case 11: ADC12MCTL1 |= SREF_0 + INCH_1+ EOS; ADC12IE =0X02;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A1 case 12: ADC12MCTL2 |= SREF_0 + INCH_2+ EOS; ADC12IE =0X04;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A2 case 13: ADC12MCTL3 |= SREF_0 + INCH_3+ EOS; ADC12IE =0X08;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A3 case 14: ADC12MCTL4 |= SREF_0 + INCH_4+ EOS; ADC12IE =0X10;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A4 case 15: ADC12MCTL5 |= SREF_0 + INCH_5+ EOS; ADC12IE =0X20;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A5 case 16: ADC12MCTL6 |= SREF_0 + INCH_6+ EOS; ADC12IE =0X40;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A6 case 17: ADC12MCTL7 |= SREF_0 + INCH_7+ EOS; ADC12IE =0X80;break; // �ο���ѹ:V+=AVcc+,V-=AVss ADC ͨ��:A7 } //ADC12IE=temp;//ʹ��ADC�ж� ADC12CTL0 |=ENC+ADC12SC;//ʹ��ת��;��ʼת�� _EINT(); } /******************************************************** ********************��ӡ�������***********************/ int putchar(int c) //�������Ͳ��ܱ� { if(c == '\n') { TXBUF1 = '\r'; while((UTCTL1&0x01)==0); } TXBUF1 = c; while((UTCTL1&0x01)==0); return c; } /******************************************************** ********************���ݷ����ӳ���***********************/ void data(void) { float Temp3; //Temp3=((float)((3.3/4069)*adc_value3)*10);//����ʮ���Ƶĵ�ѹֵ if(index == Num_of_Results) { uchar i; unsigned long sum = 0; index = 0; for(i = 0; i < Num_of_Results; i++) { sum += results[i]; //��ת���õ���32��ADCֵ��� } sum >>= 5; //����5λ�൱�ڳ���2��5�η�Ҳ���dz���32 Temp3=((float)((3.3/4069)*sum)*10); //����Nλ�൱�ڳ���2��N�η� printf("ADC_2: %0.2f\n",Temp3); } //����Nλ�൱�ڳ���2��N�η� // %.5f����5��ʾС�������λ�� /**��ӡ�������printf("����ַ���%����\n"������б�)**/ } void key(void) { if((P3IN&BIT5)==0) //����м������� { Delay_Soft(10); //��ʱ���� if((P3IN&BIT5)==0) //�ٴμ�ⰴ��״̬ { while(!(P3IN&BIT5)==1);//�������ſ� m++; _DINT(); // _NOP(); if(m==1) { ADC12(14); } if(m==2) { // _DINT(); // _NOP(); ADC12(15); } if(m==3) { // _DINT(); // _NOP(); ADC12(16); } if(m==17) { m=10; } } } } /******************************************************** ********************������*******************************/ void main() { WDTCTL = WDTPW + WDTHOLD;//�ؿ��Ź� P1DIR |= 0xff; P3DIR &= 0xdf; P4DIR |= 0xff; P5DIR |= 0Xff; P5OUT |= 0xff; P3OUT |= 0x00; P1OUT |= 0xff; P4OUT |= 0xff; Set_UART1(); ADC12(11); while(1) { key(); //ADC12(m); Delay_Soft(10); data(); } } /******************************************* �������ƣ�ADC12ISR �� �ܣ�ADC�жϷ��������������ö��ƽ���� ����P6.0�ڵ�ģ���ѹ��ֵ �� ������ ����ֵ ���� ********************************************/ /*#pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) { // while(ADC12CTL1&0x01!=0); adc_value=ADC12MEM0; adc_value1=ADC12MEM1; adc_value2=ADC12MEM2; adc_value3=ADC12MEM3; }*/ #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) { //static uint index = 0; switch (ADC12IV) { case 0x0006: results[index++] = ADC12MEM0; break; case 0x0008: results[index++] = ADC12MEM1; break; case 0x000a: results[index++] = ADC12MEM2; break; case 0x000c: results[index++] = ADC12MEM3; break; case 0x000e: results[index++] = ADC12MEM4; break; case 0x0010: results[index++] = ADC12MEM5; break; case 0x0012: results[index++] = ADC12MEM6; break; case 0x0014: results[index++] = ADC12MEM7; break; } //results[index++] = ADC12MEM4; }