We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi
Can we use internal regulator for ref voltage of ADC of STM32L152? if you have experienced it please tel me how to do?
I am using
ADC_TempSensorVrefintCmd(ENABLE);
but it works with external vref my code is:
void ADC_Init(void) { ADC_InitTypeDef ADC_InitStructure; /* Enable ADC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* de-initialize ADC */ ADC_DeInit(ADC1); /* ADC configured as follow: - NbrOfChannel = 1 - ADC_Channel_9 - Mode = Single ConversionMode(ContinuousConvMode disabled) - Resolution = 12Bits - Prescaler = /1 - sampling time 192 */ /* ADC Configuration */ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel9 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_192Cycles); ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze); ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait until ADC1 ON status */ while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET) { } }
uint16_t ADC_Supply(void) { uint8_t i; uint16_t res; /* Initializes ADC */ ADC_Init(); ADC_TempSensorVrefintCmd(ENABLE); /* ADC1 regular channel 9 for VREF configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_192Cycles); /* initialize result */ res = 0; for(i=4; i>0; i--) { /* start ADC convertion by software */ ADC_SoftwareStartConv(ADC1); /* wait until end-of-covertion */ while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 ); /* read ADC convertion result */ res += ADC_GetConversionValue(ADC1); } /* de-initialize ADC */ ADC_TempSensorVrefintCmd(DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); return (res>>2); }
What values are you reading, and what do you expect to see?
I'm not sure the ADC *uses* it as a reference as much as it allows you to determine the value of your supplied +VREF
Thanks for reply. I read by this command:
battery_val=ADC_Supply();
which calls
ADC_GetConversionValue(ADC1);
I have not connected VREF+ to any power source in my board is there a way to connect it internally to vref of MCU by software?
Which part exactly are you using? Some devices have +VREF internally bonded to VDDA, and -VREF internally bonded to VSSA. On devices with VREF pins *you* have to connect them to the supplies yourself, in your design. I'm reasonably sure there is not a magic software setting, but try reading the manuals.
Isn't VREFINT on CHANNEL 17?
www.st.com/.../CD00277537.pdf