MSP430的AD采集程序

/*

基于msp430f169/149的双通道AD采集程序,,内部2.5V参考电压,中断处理方式,采用滑动平均的滤波
方式,在测试时稳定的电压的采集中在小数点后两位保持不动。

*/

#include "ADC.h"
#include "stdio.h"
#include 

#define ADC_BUF_LEN   200

uint16_t ADC_Buf0[ADC_BUF_LEN] = {0} ; //ADC数据缓冲
uint16_t ADC_Buf1[ADC_BUF_LEN] = {0} ;

uint32_t ADC_Buf0_Sum = 0 ;
uint32_t ADC_Buf1_Sum = 0 ;

void ADC_Init(void)
{
    P6SEL|=(BIT0 + BIT1);                                    //选择ADC通道
    
    ADC12CTL0 &= ~ENC ;                              //ADC12CTL0寄存器部分重要的位需要bit1 == 0 才能修改
    ADC12CTL0 |= ADC12ON + SHT0_15 + REF2_5V + REFON + ADC12OVIE + ADC12TOVIE ; //ADC电源控制开,16个CLK,内部基准2.5V
    //ADC12CTL1|= ADC12SSEL1 +  ADC12SSEL1 + ADC12DIV_1;            //SMCLK做时钟源
    ADC12CTL1 = SHP + CONSEQ_3 ;
    
    ADC12MCTL0 = INCH_0 + SREF_1;                       //p60,参考电压内部2.5
    ADC12MCTL1 = INCH_1 + SREF_1 +  EOS ;               //p61,参考电压内部2.5V
    //ADC12MCTL2 = INCH_10 + SREF_1 + EOS;                //内部温度传感器

    ADC12IE |= BIT0 + BIT1 ;                                  //中断允许

}


/*启动ADC转换*/
void ADC_Start(void) 
{
   ADC12CTL0 |= ADC12SC + ENC ;    
}


/*ADC 中断服务函数*/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
    
    /*使用滑动平均值滤波*/
    uint16_t res ;
    float vol ;
    static uint8_t index = 0 ;
    uint8_t i ;
    
    ADC12CTL0 &= ~ENC ;
    ADC12CTL0 &= ~ADC12SC ;
    ADC12CTL0 &= ~(BIT0+BIT1) ;

    ADC12IE &= ~(BIT0|BIT1) ;                                  //关中断
    //while((ADC12CTL1&0x01)==1);  //如果ADC忙,则等待,否则读取ADC转换数值
    
    i = index % ADC_BUF_LEN ;
    
    res = ADC12MEM0 ;             //转移通道0的AD数据
    ADC_Buf0_Sum -= ADC_Buf0[i] ; //最后一个数组空间放数组的和
    ADC_Buf0[i] = res & 0x0FFF ;
    ADC_Buf0_Sum += ADC_Buf0[i] ; //将新的数据与总和相加
    res = ADC_Buf0_Sum / ADC_BUF_LEN ;
    vol = 1.0 * res * 2.5 / 4095 ;
    //vol = vol * 1.2184 ;               //开发板的参数
    vol = vol * 0.9954324 ;               //我的实验板
    
    //printf("%u\t%f\t\t",res,vot) ;
    
    
    
    
    res = ADC12MEM1 ;             //转移通道1的AD数据
    ADC_Buf1_Sum -= ADC_Buf1[i] ; //最后一个数组空间放数组的和
    ADC_Buf1[i] = res & 0x0FFF ;
    ADC_Buf1_Sum += ADC_Buf1[i] ; //将新的数据与总和相加
    res = ADC_Buf1_Sum / ADC_BUF_LEN ;
    vol = 1.0 * res * 2.5 / 4095 ;
    //vol = vol * 1.2184 ;        //开发板的参数
    vol = vol * 0.9954324 ;        //我的实验板 

   
    index++ ;
    ADC12IE |= BIT0 + BIT1 ;                                  //中断允许
    ADC12CTL0 |= (BIT0+BIT1) ;
    ADC_Start() ;

    
}

你可能感兴趣的:(单片机,嵌入式)