1591|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

介绍一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() ;  


}


 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表