Forum: Mikrocontroller und Digitale Elektronik Probleme mit STM32F107 ADC


von Patrick (Gast)


Lesenswert?

Hallo zusammen,

ich sitze gerade vor einem Problem mit meinem STM32F107. Ich möchte über 
PB06 ein Potentiometer einlesen. Je nachdem welchen Wert dieses liefer, 
soll entweder die eine oder die andere eingeschaltet werden. Leider 
stelle ich bei Debugger immer wieder fest, dass an dem entsprechenden 
Eingang nichts ankommt.

Hat jemand einen Tipp wo der Fehler liegt?

Hier Mein Quellcode:


#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include<stm32f10x_adc.h>

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

int main(void){
  GPIO_einschalten();
  ADC_einschalten();
  double poti = 0;
  poti = ADC_GetConversionValue(ADC1);



  if (poti > 2048){
  GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);
  }

  else{
    GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);
  }
while(1){
}
}



void GPIO_einschalten(void){

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_10;
GPIO_Init(GPIOC, &GPIO_InitStructure);



}

void ADC_einschalten(void){
  GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | 
RCC_APB2Periph_ADC1, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, 
ADC_SampleTime_1Cycles5);

  ADC_Cmd(ADC1, ENABLE);

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

von Patrick (Gast)


Lesenswert?

Hallo zusammen,

ich sitze gerade vor einem Problem mit meinem STM32F107. Ich möchte über 
PB06 ein Potentiometer einlesen. Je nachdem welchen Wert dieses liefer, 
soll entweder die eine oder die andere eingeschaltet werden. Leider 
stelle ich bei Debugger immer wieder fest, dass an dem entsprechenden 
Eingang nichts ankommt.

Hat jemand einen Tipp wo der Fehler liegt?

Hier Mein Quellcode:


#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include<stm32f10x_adc.h>

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

int main(void){
  GPIO_einschalten();
  ADC_einschalten();
  double poti = 0;
  poti = ADC_GetConversionValue(ADC1);



  if (poti > 2048){
  GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);
  }

  else{
    GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);
  }
while(1){
}
}



void GPIO_einschalten(void){

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_10;
GPIO_Init(GPIOC, &GPIO_InitStructure);



}

void ADC_einschalten(void){
  GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | 
RCC_APB2Periph_ADC1, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, 
ADC_SampleTime_1Cycles5);

  ADC_Cmd(ADC1, ENABLE);

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

von Patrick (Gast)


Lesenswert?

Entschuldigt bitte die schlechte Ausdrucksweise, war zu schnell getippt:

Gemeint ist, dass ich entweder die eine oder die andere LED einschalten 
möchte.

Und beim Debuggen sehe ich, dass der Wert von Poti immer auf 0 ist.

von hp-freund (Gast)


Lesenswert?

Also:

1. double poti? Ich gehe davon aus das die Funktion danach kein double 
ausgibt.

2. Du möchtest PB6 einlesen? Im code steht PB5.
Das ist aber leider auch kein ADC Eingang.

3. der ADC, wenn er dann funktionieren würde, wird nur einmal 
aufgerufen.
Sollte der evtl. in die Schleife?

4. ist evtl. CubeMX eine Option?

von Patrick (Gast)


Lesenswert?

Hi,

bin was uC angeht noch relativ neu. Habe bisher nur mit Arduino 
experimentiert und wollte mich jetzt mal an einen richtige uC wagen.



Wie finde ich denn raus, welche Eingänge ADC Eingänge sind? Ich konnte 
im Datasheet dazu nichts finden.

Das er erstmal nur einmal aufgerufen wird ist okay.

Cube ist doch mehr so ein grafisches zusammen klicken der gewünschten 
Funktionen oder sehe ich das falsch? Wollte wenn schon richtig 
programmieren.

LG

Pat

von hp-freund (Gast)


Lesenswert?

Patrick schrieb:
> Wollte wenn schon richtig programmieren.

Na dann mal los ;-)

Im Datenblatt:
http://www.st.com/content/ccc/resource/technical/document/datasheet/e4/f3/1a/89/5a/02/46/ae/CD00220364.pdf/files/CD00220364.pdf/jcr:content/translations/en.CD00220364.pdf

ab Seite 27 gibt es eine schöne Tabelle über die Möglichkeiten der Pins.

von Patrick (Gast)


Lesenswert?

Hi,

danke für den Tipp mit dem falschen Pin, weiß jetzt woran es lag und nun 
läuft es :-)

LG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.