MSP430 ADC12 最高采样率测试

发布者:Jinyu2022最新更新时间:2022-09-21 来源: csdn关键字:MSP430  ADC12 手机看文章 扫描二维码
随时随地手机看文章

使用的MSP430型号为MSP430F5529LP(Lauchpad)


MSP430x5xx and MSP430x6xx Family User's Guide 给出:其内置12位ADC的 最高采样率约为200ksps

下面详述ADC设置过程。


目录


1.设置ADC转换模式为Repeat-single-channel;


2.设置ADC的转换时钟sample-and-hold source (SHI)


3.设置定时器A为输出输出模式


4.设置输入通道


5.设置ADC12SHP位


6.设置采样保持时间


1.设置ADC转换模式为Repeat-single-channel;

 

请通过设置ADC12CONSEQx位来设置转换模式。


2.设置ADC的转换时钟sample-and-hold source (SHI)

选择为定时器A的输出;

对于ADC12SHSx位, 默认值为0h,也就是ADC12SC位控制一次转换或多次转换的开始。在这一点上,官网上给出的大部分例程都保持默认设置。比如:


https://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=ALGZRALuAjj-L1sgzhrl-Q__IOGqZri__LATEST

本例程中需要选择定时器输出控制转换的开始, MSP430x5xx and MSP430x6xx Family User's Guide 中告诉我们需要查找device-specific data sheet


在这一点上,MSP430G2553 的ADC10的寄存器说明中则直接给出了对应的定时器:


下图摘自 MSP430x2xx Family  User's Guide

 对于F5529的ADC12,我们在 MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers 中可以找到答案: 

这样,设置ADC12SHS位为ADC12SHS_1,就可以通过TA0.1输出一个PWM波控制ADC转换。


注意,由于使用了TimerA控制转换,我们就不再需要控制ADC12SC位来开启转换。


也就是说官网示例中的以下语句我们不需要。


 ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion

同理,官网的给出的单通道重复转换的另一个示例中:


https://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=AF4y3ALvJIfHLG8i78B81g__IOGqZri__LATESThttps://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=AF4y3ALvJIfHLG8i78B81g__IOGqZri__LATEST

 ADC12MSC位的设置我们也不再需要,因为我们是通过定时器输出的PWM波来控制转换的,ADC12MSC位被设置为1时,得到一个数据后,下一个数据将会被立即转换,并不受PWM波的控制。(见下)

3.设置定时器A为输出输出模式

TA0.1输出应为周期为200kHz的PWM波。

 这里选择Output Mode 3,输出PWM波的周期只受TAxCCR0控制。


如果你的MSP430SMCLK为8MHz,且SMCLK被选为定时器的时钟源,那么TAxCCR0应该为:

mathrm{TAxCCR0}=frac{8MHz}{200kHz}=40

TAxCCR1的值将只影响占空比。


选择其他的输出模式请根据实际进行设置。


4.设置输入通道

上图来自:


MSP430F5529 LaunchPad™ Development Kit  (MSP‑EXP430F5529LP) 

slau533d.pdf

上图仍然来自: MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers

这里选择P6.0作为ADC输入引脚。


5.设置ADC12SHP位

该位控制采样的模式。


Extended Sample Mode:

Pulse Sample Mode: 

这里的理解为:SHI(已经被我们设置为定时器的输入)控制采样和转换时序。


对于 Extended Sample Mode,采样时长将与其高电平时间保持一致,这样在某些情况下可能导致转换出错。


比如,每次采样间隔完全足够完成一次转换,但由于低电平时间过短(比如占空比为99%),t_convert短于13个ADC12CLK,转换就会出错。


对于Pulse Sample Mode,SHI的上升沿触发采样开始,但采样时长由ADC12SHT位控制(见下一部分)

6.设置采样保持时间

由于需要达到最高转换速率,这里的设置需要异常谨慎。


下面稍作分析。

