STM32F2 ADC auslesen

OP #4140880
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
Gast #4140891
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?
OP #4141330
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!
Gast #4141418
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;
OP #4141563
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;
Gast #4141616
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;
OP #4141648
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
Gast #4141687
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.
OP #4141699
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren