TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR5969 ADC12 影响VLO的频率

在使用MSP430FR5969开发板调试时,发现VLO的频率变化很大,在JTAG模式下VLO的频率是10.4K左右,只要退出debugger,硬件不做改动,VLO的频率就变成了9.1K左右,最初以为是JTAG模式下的电压和退出后的电压不一致造成的,但在调试过程中发下,是ADC12影响了VLO的频率,只要屏蔽掉ADC12的初始化代码,VLO的频率基本稳定,请大神们帮忙分析一下。ADC12代码如下:

 void ADC_Cfg(void)
{
  P1SEL1 = 0;P1SEL0 = 0;                         //将其他采样通道关闭
  P1SEL1 |=BIT0| BIT1|BIT2|BIT3;                           // Configure P1.2 ,P1.3for ADC
  P1SEL0 |= BIT0| BIT1|BIT2|BIT3;  
  PM5CTL0 &= ~LOCKLPM5;
  
  ADC12CTL0 &=~ ADC12ENC;                    //初始化在ENC = 0下修改
  char busy_i=0;
  while(REFCTL0 & REFGENBUSY)// 开启内部2V的参考电压
  {
    busy_i++;
    if(busy_i>>2)  break;
  }             
  REFCTL0 |= REFVSEL_1 | REFON;                       // Select internal ref = 2.0V 
  ADC12CTL0 |= ADC12SHT0_0 | ADC12ON|ADC12MSC;        // ADC
  //ADC12CTL1 = ADC12SHP;                
  ADC12CTL1 = ADC12SHP|ADC12CONSEQ_1;       // 序列通道单次采集
  ADC12CTL2 |= ADC12RES_2|ADC12PWRMD;       // 12位转换精度,低功耗模式
 // ADC12CTL3 |= ADC12CSTARTADD_1;
  
  ADC12MCTL0 |= ADC12INCH_0| ADC12VRSEL_1;//
  ADC12MCTL1 |= ADC12INCH_1| ADC12VRSEL_1;
  ADC12MCTL2 |= ADC12INCH_2| ADC12VRSEL_1;
  ADC12MCTL3 |= ADC12INCH_3| ADC12VRSEL_1|ADC12EOS;                //  
  ADC12IER0 |= ADC12IE3;                    // Enable ADC conv complete interrupt

  ADC12CTL0 |= ADC12ENC; 
    
}

Jacky Xu:

VLO精度和和ADC没啥关系,你是把VLO从引脚输出来观察的嘛?

tingmeng yan:

回复 Jacky Xu:

是用示波器观察P2.0的引脚,即将VLO从引脚引出来观察的,另外还发现一个现象,当我用下面的程序调试时,在JTAG模式下VLO的频率在10.4K,退出后为9.1K,但是只要不使能LPM3,频率就为10.4K,难道是LPM3影响VLO的频率?现在还没有添加ADC部分,不确定是否是ADC影响的。

只要将__bis_SR_register(LPM3_bits|GIE);   变为__bis_SR_register(GIE);,VLO的频率就稳定了

#include "msp430.h"

void TimerA_Cfg_LPM(void);void CLK_Cfg_LFXT(void);void CLK_Cfg_VLO(void);void GPIO_Cfg(void);

unsigned char LFXT_Flag=0;unsigned char TimerA_Value=0;

int main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; GPIO_Cfg(); CLK_Cfg_VLO(); TimerA_Cfg_LPM(); TimerA_Value=13; __bis_SR_register(LPM3_bits|GIE);//开启总中断进入LPM3 while(1); }

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector = TIMER0_A0_VECTOR__interrupt void Timer0_A0_ISR (void)#elif defined(__GNUC__)void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)#else#error Compiler not supported!#endif{ TA0CCR0 += TimerA_Value; P3OUT ^= BIT6;}