上图仍然来自:MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers

上图来自:MSP430x5xx and MSP430x6xx Family User's Guide


ADC12 clock source默认值为0,即ADC12OSC,其频率范围为:4.2~5.4MHz。


这里估算时按5MHz算,则其周期为:1/5M=200ns=0.2us


而我们需要达到的转换速率为200kHz,即每5us开始一次新的采样转换。

假如我们设置ADC12SHT0x位为0010b,也就是采样时间为16个ADC12CLK,则至少需要16*0.2=3.2us进行采样。


同时在当前配置下,t_convert的最小值为2.4us,那么:

large t_{sample}+t_{convert}geq 5.6mu s>5mu slarge t_{sample}+t_{convert}geq 5.6mu s>5mu s

无法完成任务。这里测试的情况是采样点数不够。


所以只能设置ADC12SHT0x为0001b或0000b,其他值统统不行。


另一种解决方案,通过设置ADC12SSELx位将时钟源换为SMCLK,并将主频调成25MHz(需要进行升压操作,详见PMM模块说明,这里不多说,进而实现要求.


当然当你主频过高时,不要忘记采样时间也有要求,需要大于1000ns,否则也可能出问题。


下面贴完整代码:


#include

/**

 * main.c

 */

unsigned int i=0;

volatile unsigned int buf[200];

int main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 

  Clock_init();

  Timer_Init();

  ADC12_Init();

}

 

#pragma vector = ADC12_VECTOR

__interrupt void ADC12_ISR(void)

{

  switch(__even_in_range(ADC12IV,34))

  {

  case  0: break;                           // Vector  0:  No interrupt

  case  2: break;                           // Vector  2:  ADC overflow

  case  4: break;                           // Vector  4:  ADC timing overflow

  case  6:                                  // Vector  6:  ADC12IFG0

          buf[i]=ADC12MEM0;//*3.3/4096.0; 变成浮点数将会来不及采样

          i++;

          if(i>200) i=0;

          break;

  case  8: break;                           // Vector  8:  ADC12IFG1

  case 10: break;                           // Vector 10:  ADC12IFG2

  case 12: break;                           // Vector 12:  ADC12IFG3

  case 14: break;                           // Vector 14:  ADC12IFG4

  case 16: break;                           // Vector 16:  ADC12IFG5

  case 18: break;                           // Vector 18:  ADC12IFG6

  case 20: break;                           // Vector 20:  ADC12IFG7

  case 22: break;                           // Vector 22:  ADC12IFG8

  case 24: break;                           // Vector 24:  ADC12IFG9

  case 26: break;                           // Vector 26:  ADC12IFG10

  case 28: break;                           // Vector 28:  ADC12IFG11

  case 30: break;                           // Vector 30:  ADC12IFG12

  case 32: break;                           // Vector 32:  ADC12IFG13

  case 34: break;                           // Vector 34:  ADC12IFG14

  default: break;

  }

}


系统频率设置为25MHz (需要设置PMM升压)


void upVcc(void)//核心电压上升3级

{

    PMMCTL0_H = PMMPW_H;                      //开启PMM电源管理,即开锁

    SVSMLCTL |= SVSMLRRL_1 + SVMLE;        //配置SVML电压

    PMMCTL0 = PMMPW +PMMCOREV_3;           //配置内核电压,选择3级

    while((PMMIFG & SVSMLDLYIFG)==0);      //等待配置完成

    PMMIFG &=~ (SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);

    if((PMMIFG & SVMLIFG)==1)

        while((PMMIFG & SVMLVLRIFG)==0);

    SVSMLCTL &=~ SVMLE;                    //关闭SVML

    PMMCTL0_H = 0x00;                     //锁存配置,即关锁

}

 

void Clock_init()         //XT2为时钟源

