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.

[参考译文] MSP430FR6989:校准过程

Guru**** 2507435 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1019288/msp430fr6989-calibration-process

器件型号:MSP430FR6989

尊敬的 MSP 团队:

我的客户需要有关 ESI 接口校准过程的一些支持。  

在 https://www.ti.com/lit/an/slaa639/slaa639.pdf 中 ,初始校准在一秒钟内进行(函数 SET_DAC())- 部分4.6:最佳 DAC 电压电平设置

然而、在实际应用中、如果预计具有较低的通量、 我们无法确保在1秒延迟期间测量光盘的金属和非金属部分。

我们是否应该在  set_dac()中停留 更长时间,等待  检测到金属和非金属部件?

 是否有办法在 SET_DAC() 函数中等待金属部分而不是金属部分出现?  

我们是否需要此初始校准 ,或者 使用 ReCalScanIF()就足够了?  

 

谢谢、此致、  

胡安。  

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

    您好 Juan、

    我们有关此解决方案的专家今天不在办公室,但下周将返回。 他们应能在7月21日之前回复您。

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

    您好 Jace、

    我们是否对此进行了更新?

    此致

    塞缪尔

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

    您好、Samuel、

    我们是否应该在  set_dac()中停留 更长时间,等待  检测到金属和非金属部件?  是的、我建议在 SET_DAC 中保持足够长的时间、以便检测金属和非金属。

     是否有办法在 SET_DAC() 函数中等待金属部分而不是金属部分出现?  不、我们没有任何功能可以自动检测这种情况。

    我们是否需要此初始校准 ,或者 使用 ReCalScanIF()就足够了? 建议执行初始校准。  您可以在下面的应用手册中找到更多详细信息。

    https://www.ti.com/lit/an/slaa609a/slaa609a.pdf 

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

    您好、Eddi、

    感谢您的响应、我将尝试实现与8匝初始校准类似的结果。 所以在 SetDac()上启用 Q6和 ESISTOP 中断为了获得4个循环计数器,其中我有一个 LMP3+ GIE,但在磁盘旋转时未正确检测到 Q6标志,你有什么想法吗?

    void Set_DAC(void)
    {
    // min 4 ,  max 6;
    #define SEPARATION_FACTOR               4
    
    	uint16_t loopCounter = 0;
    	fastParams fsParams= {0};
    
    	gMinDACCH0 = 4096;
    	gMaxDACCH0 = 0;
    	gMinDACCH1 = 4096;
    	gMaxDACCH1 = 0;
    
    	fsParams.range = 5;
    
    	fsParams.channel0Enabled = true;
    	fsParams.channel1Enabled = true;
    
    	// minimum times 4, maximum 6;
    	gStateSeparation = gNoiseLevel*(SEPARATION_FACTOR-1)+gNoiseLevel/2;
    
    
    	 // do loop for 1 more second after valid separation detected;
    	//do {
            
            ESI_clearInterrupt(ESI_INTERRUPT_FLAG_ESISTOP);
            ESI_enableInterrupt(ESI_INTERRUPT_ESISTOP);
            //ESI_clearInterrupt(ESI_INTERRUPT_FLAG_Q6_BIT_SET);
            //ESI_enableInterrupt(ESI_INTERRUPT_Q6_BIT_SET);
    
    
    		// do loop for detection of valid Max-Min separation;
    		do {
    		    uart_sprint("xxx Set DAC xxx ");
    
    			fsParams.channel0StartingPoint = ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER);
    			fsParams.channel1StartingPoint = ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER);
    
    			FindDAC_Fast_Successive(&fsParams);
    
    			if(fsParams.channel0Enabled ==true){
    				if(ESI_getAFE1DACValue(CHANNEL_0_DAC1_LOWER_REGISTER) < gMinDACCH0){
    					gMinDACCH0 = ESI_getAFE1DACValue(CHANNEL_0_DAC1_LOWER_REGISTER);
    				}
    
    				if(ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER) > gMaxDACCH0){
    					gMaxDACCH0 = ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER);
    				}
    			}			if(fsParams.channel1Enabled ==true){
    				if(ESI_getAFE1DACValue(CHANNEL_1_DAC1_LOWER_REGISTER) < gMinDACCH1){
    					gMinDACCH1 = ESI_getAFE1DACValue(CHANNEL_1_DAC1_LOWER_REGISTER);
    				}
    
    				if(ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER) > gMaxDACCH1){
    					gMaxDACCH1 = ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER);
    				}
    			}
    			ESI_clearInterrupt(ESI_INTERRUPT_FLAG_Q6_BIT_SET);
                ESI_enableInterrupt(ESI_INTERRUPT_Q6_BIT_SET);
    	        loopCounter++;
    
    	        if (gRecalFlag&INITIAL_AFE2_RECALIBRATION) {
    	            ESI_disableInterrupt(ESI_INTERRUPT_ESISTOP);
    #ifdef USE_UART
    	            sprintf(__buff, "<%d\n", loopCounter);
    	            uart_sprint(__buff);
    	            if ((loopCounter == 4) ) {
    	                uart_sprint("o\n");
    	                gRecalFlag |= VALID_RECALIBRATION;
    	            }
    #endif
    
                ESI_clearInterrupt(ESI_INTERRUPT_FLAG_Q6_BIT_SET);
                ESI_enableInterrupt(ESI_INTERRUPT_Q6_BIT_SET);        // Enable Q6 INT for in case of Time out.
                //ESI_enable();
                uart_sprint("Wait for Q6 flag\n");
                __bis_SR_register(LPM3_bits+GIE);
    	        }
    
    	        ESI_clearInterrupt(ESI_INTERRUPT_FLAG_ESISTOP);
    	        ESI_enableInterrupt(ESI_INTERRUPT_ESISTOP);
    	        ESI_clearInterrupt(ESI_INTERRUPT_FLAG_Q6_BIT_SET);
    	        ESI_enableInterrupt(ESI_INTERRUPT_Q6_BIT_SET);
    
    	        // To detect the a change due to rotation
    			// if a separation of gStateSeparation is found, a rotation is
    			// detected and keep running for 1 second to find the max and min
    
    			gThresholdH0 = gMaxDACCH0 - gMinDACCH0;
    			gThresholdH1 = gMaxDACCH1 - gMinDACCH1;
    
    			// check for valid separation
    
    			if(fsParams.channel0Enabled==true){
    				if (gThresholdH0 > gStateSeparation){
    					gESIStatusFlag |= VALID_SEPARATION_CH0;
    				}
    			}
    			if(fsParams.channel1Enabled==true){
    				if (gThresholdH1 > gStateSeparation){
    					gESIStatusFlag |= VALID_SEPARATION_CH1;
    				}
    			}
    			ESI_disable();
    		}while (!((gESIStatusFlag&VALID_SEPARATION_CH0) && (gESIStatusFlag&VALID_SEPARATION_CH1) && (gRecalFlag & VALID_RECALIBRATION)));
    
    	//} while(!(gRecalFlag & VALID_RECALIBRATION))   ;   // 1 second for 2340Hz using Find_Fast_Successive();
    	// "+" for INV version, "-" for non-INV version
    
    	if(fsParams.channel0Enabled ==true){
    		ESI_setAFE1DACValue((gMaxDACCH0 + gMinDACCH0)/2, CHANNEL_0_DAC1_UPPER_REGISTER);
    		// "+" for INV version, "-" for non-INV version
    		ESI_setAFE1DACValue(ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER) + gNoiseLevel, CHANNEL_0_DAC1_LOWER_REGISTER);
    		gAFE1Base0 = ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER);
    		// "-" for INV version, "+" for non-INV version
    		ESI_setAFE1DACValue(ESI_getAFE1DACValue(CHANNEL_0_DAC1_UPPER_REGISTER) - gNoiseLevel, CHANNEL_0_DAC1_UPPER_REGISTER);
    	}	if(fsParams.channel1Enabled ==true){
    		ESI_setAFE1DACValue((gMaxDACCH1 + gMinDACCH1)/2, CHANNEL_1_DAC1_UPPER_REGISTER);
    		// "+" for INV version, "-" for non-INV version
    		ESI_setAFE1DACValue(ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER) + gNoiseLevel, CHANNEL_1_DAC1_LOWER_REGISTER);
    		gAFE1Base1 = ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER);
    		// "-" for INV version, "+" for non-INV version
    		ESI_setAFE1DACValue(ESI_getAFE1DACValue(CHANNEL_1_DAC1_UPPER_REGISTER) - gNoiseLevel, CHANNEL_1_DAC1_UPPER_REGISTER);
    	}
    
    
    }