Forum: Mikrocontroller und Digitale Elektronik STM32F2 ADC auslesen


von Max S. (maximus-minimus)


Lesenswert?

Hallo,
ich bekomme hier immer 0 angezeigt..ich sehe auch irgendwie nicht, wo 
ich eigentlich den Kanal wähle?!
1
ADON_bit :=1; // ADC on/off
2
 CONT_bit :=1; // use continius measurement
3
 ADC1_CR1  := %00000010000000000000000000000000;
4
 ADC1_CR2  := %01000000000000000000000000000011;
5
 ADC1_SQR1 := %00000000000000000000000000000000;
6
 ADC1_SQR3 := %00000000000000000000000000000000;
7
 //ADC1_SMPR1 := %0000000000000000000000000000000;
8
 //ADC1_SMPR2 := %0000000000000000000000000000000;
9
 SWSTART_bit := 1; //start conversion
10
 while EOC1_bit = 1 DO nop;
11
 value := ADC1_DR;

Ich suche hier ab Seite 212
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00225773.pdf

von Max S. (maximus-minimus)


Lesenswert?

ich vermute es müssen diese SQR Register sein, aber von SQR1-3 welche 
muss ich da schreiben um z.B. Kanal zwei lesen zu können?

von Dr. Sommer (Gast)


Lesenswert?

Die verwendeten Kanäle sind in den SQR Registern einzustellen. Du 
verwendest also nur Kanal 0. Hast du den Pin überhaupt auf Analog 
gestellt? Wenn nicht, ist es kein Wunder dass immer nur 0V gemessen 
werden.
Deine anderen Register habe ich jetzt nicht überprüft, da das 
rumfrickeln mit einzelnen Bits mit zu lästig ist. Hättest du symbolische 
Konstanten statt endloser Folgen aus 1en und 0en verwendet, wäre das 
vielleicht anders. Ist außerdem nicht ADON und CONT teil von CR2, 
welches du danach direkt wieder überschreibst? Was ist das überhaupt für 
eine Sprache, Pascal?

von Max S. (maximus-minimus)


Lesenswert?

habs gerade nochmal überprüft und mit
GPIO_Analog_Input(@GPIOA_BASE, _GPIO_PINMASK_ALL);
sollte dasja eingeschaltet sein

von Max S. (maximus-minimus)


Lesenswert?

ja überschreibe ich wieder..ich meine irgendwo stand das immer 32Bit 
geschrieben werden müssen und die nicht einzeln eingestellt werden 
dürfen..zwecks Versuche ist das halt noch drin

von Max S. (maximus-minimus)


Lesenswert?

habe das gerade noch ergänzt..ohne erfolg...
   GPIO_Clk_Enable(@GPIOA_BASE);
GPIO_Config(@GPIOA_BASE,
            _GPIO_PINMASK_All,
            _GPIO_CFG_MODE_ANALOG or _GPIO_CFG_PULL_NO);

von Max S. (maximus-minimus)


Lesenswert?

aahh..
wenn ich
 while EOC1_bit = 0 DO nop;

dann passiert nichts mehr..er meldet also nie das EOC1 =1 wird...wo 
liegt hier mein Fehler?

von Max S. (maximus-minimus)


Lesenswert?

muss EXTSEL 0..3 auf einen Timer oder externe eingestelltw erden damit 
er überhaupt angestoßen wird? Läuft der ADC nicht auch so immer durch?

von Max S. (maximus-minimus)


Lesenswert?

Ich habe gerade irgendwo gelesen, das der DMA ebenfalls noch 
eingeschaltet werden muss etc....
Gibt es irgendwo in dieser bekloppten STM32F2 Doku eine genaue 
Auflistung was alles benötigt wird, um einzelne Peripheri zu benutzen?!?

Beim XMega ist das gnaze auch ohne umfangreiche Doku um Welten 
einfacher!

von Martin (Gast)


Lesenswert?

Du musst in die Sequenz Register an Stelle 0 den Kanal einstellen, der 
erste Kanal ist meißt im SQR3 Register, dann die Anzahl der zu messenden 
Kanäle auf 1 stellen und die Wandlung starten.

von Max S. (maximus-minimus)


Lesenswert?

das mit dem SQR3 Register hatte ich schon erfolglos versucht, da hatte 
ich schon einsen eingetragen und auch auf nur eine Messung eignestellt

von Martin (Gast)


Lesenswert?

