工具与软件:
您好!
我正在努力优化定制电路板的电流消耗。 目前、我已经集成了 ADC 和 REF 模块、它们在 LPM3模式下消耗160 µA。
您能帮助我进一步降低电流消耗吗?
每个模块(ADC 和 REF)消耗的电流大小。


#include "driverlib.h"
uint16_t count,tempSCBat,tempVbat;
float vbatRaw,scbatRaw;
float results;
uint8_t secCount=0;
ADC12_B_initParam adc_init;
ADC12_B_configureMemoryParam memory_init1;
ADC12_B_configureMemoryParam memory_init2;
void gpioSetup()
{
/********************************************************************************************************************************/
//GPIO Port 1
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN0, GPIO_TERNARY_MODULE_FUNCTION);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN1, GPIO_TERNARY_MODULE_FUNCTION);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2, GPIO_TERNARY_MODULE_FUNCTION);
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6);
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN7);
GPIO_setOutputHighOnPin(GPIO_PORT_P3,GPIO_PIN5); //P3.5
//Output Setting
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN3);
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P1, GPIO_PIN7);
//GPIO Port 2
GPIO_setAsInputPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1|GPIO_PIN4|GPIO_PIN5);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2, GPIO_PIN2, GPIO_TERNARY_MODULE_FUNCTION);
GPIO_setAsInputPin(GPIO_PORT_P2, GPIO_PIN3);
//Output Setting
GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN5);
GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
//GPIO Port 3
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3,GPIO_PIN0);//P3.0
GPIO_setAsInputPin(GPIO_PORT_P3,GPIO_PIN1);//P3.1
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3,GPIO_PIN2);//P3.2
GPIO_setAsInputPin(GPIO_PORT_P3,GPIO_PIN3);//P3.3
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3, GPIO_PIN4); //P3.4
GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN5); //P3.5
GPIO_setOutputHighOnPin(GPIO_PORT_P3,GPIO_PIN5); //P3.5
GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN6|GPIO_PIN7); //P3.6 and P3.7
//GPIO Port 4
GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN0);//P4.0
GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN0);//P4.0
GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
//GPIO Port 5
GPIO_setAsOutputPin(GPIO_PORT_P5,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
GPIO_setOutputHighOnPin(GPIO_PORT_P5,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
//GPIO Port 6
GPIO_setAsOutputPin(GPIO_PORT_P6,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN7);
GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN4|GPIO_PIN5|GPIO_PIN6);
//GPIO Port 7
GPIO_setAsOutputPin(GPIO_PORT_P7,GPIO_PIN0);
GPIO_setOutputHighOnPin(GPIO_PORT_P7,GPIO_PIN0);
//GPIO Port J
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_PJ, GPIO_PIN3); //[EVM to disable LED2]
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ, GPIO_PIN4 + GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION); /* Configure LFXT GPIO pins */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN6, GPIO_TERNARY_MODULE_FUNCTION); // Enable monitoring of USSXT_BOUT via PJ.6 pin
GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN7); //PJ.7
GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3, GPIO_PIN4);
GPIO_enableInterrupt(GPIO_PORT_P3, GPIO_PIN4);
GPIO_selectInterruptEdge(GPIO_PORT_P3, GPIO_PIN4, GPIO_LOW_TO_HIGH_TRANSITION);
GPIO_clearInterrupt(GPIO_PORT_P3, GPIO_PIN4);
PM5CTL0 &= ~LOCKLPM5;
}
void adcRefVoltageSetup()
{
if(Ref_A_isRefGenBusy(REF_A_BASE))
Ref_A_disableTempSensor(REF_A_BASE);
else
_NOP();
// Configure internal reference
while (REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
REFCTL0 |= REFVSEL_1 | REFON; // Select internal ref = 2.0V // Internal Reference ON
while (!(REFCTL0 & REFGENRDY)); // Wait for reference generator
// to settle
//Delay (~75us) for Ref to settle
__delay_cycles(75);
}
void adcSetup()
{
/***** adc hw setup ******/
adc_init.clockSourceSelect = ADC12_B_CLOCKSOURCE_ACLK;
adc_init.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
adc_init.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
adc_init.internalChannelMap = ADC12_B_NOINTCH;
adc_init.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
/***** sc bat channel A8 setup ******/
memory_init1.memoryBufferControlIndex = ADC12_B_MEMORY_0;
memory_init1.inputSourceSelect = ADC12_B_INPUT_A8;
memory_init1.refVoltageSourceSelect = ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
memory_init1.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
memory_init1.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
memory_init1.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
/***** bat inv channel A14 setup ******/
memory_init2.memoryBufferControlIndex = ADC12_B_MEMORY_1;
memory_init2.inputSourceSelect = ADC12_B_INPUT_A14;
memory_init2.refVoltageSourceSelect = ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
memory_init2.endOfSequence = ADC12_B_ENDOFSEQUENCE;
memory_init2.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
memory_init2.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
/***** adc initialization ******/
ADC12_B_init(ADC12_B_BASE, &adc_init);
/***** adc sampling timer ******/
ADC12_B_setupSamplingTimer(ADC12_B_BASE, ADC12_B_CYCLEHOLD_32_CYCLES,
ADC12_B_CYCLEHOLD_4_CYCLES,
ADC12_B_MULTIPLESAMPLESENABLE);
/***** configuring Memory 0 ******/
ADC12_B_configureMemory(ADC12_B_BASE, &memory_init1);
/***** configuring Memory 1 ******/
ADC12_B_configureMemory(ADC12_B_BASE, &memory_init2);
/***** clear adc interrupt ******/
ADC12_B_clearInterrupt(ADC12_B_BASE, 0, ADC12_B_IFG1);
/***** enable adc interrupt on memory 1 ******/
ADC12_B_enableInterrupt(ADC12_B_BASE, ADC12_B_IE1, 0, 0);
/***** enable adc ******/
ADC12_B_enable(ADC12_B_BASE);
/***** start conversion ******/
ADC12_B_startConversion(ADC12_B_BASE, ADC12_B_START_AT_ADC12MEM0,
ADC12_B_SEQOFCHANNELS);
}
void timerSetup()
{
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
TA0CTL = TASSEL__ACLK |ID__2| MC__UP; // SMCLK, UP mode
TA0CCR0 = 16000; //164 = 10ms
}
void readADCData()
{
tempSCBat=ADC12MEM0;
tempVbat=ADC12MEM1;
scbatRaw=(float) ((0.001 * tempSCBat) - 0.0026);
vbatRaw=((0.0039*tempVbat)-0.0963);
}
void clockSetup()
{
// Unlock CS registers
CSCTL0_H = CSKEY >> 8;
// Set DCO to 8MHz
CSCTL1 = DCORSEL | DCOFSEL_3;
// Configure clock dividers all dividers
CSCTL3 = (DIVA__1 | DIVS__1 | DIVM__1);
// Set SMCLK = MCLK = DCO, ACLK = LFXTCLK
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL4 |= (LFXTDRIVE_3);
CSCTL4 &= ~(LFXTOFF);
CSCTL0_H = 0;
PJSEL0 |= BIT4 | BIT5;
PM5CTL0 &= ~LOCKLPM5;
}
int main(void) {
WDT_A_hold(WDT_A_BASE);
clockSetup();
gpioSetup();
adcRefVoltageSetup();
timerSetup();
adcSetup();
__bis_SR_register(LPM3_bits | GIE);
return (0);
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR (void){
secCount=secCount+1;
readADCData();
if(secCount>5)
{
/**** enable adc *****/
ADC12_B_enable(ADC12_B_BASE);
/**** start conversion *****/
ADC12_B_startConversion(ADC12_B_BASE, ADC12_B_START_AT_ADC12MEM0,
ADC12_B_SEQOFCHANNELS);
secCount=0;
}
}
//ADC12 interrupt service routine
#pragma vector=ADC12_B_VECTOR
__interrupt void ADC12ISR (void)
{
ADC12_B_disable(ADC12_B_BASE);
/***** clear adc interrupt ******/
ADC12_B_clearInterrupt(ADC12_B_BASE, 0, ADC12_B_IFG1);
}
此致、
Sarwath