大家好、团队成员
我想将 IEC60730相关内容添加到代码中。 我想咨询。 在系统给出的例程中、ADC 基准电压选择内部基准电压。 在被调用的函数库中、判断也基于内部基准电压。 如果选择外部电压作为基准电压时、如何修改相应的库?
示例:
adcTestHandle.muxChannel=15;
adcTestHandle.pinCount=0x3FF;
adcTestHandle.useInternalInput=INT_REF_1_5_V;
以下是库中的函数
在"IEC60730_ADC_TEST_testAdcInput" 功能中、内部基准电压被用来判断 ADC 模块的功能
/* --COPYRIGHT--,BSD * Copyright (c) 2016, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --/COPYRIGHT--*/ //***************************************************************************** // //! \addtogroup adc_test_api //! @{ // //***************************************************************************** //***************************************************************************** // //IEC60730_adc_test.c - ADC Tests for IEC60730 Class B. // //***************************************************************************** #include <msp430.h> #include "IEC60730_adc_test.h" #include "IEC60730_user_config.h" #include "IEC60730_system_config.h" #include "stdint.h" //***************************************************************************** // //! Tests functionality of ADC converter //! //! \param adcTestHandle contains parameter to test ADC channel. //! //! This function performs a plausibility check on the ADC10 or ADC12 module. //! The proper operation of the pin mux selection, and the A/D converter is //! checked with this function. //! Before calling this API the user must set values for pinCount, useInternalInput, //! and muxChannel in IEC60730_ADC_TEST_adcTest_Handle structure. //! The ADC conversion result is compared with "pinCount" value. The user can //! define the acceptable ADC count drift by adjusting the values of //! MINIMUM_ADC_COUNT_DRIFT and MAXIMUM_ADC_COUNT_DRIFT macros in //! "IEC60730_user_config.h" file. //! //! Modified registers are \b ADCxxCTL0 //! //! \return SIG_ADC_TEST.- if the counts provided by the user match the //! converted counts. //! TEST_FAILED. - if ADC test fail and JUMP_TO_FAILSAFE is disabled //! in "IEC60730_user_config.h". // //***************************************************************************** uint8_t IEC60730_ADC_TEST_testAdcInput(IEC60730_ADC_TEST_adcTest_Handle* adcTestHandle){ int16_t adcCountDelta; // Feed WDT in case user has WDT enabled before running CPU test #if ENABLED_WDT uint16_t wdtConfig = WDTCTL & 0x00ff; WDTCTL = WDTPW + WDTCNTCL + wdtConfig; #endif // ENABLED_WDT #if defined (__MSP430_HAS_ADC12_PLUS__) // Verify ADC channel selected is valid if(adcTestHandle->muxChannel>17 || adcTestHandle ->useInternalInput>2){ return TEST_FAILURE; } // If user wants to use ADC channel to sample internal channel (e.g. Vref) if(adcTestHandle->useInternalInput>0 && adcTestHandle->useInternalInput<3){ // Verify that user has reference generator on if(!ADC12CTL0&ADC12REFON){ return TEST_FAILURE; } // Verify that user has selected correct reference voltage if(adcTestHandle->useInternalInput==1 && ADC12CTL0 & ADC12REF2_5V){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==2 && !ADC12CTL0 & ADC12REF2_5V){ return TEST_FAILURE; } } // Verify that ADC12 is in single-conversion mode if(ADC12CTL2 & (ADC12CONSEQ0 + ADC12CONSEQ0) != 0){ return TEST_FAILURE; } // Verify user has correct ADC channel mapped to ADCMEM0 if (!(ADC12MCTL0&(adcTestHandle->muxChannel*0x0001u))){ return TEST_FAILURE; } // Enable conversions ADC12CTL0 |= ADC12ENC + ADC12SC; // Poll ADC12IFG while(!(ADC12IFG & ADC12IFG0)); ADC12CTL0 &= ~(ADC12ENC + ADC12SC); // Calculate ADC conversion Error adcCountDelta= ADC12MEM0 - adcTestHandle->pinCount; ADC12CTL0 &= ~(ADC12IFG0); // Determine if ADC conversion is within user defined +/- ADC drift if((adcCountDelta > MINIMUM_ADC_COUNT_DRIFT) && (adcCountDelta < MAXIMUM_ADC_COUNT_DRIFT)){ return(SIG_ADC_TEST); } #endif //__MSP430_HAS_ADC12_PLUS__ #if defined (__MSP430_HAS_ADC10__) // Verify ADC channel selected is valid if(adcTestHandle->muxChannel>11 || adcTestHandle ->useInternalInput>2){ return TEST_FAILURE; } // Check if user wants to use internal voltage reference for conversion if(adcTestHandle->useInternalInput>0 && adcTestHandle->useInternalInput<3){ // Verify that user has reference generator on if(!ADC10CTL0&REFON){ return TEST_FAILURE; } // Verify that user has selected correct reference voltage if(adcTestHandle->useInternalInput==1 && ADC10CTL0&REF2_5V){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==2 && !ADC10CTL0&REF2_5V){ return TEST_FAILURE; } } // Verify user has the correct ADC channel selected if (!(ADC10CTL1&(adcTestHandle->muxChannel*0x1000u))){ return TEST_FAILURE; } // Start ADC conversion ADC10CTL0 &= ~(ADC10IFG); ADC10CTL0 |= ENC + ADC10SC; // Poll ADC10IFG while(!(ADC10CTL0 & ADC10IFG)); // Stop ADC conversion ADC10CTL0 &= ~(ENC + ADC10SC); // Calculate ADC conversion Error adcCountDelta= ADC10MEM - adcTestHandle->pinCount; ADC10CTL0 &= ~(ADC10IFG); // Determine if ADC conversion is within user defined +/- ADC drift if((adcCountDelta > MINIMUM_ADC_COUNT_DRIFT) && (adcCountDelta < MAXIMUM_ADC_COUNT_DRIFT)){ return(SIG_ADC_TEST); } #endif //__MSP430_HAS_ADC10__ #if defined (__MSP430_HAS_ADC10_B__) // Verify ADC channel selected is valid if(adcTestHandle->muxChannel>16 || adcTestHandle ->useInternalInput>2){ return TEST_FAILURE; } // Check if user wants to use internal voltage reference for conversion if(adcTestHandle->useInternalInput>0 && adcTestHandle->useInternalInput<3){ // Verify that user has reference generator on if(!REFCTL0&REFON){ return TEST_FAILURE; } // Verify that user has selected correct reference voltage if(adcTestHandle->useInternalInput==INT_REF_1_5_V && !((REFCTL0&REFVSEL_0)==REFVSEL_0)){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==INT_REF_2_0_V && !((REFCTL0&REFVSEL_1)==REFVSEL_1)){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==INT_REF_2_5_V && !(((REFCTL0&REFVSEL_2)==REFVSEL_2) || ((REFCTL0&REFVSEL_3)==REFVSEL_3))){ return TEST_FAILURE; } } // Verify user has the correct ADC channel selected if (!(ADC10MCTL0&(adcTestHandle->muxChannel*0x0001u))){ return TEST_FAILURE; } // Start ADC conversion ADC10CTL0 |= ADC10ENC + ADC10SC; ADC10IFG &= ~(ADC10IFG0); // Poll ADC10IFG while(!ADC10IFG & ADC10IFG0); // Stop ADC conversion ADC10CTL0 &= ~(ADC10ENC + ADC10SC); // Calculate ADC conversion Error adcCountDelta= ADC10MEM0 - adcTestHandle->pinCount; // Determine if ADC conversion is within user defined +/- ADC drift if((adcCountDelta > MINIMUM_ADC_COUNT_DRIFT) && (adcCountDelta < MAXIMUM_ADC_COUNT_DRIFT)){ return(SIG_ADC_TEST); } #endif //__MSP430_HAS_ADC10B__ #if defined (__MSP430_HAS_ADC12_B__) // Verify ADC channel selected is valid if(adcTestHandle->muxChannel>32 || adcTestHandle ->useInternalInput>2){ return TEST_FAILURE; } // Check if user wants to use internal voltage reference for conversion if(adcTestHandle->useInternalInput>0 && adcTestHandle->useInternalInput<3){ // Verify that user has reference generator on if(!REFCTL0&REFON){ return TEST_FAILURE; } // Verify that user has selected correct reference voltage if(adcTestHandle->useInternalInput==INT_REF_1_2_V && !((REFCTL0&REFVSEL_0)==REFVSEL_0)){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==INT_REF_2_0_V && !((REFCTL0&REFVSEL_1)==REFVSEL_1)){ return TEST_FAILURE; }else if (adcTestHandle->useInternalInput==INT_REF_2_5_V && !(((REFCTL0&REFVSEL_2)==REFVSEL_2) || ((REFCTL0&REFVSEL_3)==REFVSEL_3))){ return TEST_FAILURE; } } // Verify user has the correct ADC channel selected if (!(ADC12MCTL0&(adcTestHandle->muxChannel*0x0001u))){ return TEST_FAILURE; } // Start ADC conversion ADC12CTL0 |= ADC12ENC + ADC12SC; ADC12IFGR0 &= ~(ADC12IFG0); // Poll ADC12IFG while(!ADC12IFGR0 & ADC12IFG0); // Stop ADC conversion ADC12CTL0 &= ~(ADC12ENC + ADC12SC); // Calculate ADC conversion Error adcCountDelta= ADC12MEM0 - adcTestHandle->pinCount; // Determine if ADC conversion is within user defined +/- ADC drift if((adcCountDelta > MINIMUM_ADC_COUNT_DRIFT) && (adcCountDelta < MAXIMUM_ADC_COUNT_DRIFT)){ return(SIG_ADC_TEST); } #endif //__MSP430_HAS_ADC12B__ #if defined (__MSP430_HAS_ADC__) // Verify ADC channel selected is valid ADC module can have 8 or 10 external // ADC channels and still has internal channels to monitor on chip // temperature sensor (A12), Vref (A13), Vcc(A14), and Vss(A15) // In addition ADC module only has Internal 1.5V reference if(adcTestHandle->muxChannel>16 || adcTestHandle ->useInternalInput>1){ return TEST_FAILURE; } // Check if user wants to use internal voltage reference for conversion if(adcTestHandle->useInternalInput == INT_REF_1_5_V ) { // Verify that user has reference generator on if(!(PMMCTL2 & INTREFEN)) { return TEST_FAILURE; } // No need to verify is user has selected correct reference voltage // since there is only one reference voltage in this family (1.5V) } // Verify ADC module is ON if(!(ADCCTL0 & ADCON)) { return TEST_FAILURE; } // Verify ADC conversion can be triggered via ADCSC bit if(ADCCTL1 & ADCSHS_3) { return TEST_FAILURE; } // Verify user has the correct ADC channel selected and ADC is in sigle // channel conversion mode if((ADCMCTL0_L & 0x0f) != adcTestHandle->muxChannel) { return TEST_FAILURE; } // Verify ADC conversion mode is in single-channel single-conversion mode if(ADCCTL1_L & ADCCONSEQ_3) { return TEST_FAILURE; } // Start ADC conversion ADCCTL0 |= (ADCENC | ADCSC); // Poll ADCBUSY Flag while(ADCCTL1 & ADCBUSY); // Calculate ADC conversion Error adcCountDelta= ADCMEM0 - adcTestHandle->pinCount; // Determine if ADC conversion is within user defined +/- ADC drift if((adcCountDelta > MINIMUM_ADC_COUNT_DRIFT) && (adcCountDelta < MAXIMUM_ADC_COUNT_DRIFT)){ return(SIG_ADC_TEST); } #endif return TEST_FAILURE; } //***************************************************************************** // // Close the Doxygen group. //! @} // //*****************************************************************************
现在,我要将基准电压更改为外部电压
adcTestHandle.muxChannel=15;
adcTestHandle.pinCount=0x3FF;
adcTestHandle.useInternalInput= external_REF;
如何修改"IEC60730_ADC_TEST_testAdcInput " 函数中的内容?