Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[ARM] Reading ADC1 with internal temperature sensor on STM32 ?

Status
Not open for further replies.

bianchi77

Advanced Member level 4
Joined
Jun 11, 2009
Messages
1,313
Helped
21
Reputation
44
Reaction score
20
Trophy points
1,318
Location
California
Activity points
9,442
Guys,

Am I right on initializing ADC ?
It's running only one time and then freeze, I put it on forever loop, but stopping, never looping again, any wrong configuration here ?

thanks
Code:
  //read internal temperature sensor begin

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
        //ADC1 configuration
        //select independent conversion mode (single)
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        //We will convert single channel only
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        //we will convert one time
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        //select no external triggering
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        //right 12-bit data alignment in ADC data register
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        //single channel conversion
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        //load structure values to control and status registers
        ADC_Init(ADC1, &ADC_InitStructure);
        //wake up temperature sensor
        ADC_TempSensorVrefintCmd(ENABLE);
        //ADC1 channel16 configuration
        //we select 41.5 cycles conversion for channel16
        //and rank=1 which doesn't matter in single mode
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_41Cycles5);
        //Enable ADC1
        ADC_Cmd(ADC1, ENABLE);
        //Enable ADC1 reset calibration register
        ADC_ResetCalibration(ADC1);
        //Check the end of ADC1 reset calibration register
        while(ADC_GetResetCalibrationStatus(ADC1));
        //Start ADC1 calibration
        ADC_StartCalibration(ADC1);
        //Check the end of ADC1 calibration
        while(ADC_GetCalibrationStatus(ADC1));
        //Start ADC1 Software Conversion
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        //wait for conversion complete
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)){}
        //read ADC value
        AD_value=ADC_GetConversionValue(ADC1);
        //clear EOC flag
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

        printf("\r\n ADC value: %d \r\n", AD_value);
        TemperatureC = (uint16_t)((V25-AD_value)/Avg_Slope+25);
        printf("Temperature: %d%cC\r\n", TemperatureC, 176);
        
      //read internal temperature sensor end
 

The code as written right now definitely just does one conversion and then stops. If you want to keep making multiple single conversions, you'll need to start the conversion each time by setting the start bit, which you do when you call:

Code:
//Start ADC1 Software Conversion
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

So put that, along with getting your data and the checking of the EOC bit, all in a while loop and it should run until you say otherwise.

You can also use continuous conversion mode, which is on page 390 of the STM32 Reference Manual
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top