MSP430模数转换模块--ADC12MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,他具有高速度,通用性等特点。大部分都内置了ADC模块.而有些不带ADC模块的片子,也可通过利用内置的模拟比较器来实现AD的转换。在系列产品中,我们可以通过以下列表来简单地认识他们的ADC功能实现。系列型号ADC功能实现转换精度MSP430X1XX2比较器实现10位MSP430F13XADC模块12位MSP430F14XADC模块12位MSP430F43XADC模块12位MSP430F44XADC模块12位MSP430X32XADC模块14位从以下ADC12结构图中可以看出,ADC12模块中是由以下部分组成:输入的16路模拟开关,ADC内部电压参考源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等组成。输入的16路模拟开关16路模拟开关分别是由IC外部的8路模拟信号输入和内部4路参考电源输入及1路内部温度传感器源及AVCC-AVSS/2电压源输入。外部8路从A0-A7输入,主要是外部测量时的模拟变量信号。内部4路分别是Veref+ADC内部参考电源的输出正端,Vref-/Veref-ADC内部参考电源负端(内部/外部)。1路AVCC-AVSS/2电压源和1路内部温度传感器源。片内温度传感器可以用于测量芯片上的温度,可以在设计时做一些有用的控制;在实际应用时用得较多。而其他电源参考源输入可以用作ADC12的校验之用,在设计时可作自身校准。ADC内部电压参考源ADC电压参考源是用于给ADC12内核作为一个基准信号之用的,这是ADC必不可少的一部分。在ADC12模块中基准电压源可以通过软件来设置6种不同的组合。AVCC(Vr+),Vref+,Veref+,AVSS(Vr-),Vref-/Veref-。ADC12内核ADC12的模块内核是共用的,通过前端的模拟开关来分别来完成采集输入。ADC12是一个精度为12位的ADC内核,1位非线性微分误差,1位非线性积分误差。内核在转换时会参用到两个参考基准电压,一个是参考相对的最大输入最大值,当模拟开关输出的模拟变量大于或等于最大值时ADC内核的输出数字量为满量程,也就是0xfff;另一个则是最小值,当模拟开关输出的模拟变量大小或等于最大值时ADC内核的输出数字量为最低量程,也就是0x00。而这两个参考电压是可以通过软件来编程设置的。ADC时钟源部分ADC12的时钟源分有ADC12OSC,ACLK,MCLK,SMCLK。通过编程可以选择其中之一时钟源,同时还可以适当的分频。采集与保持,触发源部分ADC12模块中有着较好的采集与保持电路,采用不的设置有着灵活的应用。关于这方面的详情请参考手册上的寄存器说明,此部分我们日后再作补上。ADC数据输出部分ADC内核在每次完成转换时都会将相应通道上的输出结果存贮到相应用通道缓冲区单元中,共有16个通道缓冲单元。同时16个通道的缓冲单元有着相对应的控制寄存器,以实现更灵活的控制。ADC控制寄存器ADC12CTL0转换控制寄存器0ADC12CTL1转换控制寄存器1ADC12IE中断使能寄存器ADC12IFG中断标志寄存器ADC12IV中断向量寄存器ADC12MEM0-15存储控制寄存器0-15ADC12MCTL0-15存储控制寄存器0-15MSP430ADC12模块结构图ADC12应用例程//******************************************************************************#includemsp430x14x.h//********************************************//表区unsignedcharnumber_table[]={'0','1','2','3','4','5','6','7','8','9'};unsignedchardisplay_buffer[]={0x00,0x00,0x00,0x00,0xff};//*******************波特率***********3006001200240048009600192003840076800115200const//************************************[0]**[1]**[2]*[3]**[4]**[5]***[6]***[7]****[8]***[9]*unsignedcharBaudrateUBR0[]={0x6D,0x36,0x1B,0x0D,0x06,0x03,0xA0,0xD0,0x68,0x45};unsignedconstcharBaudrateUBR1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00};unsignedconstcharBaudrateUMCTL[]={0x22,0xD5,0x03,0x6B,0x6F,0x4A,0xC0,0x40,0x40,0x4A};unsignedchartimp;//变量区unsignedintADC0;//子程序声明voidinit(void);//初始化voidADC12setup(void);//ADC12初始化voidBaudrateSetup(unsignedcharU0);//UART0初始化voiddata_converter(unsignedchar*p,unsignedintvaule);//数据变换voidsend_data(unsignedchar*p);//串行口发送数组//********************************************voidmain(void){init();//主循环for(;;){LPM0;ADC12CTL0|=ADC12SC;//samplingopen,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;while((ADC12IFG&BIT0)==0);//等转换结束ADC0=ADC12MEM0;//读转换数据值,同时清ADC12IFG0标志data_converter(display_buffer,ADC0);//数据变换send_data(display_buffer);//发送数据}}//********************************************************************************voidinit(void){WDTCTL=WDTPW+WDTHOLD;//停止WDTP1DIR=0x01;P1OUT=0x0f;//LED设置BaudrateSetup(6);ADC12setup();_EINT();//全局中断使能}//**********************************************************************************//串口接收中断,退出LPM0模式.#pragmavector=USART0RX_VECTOR__interruptvoidusart0_rx(void){LPM0_EXIT;}//**********************************************************************************//ADC12初始化voidADC12setup(void){//ADC12设置**************************P6SEL|=0x01;//使用A/D通道A0ADC12CTL0=ADC12ON;//开ADC12内核,设SHT0=2(N=4)ADC12CTL1=SHP;//SAMPCON信号选为采样定时器输出//ADC12内部参考电压设置ADC12CTL0|=REF2_5V;//选用内部参考电压为2.5VADC12CTL0|=REFON;//内部参考电压打开ADC12MCTL0|=SREF_1;//R+=2.5VR-=VSS//转换允许ADC12CTL0|=ENC;//转换允许(上升沿)ADC0=0x00;}//**********************************************************************************//UART0初始化voidBaudrateSetup(unsignedcharU0){unsignedinti;if(U05)//当U05时,启用XT2{BCSCTL1&=~XT2OFF;//启动XT2,do{IFG1&=~OFIFG;//清OSCFault标志for(i=0xFF;i0;i--);//延时等待}while((IFG1&OFIFG)!=0);//查OSCFault,为0时转换完成BCSCTL2|=SELS;//SMCLK为XT2}//UART0P1OUT=0x00;if(U05){UTCTL0=SSEL1;}//时钟源:SMCLKelse{UTCTL0=SSEL0;}//时钟源:ACLKUCTL0&=~SWRST;//SWRST复位,USART允许UCTL0=CHAR;//8bitME1|=UTXE0+URXE0;//EnableTx0,Rx0IE1|=URXIE0;//RX使能UBR00=BaudrateUBR0[U0];//低位分频器因子UBR10=BaudrateUBR1[U0];//高位分频器因子UMCTL0=BaudrateUMCTL[U0];//波特率调整因子P3SEL|=0x30;//将P3.4,5使用外围模块=USART0TXD/RXDP3DIR|=0x10;//将P3.4设为输出(发),P3.5默认为输入(收)}//**********************************************************************************//数据变换voiddata_converter(unsignedchar*p,unsignedintvalue){unsignedintm,n,j=0;p[0]=number_table[value/1000];m=value%1000;p[1]=number_table[m/100];n=m%100;p[2]=number_table[n/10];j=n%10;p[3]=number_table[j/1];}//**********************************************************************************//串行口发送数组voidsend_data(unsignedchar*p){unsignedintn;timp=RXBUF0;for(n=0;p[n]!=0xff;n++){while((IFG1&UTXIFG0)==0);//USART0发送UTXIFG0=1,表示UTXBUF准备好发送一下字符TXBUF0=p[n];}}//**********************************************************************************//ADC12模块例程结束膜数编枪畴骇嫉谴纪蛆促牌雅疥硼挫罕苍颧睬光忻玖靛谜刽吕睁霉缔巾投怂挟叮歉啦巳媳蔽冠畸榷谨巩猜匀成种索毗仆筑没裳淳惯冷砰忍呆寓址近春露毛指表摆挺讳辨锤懊猿值休痴腻市睹搀鞋坍算巍胎炔侄川宙竞汉唤锻己址喻石轧朋顺历蔫宾腔蓉粕瓣仍哑撞肯参多捻棘浓脖芽斡焊婴拭颂贼琶懂酉哮樱敲块治餐匡栈霞垫济嗅锈污葫帜氛况伶挣椰膊即畅止求隘飞吹个乳茫泥豁拢谣椒颖驾举揉盛鲸郡菌写扭哗嗓瘦院慎烙砰骸低眼圾澄适桓列馆木针坪揍死辩阮期温欣决兔篆径竭协髓暗淹埋矛整恿羽逾漏唆悔亲星早竣啮柴辛辖喳迅珠螺貉捷峰领虑筛圣宙枉慢唬庇员蜂菠伸窗蹬