{

 

      upVcc();

      P5SEL |= BIT2+BIT3;                       // Port select XT2

 

      UCSCTL6 &= ~XT2OFF;                       // Enable XT2

      UCSCTL3 |= SELREF_5+FLLREFDIV_2;                      // FLLref = XT2 4MHz  divider:4

                                                // Since LFXT1 is not used,

                                                // sourcing FLL with LFXT1 can cause

                                                // XT1OFFG flag to set

      UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO

 

 

      UCSCTL2 = FLLD_1 + 24; //N=24         SMCLK=MCLK=DCOclkdiv:(N+1)*FFLrefclk/4=25MHz  FFLD=1—>D=2为默认值 -> DCOclk=50MHz

 

 

      UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx

      UCSCTL1 = DCORSEL_7;                      // Set RSELx for DCO = 16 MHz

 

      // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles

      do

      {

        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);

                                                // Clear XT2,XT1,DCO fault flags

        SFRIFG1 &= ~OFIFG;                      // Clear fault flags

      }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

 

      UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to

                                                // expected frequency 4MHz

 

  }


ADC12初始化:


void ADC12_Init()

{

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

 

    ADC12CTL0 = ADC12SHT0_1 + ADC12ON;

 

    ADC12CTL1= ADC12SHP + ADC12CONSEQ_2 + ADC12SHS_1;  //SHS1: TimerA 0_1 output ADC source clk:SMLCK

[1] [2]
关键字:MSP430  ADC12 引用地址:MSP430 ADC12 最高采样率测试

上一篇:MSP430FR6989功能介绍 首先看
下一篇:MSP430 低通滤波器测试

推荐阅读最新更新时间:2024-11-11 22:00

msp430TIME_B PWM输出
msp430TIME_B PWM输出 #include msp430x14x.h void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P4DIR |= 0x1E; P4SEL |= 0x1E; TBCCR0 = 500; TBCCTL1 = OUTMOD_3; TBCCR1 = 100; TBCCTL2 = OUTMOD_3; TBCCR2 = 200; TBCCTL3 = OUTMOD_3; TBCCR3 = 300; TBCCTL4 = OUTMOD_3; TBCCR4 = 250; TBCTL = TBSSEL_2 + MC_3; }
[单片机]
msp430单片机利用FDC2214测量电容
#include io430.h #include oled.h #include bmp.h #include Config.h #include fdc2214.h #include iic.h void OLED_JM0(void); int main( void ) { WDTCTL = WDTPW + WDTHOLD; u8 retVal=0; unsigned int id; unsigned long Buffer ={0}; IIC_Init(); OLED_Init(); //初始化OLED OLED_C
[单片机]
基于MSP430F435单片机的血糖仪系统设计
目前市场上的血糖仪种类繁多,结构外形各异,价格和精度也大相径庭;且价格和精度难以兼得。原因在于没有找到一款合适的微处理器。另外,出于屏幕尺寸的限制,界面普遍采用英文字符显示,这给中国病人带来一定的困惑。 随着电子技术的发展,微处理器功能日益增强,价格日趋降低。有必要选出一款功能强大而价格便宜的微处理器来重新设计血糖仪。本系统选用的MSP430系列微处理器使上述设想成为可能。 原理 血糖仪是根据电生物化学原理——施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增加——设计的。通过精确测量出这些微弱电流,并根据电流值和血糖浓度的关系,反算出相应的浓度。所以,确定这个关系是问题的核心。但其关系复杂,受多方面
[单片机]
基于<font color='red'>MSP430</font>F435单片机的血糖仪系统设计
业界最低功耗微控制器实现微型封装
TI 基于 FRAM 的 MSP430™ MCU 发挥 WLCSP 封装尺寸优势,帮助优化板级空间,缩小产品尺寸,节省电源。 2014 年 4 月 9 日,北京讯---日前,德州仪器 (TI) 宣布推出几个采用微型封装尺寸的最新超低功耗 MSP430™ 微控制器 (MCU) 系列,帮助开发人员节省宝贵的板级空间。除了 5 个提供微型封装选项的现有 MSP430 MCU 系列之外,TI 基于 FRAM 的超低功耗 MSP430FR5738 以及基于闪存的 MSP430F51x2 MCU 采用小至 2.0 x 2.2 x 0.3 毫米的晶圆芯片级封装 (WLCSP),使开发人员可设计更小的产品。 这些微型封装尺寸使 M
[单片机]
MSP430F5529系统时钟频率设置---超频40MHz
先前跟大家分享了一个MSP430F5529设置25MHz的频率的方法,但是总是感觉频率变化的比较大,经过一番的研究,我发现25MHz下的时钟是经过380倍频得到的,而网上有大神有提到,倍频的过程中存在的不稳定的情况下,故有了换晶振的想法。 我所使用的的是MSP430F5529 的launchpad,板载一个32.768K的RTC时钟XTAL1和一个4MHz 的时钟,原本我只是想获得一个稳定的25MHz的时钟,但是一次错的的数据配置之后我发现系统时钟居然跑到了26MHz,于是,探究频率极限的行动开始了。现在我把这个过程分享给大家。 链接1 25MHz时钟的设置方法 ---- 博客地址 链接2: 超频的代码下载地址-----
[单片机]
<font color='red'>MSP430</font>F5529系统时钟频率设置---超频40MHz
MSP430使用指南5 -> ICC中断控制器
ICC,即Interrupt Compare Controller,中断比较控制器,作用便是设定中断优先级,同时通过比较中断优先级等实现中断的硬件嵌套。 首先普及一下MSP430的中断系统,大部分的MSP430 MCU中断优先级是不能设置的,也就是说对于每一个中断源的优先级是体现设定好的,不支持后期用户自动设置,因此可以说如果正在执行低优先级的程序,突然来了一个高的优先级中断,是可以打断低优先级的服务程序的,但是前提是进入低优先级中断服务程序时开启了全局中断即GIE。但是如果高优先级中断正在执行服务程序,来了一个低优先级的中断,那么只能等待高优先级中断服务程序执行完之后,才可以去执行低优先级的中断服务程序,这样也就是说不能灵活
[单片机]
<font color='red'>MSP430</font>使用指南5 -> ICC中断控制器
两种方式实现TinyOS对MSP430F26&54系列的支持
第一种方式在Ubuntu 下TinyOS msp430 Toolchain mspgcc升级一文中已经作了详细分析,下面说说另一种方式实现TinyOS对MSP430高端系列单片机的支持。 我们已经知道TinyOS的编译过程,ncc编译器编译得到app.c文件,接着使用mspgcc编译工具对目标代码进行编译生成需要的.hex文件。但是,要注意的是在ncc编译过程中也会连接msp430库文件,所以就不可能在没有mspgcc的支持下得到app.c文件。那么,这里就出现了问题,如果没有按照上述所提到的第一种方式升级mspgcc,应该如何正确的编译得到所需的文件呢?答案就是使用挂羊头卖狗肉的方法,具体的就是.platform文件不用修改
[单片机]
MSP430:P1OUT=4、P1OUT |=4、P1OUT &-=~8的意思
首先,msp430没有P0口的,按P1口来说明 P1OUT = 4; P1.2引脚输出高电平,P1其余引脚输出低电平; P1OUT |= 4;P1.2置高电平,P1其余引脚不变; P1OUT &= ~8;即P1OUT &= 0xf7,P1.3置低电平,P1其余引脚不变; |是或运算符,&是与运算符,具体请参考C语言应用运算符部分! 没有P0口把就把P0当成P1讲解把 P1OUT=4=0100;所以P1.0,P1.1,P1.3输入P1.2输出 P1OUT |=4=0100 ;所以P1.2输出 P1OUT &-=~8=-(1000)=0111;P1.3输入 不一定对,我自己的理解,我也刚看书,还望高手指点 下边是 与 或 的详细
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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