/********************************************************************************* 函数名称:void CLK_Cfg_LFXT(void)** 功能描述: 配置低功耗模式使用的时钟,SMCLK=MCLK=HFXT16M,ACLK=VLO 9.4K**此处调试时可以试试调低DCO的频率看一下功耗是否降低** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void CLK_Cfg_LFXT(void){ PJSEL0 |= (BIT4 |BIT5); // 使能晶振管脚 PM5CTL0 &= ~LOCKLPM5; FRCTL0 = FRCTLPW|NWAITS_1;//使用16M晶振前需设置 CSCTL0_H = CSKEY >> 8; // Unlock CS registers CSCTL1 = DCOFSEL_4|DCORSEL; // Set DCO to 16 MHz // CSCTL1 = DCOFSEL_0; //CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__VLOCLK;// CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__LFXTCLK;// CSCTL3 = DIVM__1| DIVS__1|DIVA__4 ; // Set all dividers to 1 CSCTL4 |=( LFXTOFF );//不使用时关闭HFXT和LFXT do { CSCTL5 &= ~(LFXTOFFG | HFXTOFFG); // Clear XT1 and XT2 fault flag SFRIFG1 &= ~OFIFG; }while (SFRIFG1&OFIFG); // Test oscillator fault flag LFXT_Flag=1; P3OUT|=BIT5; CSCTL0_H = 0; // Lock CS registers }/********************************************************************************* 函数名称:void CLK_Cfg_VLO(void)** 功能描述: 配置低功耗模式使用的时钟,SMCLK=MCLK=HFXT16M,ACLK=VLO 9.4K**此处调试时可以试试调低DCO的频率看一下功耗是否降低** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void CLK_Cfg_VLO(void){ PJSEL0 &=~ (BIT4 |BIT5); // 使能晶振管脚 PM5CTL0 &= ~LOCKLPM5; FRCTL0 = FRCTLPW|NWAITS_1;//使用16M晶振前需设置 CSCTL0_H = CSKEY >> 8; // Unlock CS registers CSCTL1 = DCOFSEL_4|DCORSEL; // Set DCO to 16 MHz // CSCTL1 = DCOFSEL_0; CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__VLOCLK;// //CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__LFXTCLK;// CSCTL3 = DIVM__1| DIVS__1|DIVA__1 ; // Set all dividers to 1 LFXT_Flag=0; P3OUT&=~BIT5; CSCTL0_H = 0; // Lock CS registers }

/********************************************************************************* 函数名称:void GPIO_Cfg(void)** 功能描述: 配置GPIO全部为输出,为0** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/

void GPIO_Cfg(void){ P1OUT = 0; P1DIR=0xFF; P2OUT = 0; P2DIR=0xFF; P3OUT = 0; P3DIR=0xFF; P4OUT = 0; P4DIR=0xFF; PJOUT = 0; PJDIR = 0xFFFF; P4DIR &=~ BIT2;//调试用 P2SEL0 |= BIT0; // Output ACLK P2SEL1 |= BIT0; PM5CTL0 &= ~LOCKLPM5;}/********************************************************************************* 函数名称:void TimerA_Cfg_LPM(void)** 功能描述: 低功耗模式下使用定时器A,CLK=ACLK=9.4K** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void TimerA_Cfg_LPM(void){ TA0CCTL0 = CCIE; // TACCR0 interrupt enabled TA0CCR0 = 12; TA0CTL = TASSEL__ACLK | MC__CONTINUOUS; // ACLK, UP mode}

灰小子:

回复 tingmeng yan:

我的理解,VLO是rc震荡器类型的,会受到电压,电容等的影响。电路的其他部分以及测量频率的电路,有没有影响到这些?

tingmeng yan:

回复 灰小子:

电路上应该没有什么会影响VLO,另外,我还通过改变单片机的供电电压(2.2V和3.6V)来测试过VLO,变化不大,变化最大的就是是否使用LPM3和是否退出JTAG

HG:

回复 灰小子:

你改一下CCS里面JTAG的选项,试试有没有影响

tingmeng yan:

回复 HG:

不好意思,忘了说了,我用的是IAR for MSP430 V6.4.。 

HG:

回复 tingmeng yan:

就做个小实验,用CCS也不麻烦的,看看这个VLO震荡频率是不是真的和JTAG打进去的电压有关

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR5969 ADC12 影响VLO的频率
分享到: 更多 (0)