This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR5969 ADC12 影响VLO的频率

Other Parts Discussed in Thread: MSP430FR5969

在使用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; 
    
}
  • VLO精度和和ADC没啥关系,你是把VLO从引脚输出来观察的嘛?

  • 是用示波器观察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
    }

  • 我的理解,VLO是rc震荡器类型的,会受到电压,电容等的影响。电路的其他部分以及测量频率的电路,有没有影响到这些?
  • 电路上应该没有什么会影响VLO,另外,我还通过改变单片机的供电电压(2.2V和3.6V)来测试过VLO,变化不大,变化最大的就是是否使用LPM3和是否退出JTAG

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

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

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