Skip to main content
BMoha.19.45
Associate II
April 3, 2019
Solved

Hi, I am trying to obtain values from potentiomater which is connected to PA0 (ADC channel 0), through ADC.

  • April 3, 2019
  • 18 replies
  • 3817 views

However, the values that I obtain (I show them on LCD display) are not only inconsistent, but also the potentiometer's rotation doesn't effect the value? I have searched a lot and tried different ways but I couldn't find the problem in my code. Please, can you help me where I did wrong? I have attached the related part of the code with comments.

GPIOA->MODER |= GPIO_MODER_MODE0_Msk; //Set as PA0 as Analog Mode
	
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //Enable the ADC clock
	
ADC1->SQR1 = 0x00000000; //1 Convertion
ADC1->SQR2 = 0x00000000; 
ADC1->SQR3 = 0x00000000; //0'th channel will be converted first
	
ADC1->SMPR2 = 0x00000005; //sampling time - 112 cycles
ADC1->CR2 |= ADC_CR2_CONT_Msk; //Enable continious mode
ADC1->CR1 &= ~(ADC_CR1_SCAN_Msk); //Disable Scan mode
ADC1->CR2 |= ADC_CR2_ADON; //Enable ADC
	
while(1)
{
	ADC1->CR2 |= ADC_CR2_SWSTART_Msk; //Start convertion
	LCDSendAnInteger((ADC1->DR), 7); //Display value in LCD
	notExactTimeDelay(1000000);
	LCDClearDisplay();
}

This topic has been closed for replies.
Best answer by Vangelis Fortounas

This bit clears by HW as soon as the conversion starts.

It is impossible to observe this transition (or to record it) with STLink onboard debugger.

By the way i don't see if GPIOA's. clock is enabled.

18 replies

waclawek.jan
Super User
April 3, 2019

What STM32? What board?

Read back the GPIO and ADC registers content and check.

JW

BMoha.19.45
Associate II
April 4, 2019

Thank you for your answer. I use STM32F407VG discovery board. I read the datasheet many times and check each registers' content very carefully, but no effect.

S.Ma
Principal
April 3, 2019

Make sure no pull-up/down resistor activated, ADC calibration was done, and put a decoupling cap at the ADC input pin to avoid voltage droop during sampling time. What value is your potentiometer? ADC input should be low impedence.

BMoha.19.45
Associate II
April 4, 2019

Thank you for your answer. I use STM32f407VG discovery board and it does ADC calibration automatically. My potentiometer value is 10k.

S.Ma
Principal
April 4, 2019

Add a cap to ground on adc input pin to stabilize the voltage, 100nF maybe? When sampling the adc briefly looks like RC filter R about 3kohm and discharged cap of few pF

BMoha.19.45
Associate II
April 4, 2019

Is my code above alright? Because, even when I unplug the jumper cable from PA0 it shows the same values.

brian239955_stm1
Associate II
April 5, 2019

You are trying to display the conversion result before the conversion is complete. You need something like -

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) {

;

}

before reading ADC1->DR and sending to the LCD.

AvaTar
Senior III
April 5, 2019

> You are trying to display the conversion result before the conversion is complete.

True, but for a continuous conversion, this doesn't make much of a difference. Except for the lag.

But waiting for the conversion result (as suggested) and reducing the delay would make a more responsive display.

But in your place, I would swap to another AIN channel. PA0 on the F4 Discovery is connected to the User Button.

BMoha.19.45
Associate II
April 6, 2019

I added the while loop and also change the channel to channel 1, but the same :pensive_face:

S.Ma
Principal
April 6, 2019

Just for sanity, remove your potentiometer and disconnect PA0 from your HW board.

Then, activate the pull-up resistor and check the ADC converted value.

Rince and repeat with only pull-down

Rince and repeat with both pull-up and down.

If all above returns values from ADC which looks like it is indeed ok, then the chosen terminals of your potentiometer might be the wrong ones (check with ohmmeter).

BMoha.19.45
Associate II
April 6, 2019

I will surely try.

Vangelis Fortounas
Associate II
April 8, 2019

PA0 is connected to user button and is pulled down by a series of resistors.

Check also in your code that this pin is not configurated from somewhere else eg as SYS_WKUP

BMoha.19.45
Associate II
April 8, 2019

Thank you for your answer. The interesting thing is that when I change the above code for PinA1 the same happens :(

S.Ma
Principal
April 8, 2019

Review the board schematics which we don't have.

In debug mode, look at the HW peripheral registers carefully and find out what's wrong manually playing the registers.

BMoha.19.45
Associate II
April 11, 2019

Thank you very much. I did it and noticed one interesting thing.

ADC1->CR2 |= ADC_CR2_SWSTART_Msk; //Start convertion

By this line, I start the conversion. However, in order to start conversion the SWSTART bit of this register should be one. By this line of code I want to make it one. But, interestingly, it does nothing. It doesn't change the content of the register. Before this line of code the register value was 0x00000003 and after it should be 0x40000003, but it stays the same. I don't know why this happens? :sad_but_relieved_face:

Vangelis Fortounas
Associate II
April 12, 2019

This bit clears by HW as soon as the conversion starts.

It is impossible to observe this transition (or to record it) with STLink onboard debugger.

By the way i don't see if GPIOA's. clock is enabled.