I'm working on a software solution which set the Pin PC2 to "reset state" if my input signal (connected to ADC) is above 2V.

I testing my code with STM32 Studio to watch in real time the digital output of my ADC.

Here is how i configured the ADC1 :

  hadc3.Instance = ADC1;
  hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV6;
  hadc3.Init.Resolution = ADC_RESOLUTION_12B;
  hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = DISABLE;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = ENABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.NbrOfDiscConversion = 0;
  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc3.Init.DMAContinuousRequests = DISABLE;
  hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc3.Init.OversamplingMode = DISABLE;

sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0;

I can proper retrieve the output number of my ADC with DMA but I've an electronic problem I think :

In Nucleo STM32L476-RG, the ADC1 Channel 1 & 2 are connected to the pin PC0 and PC1.

When I connect the pin PC1 to the STM32L4 GND and the pin PC0 to the 3.3V, i can retrieve the 4095 value from the ADC, that's good.

But, when I connect the pin PC0 to GND or a 0V source, the ADC should return me 0 value but it don't, it return 1981 value.

For resume :

Input of ADC1 : 3.3V | Output of ADC1 : 4095 | Config : PC1 on GND ; PC0 on 3.3V
Input of ADC1 : 0V | Output of ADC1 : 1981 | Config : PC1 on GND ; PC0 on 0V/GND

I don't know why i've got this Offset. I've read the datasheet a thousand of times, STMicroElectronics mention a 0V Reference which called VSSA or VREF- but i don't understand how to connect my Pins.

The only pins which i use is the PC0 and PC1. Should I connect other PIN to a ground or anything? Someone had this problem before?


Actually everything is working perfectly. You have just configured the ADC in differential mode so that it measures the difference between PC0 and PC1. This difference can be positive or negative depending on whether PC0 is greater than PC1 or PC1 is greater than PC0. When they are equal to each other, the ADC reading is in the middle, which is what you are observing with the 1981 value (approximately half full scale of 4096).

Change the ADC_DIFFERENTIAL_ENDED constant to put the ADC into single ended mode (measurements relative to VREF) if you don't want this behaviour.

  • \$\begingroup\$ You made my day ! Thanks a lot, it was the correct answer \$\endgroup\$ – Alexandre Chirouze Jan 25 '17 at 16:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.