4871|6

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430FR5739之ADC [复制链接]

其实FR5739ADCG2553是基本一致的,就是按照手册的寄存器表,然后根据所需要实现的功能进行配置即可。。程序的配置如下:

void ADC10_Init(void)
{
    ADC10CTL0 &= ~(ADC10ENC + ADC10ON);//DISABLE ADC CONVERSION
   
    ADC10_IO_Init();
    //控制寄存器设置
    ADC10CTL0 |= ADC10SHT_5 + ADC10MSC;//ADC10CLK = ADC10SHT_5,MULTIPLE SAMPLE
    ADC10CTL1 |= ADC10SHS_0 + ADC10SHP + ADC10SSEL_3 + ADC10CONSEQ_2;//时间触发采样,CLK = SMCLK,REPEAT-SINGLE
   
    ADC10CTL2 |= ADC10RES ;//10 BIT ADC
   
    ADC10MCTL0 |= ADC10SREF_0 +ADC10INCH_3;//VREF = VCC,SAMPLE CHANNEL = CH5
   
    ADC10CTL0 |= ADC10ON + ADC10ENC + ADC10SC; //ENABLE ADC AND START
   
    ADC10IE |= ADC10IE0;
#ifdef DMA_TRANSFER
   
    DMA_Init((uint)ADC_DMA_SA,(uint)ADC_DMA_DA,ADC_DMA_SZ);//初始化DMA,设置为重复的块搬移模式
   
#endif
   
    _EINT();           

}

需要注意的地方在于板子的CH4接触的是NTC温度电阻,而根据电路的设计,需要使能该处的电源,

因此在配置IO的时候,除了使能IOADC采样通道功能外,还需要配置P2.7输出高电平。(在此自己还是一直犯了忘记开总中断 和配置IO的问题,以后得多提醒自己。。)还有就是精度的配置是通过配置ADC10CTL2中的ADC10RES来实现10位精度的。

初始化配置之后,就要开始对中断进行编写

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISP(void)
{
    switch(__even_in_range(ADC10IV,12))
 {
            case 2:break;
            case 4:break;
            case 6:break;
            case 8:break;
            case 10:break;
            case 12://CONVERSION IS CONPLETE
              {
#ifdef DMA_TRANSFER
                *ADC_DMA_SA = ADC10MEM0;
#else
                ADCRegResult = ADC10MEM0;
#endif
                ADCOverFlag = 1;
                DMA1CTL |=  DMAREQ;
           //     ADC10IFG &= ~ADC10IFG0;
              }
              break;
            default: break;
 }
    __bic_SR_register_on_exit(LPM4_bits);
}

关于中断的函数,用了__even_in_range(ADC10IV,12)的一个函数,在TI的例程里面,查询中断标志的实现大多是采用这一方式,该函数的用法是查询ADC10IV中的0-12的偶数位是否被置位,是的话返回ADC10IV的值。。这样能够提高switch的效率。

还有一个要注意的问题是假如在主函数中进入

模式,那么在除了定时器中断的其余中断函数中,需要退出该低功耗模式,否则下次将无法进入中断。。

最后就是对采样的数据进行处理,换算成电压值

void ADC10_Handle(void)
{
    static unsigned char i = 0;//记录

    if(Sys50X_ms && ADCOverFlag)//取值时间到,同时采样结束
    {
        Sys50X_ms = 0;
        ADCOverFlag = 0; 
#ifdef DMA_TRANSFER
        ADCRegSum += *ADC_DMA_DA;
#else
        ADCRegSum += ADCRegResult;
#endif
        i++;
       
        if(i >= ADCBufLen)
        {
            i = 0;
            ADCRegSum = ADCRegSum>>3;
            ADCValue = ADCRegSum*0.003519;
            LCD_Write_Float(2,0,ADCValue);
            ADCRegSum = 0;//清除总和,重新存值
            LED7_TURN;
        }             
    }  
}

然后为了也顺便学习DMA,在进行ADC的采样值读取过程中,对DMA也进行了初始化,在程序中加入宏“DMA_TRANSFER”,可根据需要选择是否编译。。

最新回复

请问一下MSP430g2553的采样频率在寄存器里怎么设置呢?  详情 回复 发表于 2012-8-20 00:10
 
点赞 关注

回复
举报

5276

帖子

5

TA的资源

裸片初长成(中级)

沙发
 
扫一眼看到了,觉得可能有点误导作用,所以说说个人的感觉

其实FR5739的ADC和G2553是基本一致的

这一句最好不要这样说,因为这样说比较含糊。德州好像划分为不同的类型的,像FR5739就是ADC10_B形的,就像定时器分为TimerA,B,C,D等类型一样,所以这样的说法比较笼统,应该例如这样说,许多操作基本一致。
实际上建议,新接触的,既然是不同的类型,还是要仔细看一下手册,一些地方还是有很大的不同的,例如电压基准好像就是单独的模块了,等等。已经有些天没摸了,有点模糊了,区别还是不少的吧。

点评

感谢你的指出,我是刚学习没多久的,从此处就能看出自己学得还不够踏实,只不过之前没能很好地发觉。。  详情 回复 发表于 2012-8-19 08:48
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

小液晶不错

不知道什么型号的。

点评

是5110  详情 回复 发表于 2012-8-19 08:48
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 沙发 wangfuchong 的帖子

感谢你的指出,我是刚学习没多久的,从此处就能看出自己学得还不够踏实,只不过之前没能很好地发觉。。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳 chen3bing 的帖子

是5110
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
请问一下MSP430g2553的采样频率在寄存器里怎么设置呢?

点评

在ADC10CTL0 的ADC10SHTx那里可以设置采样保持时间。或者可以改变对ADC10的时钟进行分频  详情 回复 发表于 2012-8-20 20:41
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 839792102 的帖子

在ADC10CTL0 的ADC10SHTx那里可以设置采样保持时间。或者可以改变对ADC10的时钟进行分频
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
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
快速回复 返回顶部 返回列表