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.

[参考译文] MSP430FR5949:设备现场运行的概率很小、ADC12转换结果超过4095、高达50000以上

Guru**** 2380460 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1122688/msp430fr5949-the-equipment-field-operation-has-a-small-probability-adc12-conversion-results-over-4095-up-to-more-than-50000

器件型号:MSP430FR5949
主题中讨论的其他器件:冲击

#define CALADC12_25V_30C  *((unsigned int *)0x1A22)   // Temperature Sensor Calibration-30 C
#define CALADC12_25V_85C  *((unsigned int *)0x1A24)  //See device datasheet for TLV table memory mapping


void ADC_ui(void)
{
  REFCTL0 |= REFTCOFF;//
  ADC12CTL3 &=~ ADC12TCMAP;
  ADC12CTL0 |=ADC12SHT0_2;
  ADC12MCTL0 = ADC12VRSEL_1+ADC12INCH_12; // ref+=AVcc, channel = A2
  ADC12MCTL1 = ADC12VRSEL_1+ADC12INCH_14; // ref+=AVcc, channel = A4
  ADC12MCTL2 = ADC12VRSEL_1+ADC12INCH_4+ADC12EOS;
  ADC12IER0 = 0x04;                      // Enable ADC12IFG.3
}

void ADC_all(void)
{
  All_over=1;
  REFCTL0 &=~ REFTCOFF;
  ADC12CTL0 |= ADC12SHT0_8;
  ADC12CTL3 |= ADC12TCMAP;
  ADC12MCTL0 = ADC12VRSEL_1+ADC12INCH_12;//  P3.0-A12 
  ADC12MCTL1 = ADC12VRSEL_1+ADC12INCH_14;//  P3.2-A14
  ADC12MCTL2 = ADC12VRSEL_1+ADC12INCH_4;//   P1.4-A4
  ADC12MCTL3 = ADC12VRSEL_1+ADC12INCH_2;//   P1.2-A2
  ADC12MCTL4 = ADC12VRSEL_1+ADC12INCH_30+ADC12EOS;//
  ADC12IER0 = 0x10;                       // Enable      
}


#define  TIME_SAMPLE  (u16)(round)(32768/(1000.0/20)-1) 

void ADC_init(void)
{    
  P1SEL1 |= BIT1+BIT2+BIT4; //ref+ BAT 
  P1SEL0 |= BIT1+BIT2+BIT4;
  
  P2SEL1 |= BIT4; //C+
  P2SEL0 |= BIT4;
  
  P3SEL1 |= (BIT0+BIT1+BIT2);//isk ilk vol
  P3SEL0 |= (BIT0+BIT1+BIT2);//
  
  while(REFCTL0 & REFGENBUSY);
  REFCTL0 = REFVSEL_2;// | REFON;
  //while(REFCTL0 & REFGENRDY);//Reference voltage output is ready to be used
  
  ADC12CTL0 &= ~ADC12ENC;
  ADC12CTL0 |= ADC12ON|ADC12MSC; //          // Turn on ADC12, set sampling time
  ADC12CTL1 |= ADC12SHP|ADC12SHS_1| ADC12CONSEQ_1; //CSTARTADD_0++                // Use sampling timer, single sequence
  //ADC12CTL2 |= ADC12RES_2|ADC12PWRMD;                 // 12-bit conversion results
  ADC_ui();
  ADC12CTL0 |= ADC12ENC;
  
  TA0CCR0 = TIME_SAMPLE;//20ms      // PWM Period
  TA0CCR1 = TIME_SAMPLE;//20ms;     // TACCR1 PWM Duty Cycle
  TA0CCTL1 = OUTMOD_3;              // TACCR1 set/reset
  TA0CTL = TASSEL__ACLK | MC__UP;   // ACLK, up mode     
}


#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
  LPM3_EXIT;   
  Vol_RT   = ADC12MEM0; //vol
  Isk   =  ADC12MEM1;   //isk
  Ilk   =  ADC12MEM2;   //ilk
  u16 bat_ad = ADC12MEM3; //BAT
  u16 temp_ad  = ADC12MEM4;//TEMP
  if(All_over==1)
  {   
    All_over=2;     
    BATVAL= ((u32)bat_ad*8375/40950);//BATVAL 2.5/2*6.7*100
    //ChargeVAL =((u32)charge_ad*8375/40950);     
    temper = (s16)((((long)temp_ad - CALADC12_25V_30C) * (85 - 30)) /
                  (CALADC12_25V_85C - CALADC12_25V_30C) + 30.0f);
  }
  ADC_start();
  for(u8 i=0;i<=5;i++) {
    NOP();
  }
  SysF.TIMA=1;
  TA_task();
}

void ADC_start(void)
{ 
  ADC12CTL0 &=~ ADC12ENC;
  static u8 All_sample_last=0;
  if(All_sample_last!=All_sample)
  {
    All_sample_last=All_sample;
    if(All_sample==1)
    {
      All_sample=0;
      ADC_all(); //5 channels
    }
    else
    {
      ADC_ui(); //3 channels
    }
  }
  ADC12CTL0 |= ADC12ENC; 
}

在现场操作期间、ADC 转换结果很有可能异常、超过50000。

错误条件:

  Vol_RT:52188

  Iuk:21524

   ℃:60 μ m

这些现象超出了我的理解!但我在调试时无法复制。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、尚杜、

    您如何检测这些错误情况? 您如何读回这些值?

    我想不出 ADC12会根据您显示的设置产生您所看到的值的任何原因。 您能确认 ADC12DF = 0吗? 否则、您可能会将二进制补码解释为无符号二进制、这可能会导致您看到的结果。  

    此外、您不应该对 Vol_RT 和 ilk 执行任何操作。 您是否进行过任何后处理? 您能否确认您没有使用坏数据写入这些变量? 另一种可能是程序的另一部分意外写入这些存储器位置(例如阵列越界问题)。

    此致、

    Evan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好, Evan

     我无法确认 ADC12DF =0.ADC12CTL2使用默认设置。(ADC12DF=0)

    MCU 是否可能受到某种雷击的影响、这种雷击会导致 ADC12DF 设置一段时间、然后复位为零。我检查了代码、Vol_RT isk ilk 位于不同的存储器区域中。 例如、未找到阵列越界问题。

    现在、ADC12DF 的猜测与我的现象更加一致。 我将添加调试信息以确定 ADC12DF=1的情况是否确实发生、我还将详细检查代码。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为寄生比特翻转不太可能。  

    为了隔离该问题、我会将您的应用程序最小化(如果可能、只需模拟捕捉、不要在 ISR 中重新配置模拟)、并查看问题是否仍然发生。  

    此致、

    Evan