Versuch mal:


 ADC1_CR2  := 0x01;  // enable ADC1
 ADC1_SMPR2 := 0x04; //41.5 cycles sample time
 ADC1_SQR3 := 0x00; // 0x00=Kanal0, 0x01 = Kanal1, ...

 ADC1_CR2  := 0x01; //start conversion
 while EOC1_bit = 1 DO nop;
 value := ADC1_DR;

von Max S. (maximus-minimus)


Lesenswert?

neee, kein Unterschied..immer 0 :-(
Es scheint also tatsächlich der DMA oer was noch eingeschaltet werden zu 
müssen..nur gibt es dazu nirgend von STM eine Art Ablaufplan?!
Was in welcher Kombination und Reihenfolge eingeschaltet und 
Initialisiert werden muss!?!

von Max S. (maximus-minimus)


Lesenswert?

ahh..so passiert jetzt was..scheint aber nach der zweiten oder sritten 
messung einzufrieren
 //ADON_bit :=1; // ADC on/off
 //CONT_bit :=1; // use continius measurement
//  RCC_APB2ENR:=  //ADC CLK activate   ADC1EN_bit :=1;
//  RCC_APB2LPENR := //
ADC1LPEN_bit:=1;
 RCC_AHB1ENR:=%00000000011000000000000011111111;//DMA1EN_bit :=1;
 RCC_AHB2ENR:=%00000000000001110100011100000011;//ADC1EN_bit :=1;
 ADC1_CR2  := %00000000000000000000000100000011;
 ADC1_CR1  := %00000000000000000000000000000000;
 ADC_CCR  :=  %00000000110000010000000000000000;
 ADC1_SQR3 := %00000000000000000000000000000001;
 //ADC1_SMPR1 := %0000000000000000000000000000000;
// ADC1_SMPR2 := %0000000000000000000000000000000;
ADC1_CR2  := %01000000000000000000000000000011;

 while EOC1_bit = 0 DO nop;
 //delay_ms(1);
 value := ADC1_DR;

von Martin (Gast)


Lesenswert?

Also DMA brauchst du nicht.
Und du schreibst:

ADC1_CR2  := %01000000000000000000000000000011;

Die Conversion startest du nicht mit dem 30ten Bit, das SWSTART Bit ist 
nur, wenn du es auf "externen Trigger" einstellst. Ganz Normal das ADON 
Bit auf 1 setzen, also

ADC1_CR2  := %00000000000000000000000000000011;

von Erik S. (erik_s)


Lesenswert?

Ist der Clock für den ADC in RCC_APB2ENR aktiviert? Daran hatte ich auch 
mal nicht gedacht und viel Zeit mit "an der falschen Stelle suchen" 
zugebracht.

von Max S. (maximus-minimus)


Lesenswert?

also wenn ich bit 30 von cr2v nicht setzte kommt er über die while 
schleide nicht weg..startet valso scheinbar doch nicht...
ja, hatte
RCC_AHB2ENR:=%00000000000001110100011100000011;
versucht.aber auch ohne diese Zeile läuft es jetzt eine Zeitlang wenn 
ich
ADC_CCR  :=  %00000000000000110000111100000000;
verwende..das ganze läuft jetzt ca 3 Sekungen und dann scheint er 
abzustürzen..bzw friert ein..die Takte sollten aber eigentlich stimmen, 
habe die teiler auf 8 in de Microe Software steheh bei 120MHz

von Martin (Gast)


Lesenswert?

Also im Datenblatt steht, dass der ADC nach dem ersten Einschalten erst 
eine gewisse Zeit bis zur ersten Wandlung braucht. Versuch mal erst den 
ADC einzuschalten, dann etwas zu warten und dann die Wandlung zu starten 
mit dem ADON Bit.

von Martin (Gast)


Lesenswert?

OK, das Bit 30 wird wohl doch gebraucht, ich hatte beim f103 geschaut, 
da ist es anders.

von Max S. (maximus-minimus)


Lesenswert?

hab ich auch schon alles :-(
So siehts jetzt aus..läuft halt einige Sekunden und friert dann ein..

einmaliger Aufruf
   ADC1EN_bit :=1;
  ADON_bit :=1; // ADC on/off
  delay_ms(100);


innerhalb der schleife
CONT_bit :=1; // use continius measurement
 ADC1_CR2  := %00000000000000000000000100000011;
ADC_CCR  :=  %00000000000000110000111100000000;
 ADC1_SQR3 := %00000000000000000000000000000001;
ADC1_CR2  := %01000000000000000000000000000011;
delay_ms(1);
 while EOC1_bit = 0 DO nop;
 value := ADC1_DR;

: Bearbeitet durch User
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.