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

msp430f149adc12模块的单通道序列转换的问题

我自己写了个149的adc12单通道序列转换的程序,使用的是p6.0(A0通道),结果现象正确,可是吧程序中控制A0通道的寄存器参数改成对应的控制p6.1的A1通道的寄存器参数,其余地方不动,结果转换的结果不对。其中A1输入一个模拟电压转换的结果数字不变。有时候还出现一些随机数字,请问什么原因。

Young Hu:

gj chen,

您好,

最可能的原因就是程序中有些部分没有修改,建议你将代码贴上来。

Peter_Zheng:

ADC修改的时候一个是ADC12INCH通道修改,一个是转换值ADC12MEMx的修改,您的问题肯定是由于ADC寄存器修改的地方不对导致的,建议再检查一下代码。

gj chen:

回复 Young Hu:

//*****此程序实现的是以ADC12内部的2.5v的参考电压,对a0通道进行32次采集平均后,把采集结果在数码管上显示*****//

#include  <msp430x14x.h>

#define   Num_of_Results   32

#define uint  unsigned int

#define uchar  unsigned char

uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};//0-9对应的共阴极段码

uint results[Num_of_Results] = {0};

unsigned long int  average=0;

//***********ADC12的初始化函数********************//

void ADC_Init(void)

{

 P6SEL |= BIT0;// 设置p6.0为a0采样通道

 ADC12CTL0 &= ~ENC;

 ADC12CTL0 = ADC12ON+SHT0_15+MSC;

 ADC12CTL1 = SHP+CONSEQ_2+CSTARTADD_0;           //采样定时器触发采样、单通道多次转换

 ADC12MCTL0 = INCH_0;//a0通道、Vr+=Vref+,Vr-=AVcc

 ADC12IE = 0x01;                         // 使能中断

 ADC12CTL0 |= ENC;  

 ADC12CTL0 |= ADC12SC;// 开始转换

  _EINT();

}

//*****************延时函数**********************//

void delay_ms()

{for(uint i=500;i>0;i–);}

////**********数码管动态显示程序********************//

 

void display(uint num)

{ uint qian=(num / 1000);

 uint bai=(num-(num/1000)*1000)/100;

 uint shi=(num-qian*1000-bai*100)/10;

 uint ge=(num-qian*1000-bai*100) %10;

 //显示端口初始化

 P3SEL=0x00;//p3作为i/o

 P3DIR=0x0f;//p3.0-p3.3作为输出

 P3OUT|=0x0f;//关闭数码管位选信号

 P4SEL=0x00;//p4作为i/o

 P4DIR=0xff;//p4为输出

 P4OUT=0x00;//数码管不亮

 P4OUT = seg[qian];//千位数字段选

 P3OUT^=BIT0;//打开千位位选

 delay_ms();   //显示1ms千位

 P4OUT=0x00;//消掉阴影

 P3OUT^=BIT0;//关闭千位位选

 P4OUT = seg[bai];//送百位段码

 P3OUT^=BIT1;//打开百位位选          

 delay_ms();   //显示1ms个位

 P4OUT=0x00;//消掉阴影

 P3OUT^=BIT1;//关闭百位位选    

 P4OUT = seg[shi];//十位数字段选

 P3OUT^=BIT2;//打开十位位选

 delay_ms();   //显示1ms十位

 P4OUT=0x00;//消掉阴影

 P3OUT^=BIT2;//关闭十位位选

 P4OUT = seg[ge];//送个位段码

 P3OUT^=BIT3;//打开个位位选          

 delay_ms();   //显示1ms个位

 P3OUT^=BIT3;//关闭个位位选

}

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD;    // 关狗

 ADC_Init();     // 初始化ADC12

 _EINT();       //开总中断

 while(1)//显示    

 {   _BIS_SR(LPM0_bits+GIE);   //进入低功耗

     display(average);

 }

}

//*********中断服务****************//

#pragma vector=ADC12_VECTOR

__interrupt void ADC12ISR (void)

{

 static uint index = 0;

 results[index++] = ADC12MEM0;        

 if (index == 32)

 {

 //  ADC12CTL0 &= ~ENC;                    

   index = 0;

   for(uchar i=0;i<32;i++)

   {average+=results[i];}

    average>>=5; 

   _BIC_SR_IRQ(LPM0_bits) ;  

 }

}

gj chen:

回复 Young Hu:

代码已经黏贴,麻烦指点,新手初学,谢谢。

Young Hu:

回复 gj chen:

gj chen,

这个不是采集A0通道的代码么?这个是正常工作的吧?

gj chen:

恩,的确,黏贴的程序是A0通道的,能正常工作,但是把控制A0的寄存器全部对应改成控制A1的寄存器,就不知怎么程序不能得到正常现象了。如果可以,麻烦给个正确控制A1或则其他通道的示例程序,谢谢。

Young Hu:

手头暂时没有这方面的代码。请参考peter zheng给你的建议。或者把你的错误代码发上来

Peter_Zheng:

把你错误代码贴出来。

我下面这段代码是基于msp4305529  A1的,参考一下

#include "msp430f5529.h"

void Init_ADC(void)

{

 P6SEL |= BIT6;                            // Enable A/D channel A0

 ADC12CTL0 = ADC12SHT0_8;// Set sample time

 ADC12CTL1 = ADC12SHP;                     // Enable sample timer

 ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_1;  

}

unsigned char luminary_measure()

{

 unsigned char temp;

 ADC12CTL0 |= ADC12ENC+ ADC12ON;

 ADC12CTL0 |= ADC12SC;                   // Start conversion

 while (!(ADC12IFG & BIT0));

 temp=(ADC12MEM0>>4)/3;

 ADC12CTL0 &= ~(ADC12ENC+ ADC12ON);

 return temp;

}

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 P1DIR |= 0x01;                            // P1.0 output

 Init_ADC();

 while(1)

 {

   if(luminary_measure()>0x1F)

     P1OUT|=BIT0;

   else

     P1OUT&=~BIT0;

 }

}

gj chen:

我这个附件里的程序是想实现在程序上电时数码管显示8888,当矩阵键盘中key1按下时显示A0通道转换的模数值,按下key2时显示通道A1的模数值,按下key3时显示A2通道的模数值。结果发现只有A0通道能正确转换并显示,而A1和A2通道则不能转换,却显示一些随机数在数码管上。请问怎么回事?如果要实现我说的功能,如何修改,期待回复。谢谢。

Peter_Zheng:

回复 gj chen:

大概看了你的代码,AD这块没看出啥问题,AD转换这块你使用断点调试,看一下寄存器ADC12MEM0-2转换值是否正确,average0-2这几个数是否被正确显示。另外,在处理键值的时候建议使用switch语句。

赞(0)
未经允许不得转载:TI中文支持网 » msp430f149adc12模块的单通道序列转换的问题
分享到: 更多 (0)