Ich verwende einen STM32F103 auf einem Olimex STM32-H103 Board. Der gleiche uC soll in meiner Hardware Verwendung finden; ich teste momentan die verschiedenen Funktionen des uC um den Schaltplan für meine Hardware zu erstellen. Ich habe jedoch Probleme mit der Genauigkeit des 12-Bit ADC. Es soll ein 10K Potentiometer ausgelesen werden. Ich bekomme eine Genauigkeit von 7 Bit. Ich benötige 8 Bit Genauigkeit, min 9 Bit sollten als Sicherheit drin sein. Laut Schaltplan(*) hat das Board einen Low-Pass Filter vor VDDA. Die Spannung (VDDA/VSSA) ist sehr stabil, VDD/VSS ist ebenfalls stabil. Selbst direktes Verbinden von VDDA mit dem ADC input gibt mir nur eine Genauigkeit von 10 Bit. Der STM32 hat wohl low impedance inputs, ob das das Hauptproblem darstellt? Ich habe einen OPA2350 bestellt, der sich auf dem Weg zu mir befindet, den ich als simplen 3.3V single supply rail-to-rail Voltage Buffer nutzen werde. Was habt Ihr noch für Tricks auf Lager, um aus dem STM32 ADC mehr Genauigkeit herauszukitzeln? * http://www.olimex.com/dev/images/ARM/ST/STM32-H103-sch.gif
Ich verwende die maximalen (239.5uS) Samplezeiten, da die ADC inputs damit hochohmiger werden. Bin mir aber nicht hunderprozentig sicher, dass es an den niedrigohmigen ADC Eingängen liegt...
Ein 10k-Poti hat maximal eine Quellimpedanz von 5k (Mittelstellung). Das ist niederohmig genug, um den AD-Eingang des Controllers in seinen Specs zu betreiben. Es ist nicht notwendig eine so große Samplezeit zu wählen. Schau mal nach, ob eventuell noch ein Pullup aktiviert ist. Du kannst auch einfach mit einem Multimeter die Spannung des Pins gegen VCC und gegen GND messen. Aus dem Eingangswiderstand des Multimeters und der gemessenen Spannung kannst Du den Strom berechnen, der aus dem Portpin fließt. Er sollte nicht höher sein als der im Datenblatt angegebene Leckstrom. Wenn das passt, liegts an der Software. Mit einem Oszi (am AD-Eingnangspin) würde man die Einbrüche beim Abtasten sehen.
Hi, ich habe hier 3 Demo Boards vom STM32, sowie ein Selbsthergestelltes und bei keinen der 4 Boards habe ich solche Ungenauigkeiten. Nur das LSB wackelt. Zeig doch mal deine ADC Routinen. Schaltest du den ADC ein und machst sofort ne Messung ? Dann kannst du nämlich die erste Messung getrost vergessen. Falls dem so ist schmeiss die erste Messung weg und starte eine 2te, die sollte dann stimmen. Gruß
Ich habe mal ein Minimalbeispiel zusammengestellt, mit dem das Verhalten reproduzierbar auftritt:
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); |
2 | ADC_DeInit(ADC1); |
3 | RCC_ADCCLKConfig(RCC_PCLK2_Div6); |
4 | |
5 | GPIO_InitTypeDef GPIO_InitStructure; |
6 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; |
7 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; |
8 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
9 | GPIO_Init(GPIOA, &GPIO_InitStructure); |
10 | |
11 | ADC_InitTypeDef ADC_InitStructure; |
12 | ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; |
13 | ADC_InitStructure.ADC_ScanConvMode = DISABLE; |
14 | ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; |
15 | ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; |
16 | ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; |
17 | ADC_InitStructure.ADC_NbrOfChannel = 1; |
18 | ADC_Init(ADC1, &ADC_InitStructure); |
19 | |
20 | ADC_Cmd(ADC1, ENABLE); |
21 | |
22 | ADC_ResetCalibration(ADC1); |
23 | while (ADC_GetResetCalibrationStatus(ADC1)); |
24 | |
25 | ADC_StartCalibration(ADC1); |
26 | while (ADC_GetCalibrationStatus(ADC1)); |
27 | |
28 | ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, |
29 | ADC_SampleTime_239Cycles5); |
30 | |
31 | for (;;) { |
32 | ADC_SoftwareStartConvCmd(ADC1, ENABLE); |
33 | while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); |
34 | uint32_t v = ADC_GetConversionValue(ADC1); |
35 | __show(v); |
36 | }
|
Der oben erwähnte voltage buffer hat rein gar nichts gebracht. Die Spannung zwischen AD-Eingangspin und VCC und zwischen AD-Eingangspin und GND ist mehr als ausreichend (>=12 bit) konstant.
Bist Du dahinter gekommen , wie das Geräusch enstanden ist? Meine Erfahrung war ähnlich. Mehrere kommerzielle Platten sowie eine selbst gebaute zeigten Genauigkeiten < 10 bit. Die selbst gebaute Karte hatte viele Filter angehängt. Meine Vermutung ist RFI Verseuchung, denn ein Versuch ausserhalb der Stadt brachte fast 12 bits.
Hi Gregory. Nein, ich habe das ungeklärte Problem nach hinten geschoben, da sich die Funktionalität vorerst auch anders realisieren ließ. Ich werde aber, wohl in den nächsten Tagen, den ADC des STM32F103 für eine andere Funktionalität testen müssen, die definitiv nicht anders gelöst werden kann und die als Letztes auf der Liste der Entwicklung der Hardware steht. Ich werde dann wieder berichten.
Layout und Versorgungs/Referenzspannungs Pufferung spielen eine entscheidende Rolle. Zur Pufferung ist 10uF//0,1uF X7R ,so nah wie irgendwie möglich an den Versorgungspins, kein Luxus. Auch eine getrennte Verorgung des ADC macht Sinn.(Da allerdings gegenparallel Dioden zwischen analog und digital Versorgung vorsehen). Weiters bilde ich unmittelbar vor dem ADC-Pin einen TP (je nach Frequenz) mit einem möglichst grossen C. Damit sollte eine Auflösung bis zum letzten Bit möglich sein. Grüsse
Hallo, genau bitte nicht PA0 benutzen, Errata sheet lesen. Ich bekomme saubere 12 Bit von dem Wandler, allerding auch nur mit Oversampling und DSP-Filter. Wenn langsame Signale gewandelt werden, setz doch mal 100nF nach Masse. Der AD-Wandler zieht das Eingangspotential nach Vref/2. Soll es also von 0...4095 linear sein braucht man einen OP dafor. z.B. MCP6051 oder MCP6071 also RTR OP. Habe im moment nur noch Probleme mit Funkeinstrahlungen auf den STM32F, dann spinnt der AD-Wandler total. Gehe aber am Wochenende in ein HF-Labor mal sehen wo das Problem liegt. Gleiches Problem tritt auch auf wenn der MCO Ausgang aktiv ist. Dann verseucht der Chip sich quasi selber..... Gruß Sascha
Hallo, hat einer von euch zufällig Erfahrungen mit dem STM3F_ARM_KIT(STM32F107VC) was Steinert verkauft? Ich habe hier gerade mal ST Beispiele und eigene ADC Beispiele geschrieben und meine Abweichungen liegen bei mehr als 6 Bit (bei genutzter 12 Bit Auflösung und momentant zu messender Gleichspannung). Gibt es zu empfehlende externe ADC Alternativen wenn der STM sich doch als übermäßig empfindlich herausstellen sollte? Gruß Marcus
Hallo Marcus, also der AD-Wandler ist auch bei einem 103 Typ schon nicht gut. Da meine Signale aber recht langsam sind (Spannung, Temperatur usw), mache ich 128faches Oversampling, dann sieht es besser aus. Habe nun seit ca. 15 Jahren Erfahrung gesammelt mit den Mikrokontrollern was AD-Wandler betrifft. Es ist immer sehr schwierig alles auf einem Waver sauber hinzubiegen. Meine besten Erfahrungen habe ich mit Analog Device Kontroller gemacht. Auch der AVR (ATxmega) Kontroller hat da seine Probleme. Wenn also jedes Sample so ca. mit 1 lsb Error sein soll ist ein externel AD-Wandler über SPI oder Parallel die beste Lösung. Zur Zeit habe ich auch das Gefühl die Chips werden immer schlechter statt besser..... (oder Die Datenblätter mit der Marketingabteilung immer besser) Jedoch ist die Wahl zu einem STM32F107VC sicherlich bei der Performance und Preis sehr gut. Also externer AD-Wandler suchen bei bedarf. Gruß Sascha
Hallo, ich beschäftige mich auch gerade mit dem Stm32 und hab da mal eine Frage: Wie hochohmig sind die ADC-Eingänge wenn diese mit einen 100n Kondensator abblocke und alle 20ms eine Wandlung mache? Wollte wie ich es bei den AVR gemacht habe einen RC-Filter (100k+100n)vorsehen gegen Störung und Spannungsspitzen. Brauche ich dafür dann einen extra OV oder muß ich das ganze niederohmiger ausführen? @Sascha "Zur Zeit habe ich auch das Gefühl die Chips werden immer schlechter..." Bei kleiner werdenden Chipstrukturen scheint es schwieriger zu werden die Analog-Komponenten sauber und ohne große Parameterstreuung hinzubekommen. Bei Digital muss jeder Transistor nur sauber schalten.
Hallo Torsten, also ich habe als max. so 1K bis 3K6 herausgefunden. Kommt immer darauf an, wie viele LSBs Error man zulassen möchte. Bei 1K knapp unter 1 LSB , bei 3K6 1 bis 2 LSBs. Allerdings mit permanenter Abtastung so bei 70KHz, da ein DSP Filter bei mir mitlauft. Habe die ATxmega auch getestet sind aber noch viel schlechter, kommt aber ein neuer Typ raus (wohl eine überarbeitete Version). Wenn du etwas geniales für extern brauchst, Semtech SX8724. Oder mit CPU Analog Device ADuC8xx oder ADuC7xxx. Hat jemand mit dem EFM32 Typen bezüglich des AD-Wandlers Erfahrung ? Gruß Sascha
Hi, also erstmal: Torsten R. schrieb: > "Zur Zeit habe ich auch das Gefühl die Chips werden immer schlechter..." Oder die Entwickler / Benutzer immer schlechter ;-) Torsten R. schrieb: > Wie hochohmig sind die ADC-Eingänge wenn diese mit einen 100n > Kondensator abblocke und alle 20ms eine Wandlung mache? Die ADC Eingänge sind laut Datenblatt maximal 1k, bei sampling. Der max. Eingangswiderstand errechnet sich für 1/4 LSB Fehler: Rain = (Ts / (Fadc x Cadc x ln(2^(N+2))) - Radc; für N=12; Fadc = Clock des Adc'S; Cadc = ca. 8pF; Radc = ca 1kOhm Diese Rechnung gilt natürlich nur ohne zusätzlichen Kondensator vorm ADC Eingang, ansonsten erhöht sich natürlich C. Zu beachten ist bei einem Tiefpassfilter vorm ADC natürlich auch TAU (=R*C). Wobei man theoretisch annehmen kann, das der Kondensator nach 5 TAU ca. 99% voll ist. Sascha schrieb: > Hallo Torsten, also ich habe als max. so 1K bis 3K6 herausgefunden. > Kommt immer darauf an, wie viele LSBs Error man zulassen möchte. > Bei 1K knapp unter 1 LSB , bei 3K6 1 bis 2 LSBs. Naja da biste ja auch an der Grenze mit 1k und 100n bei 70kHz. GRUß
@Sascha Ziehen die ADC-Eingänge nur während der Messung Strom? Wollte gern RC-Filter an die Eingänge schalten. Die Werte ändern sich nur langsam. Jede Störung die ich vom MC fernhalte brauche ich hinterher nicht mittels Software unterdrücken. Externe Komponenten wollte ich eigentlich nicht extra verbauen. Wie zeitaufwendig war bei dir der Umstieg vom AVR auf den STM32? Habe mir den Primer2 und RLink geholt. Meine Entwicklungsumgebung ist Ride. Habe mir das Referenz Manuell des STM32 heruntergeladen. Die Timer des STM32 sind aber ganz schön komplex. Die Hardwarebeschreibung geht ja über min. 100 Seiten. Im Moment kämpfe ich noch mit den Layout 0.5mm Pin-Abstand. Werde die Platine wohl nicht mehr selber nach der Toner-Methode herstellen können...
Hallo Torsten, also der Umstieg von ATxmega also AVR auf STM32F kann ich so nicht sagen das er Zeit in anpruch nimmt, die Einarbeitungszeit auf eine Hardware ist immer von der Qualität der Manuals abhängig. Leider finde ich die bei ST nur mittelmäßig gut, weil alles etwas verrissen ist, ich bin ständig nur am suchen, und dass auch noch über 3 verschiedene PDFs. Die ADCs ziehen nur Strom bei einer aktiven Wandlung am jeweiligen Eingang. Der Wandler hat halt keinen Eingangsbuffer, dafür kommt er auf saubere 0V runter. Die Stromaufnahme ist beim STM32F halt etwas höher als beim ATxmega. Ich will den STM32L in den kommenden Wochen dazu mal testen. Leiterplatten mit 0.5mm Pitch mit der Toner Methode d.h. Laserprinter macht kein Spass mehr, dazu einfach einen guten PCB-Pool suchen. Noch eine Anmerkung zu den Störungen, wenn ich eine 144 Pin CPU nehme, habe ich bestimmt immer viel dran, und somit ist es leider unumgänglich Störungen fern zu halten. STM32F und Timer, ja habe ich auch schon gelesen finde einiges recht schwerverständlich zumindest am Anfang.
Ich bin echt schwer am Überlegung ob ich für mein aktuelles Projekt auf den STM32 umschwenke. 0.5mm für Follienleitersteckverbinder gehe noch einigermaßen aber ein kompletter 100piniger MC!? Mein geplantes Projekt ginge zwar mit dem ATMega64 mit ein paar Tricks auch noch. Ist aber ein wenig fricklich mit den 4K Ram und einen 240x128 Grafikdisplay. Müßte das Display in zwei Teilen beschreiben um mit 2K Bildbuffer auszukommen. Meine Menüausgabe zwei teilen!? Performance ist mit geschätzten 36ms für die Displayausgabe immer noch um Welten schneller als das LCD selber (min. 200ms Pixelwecksel) Layout und Software sind für den ATMega64 zu 70% fertig. Der ATMega64 würde mir bestimmt min. 2 Wochen Einarbeitung sparen und noch mal 10 Arbeitstage weil ich die Prototypenplatine noch selber machen kann. Bin zwar dann mit den Erdweitermöglichkeiten und Rechenpower ein wenig eingeschränkt. Wie gesagt der Mega ist fast bis aufs letzte Kontrollregister ausreizt. zbp. Timer1: Counter ist freilaufend für 8x Drehzahlmessung und zur Gewinnung von 3 unterschiedliche Zeittakte(20ms,100ms,1s) mittels Compare-Registers Was die Verständlichkeit der Manuals angeht fand ich die der AVR leicht verständlich. Man konnte das ganze dann noch im Simulator Schritt für Schritt überprüfen und dem MC beim arbeiten zusehen. Bei der Funktionsvielfalt des STM32 ist alles so verstreut selbst im Ref.-Manuals. Zum Glück gibt es noch Beispielcode für die STM32-Lib.
> Bei der Funktionsvielfalt des STM32 Tja genau das macht es eben nicht einfacher das zu beschreiben. Die AVRs sind da schon deutlich simpler.
... oder halt EFM32 (www.energymicro.com): max 350µA bei 12Bit und 1MSamples/s.. STK bestellen(inkl. IAR) Simplcity Studio herunterladen glücklich sein! Einfacher geht's nicht. Ich gebe zu, ich bin mittlerweiler ein Gecko-Fan! :-) Grüß TK
Hallo Tante Käthe, wie gut ist der ADC des EFM ? Um wieviele lsbs springt und hüpft der ? Gruß Sascha
Siehe http://www.energymicro.com/downloads/datasheets DNL Differential non-linearity(DNL) ±0.7 LSB INL Integral non-linearity (INL), End point method ±1.2 LSB MC (No missing codes): Min: 11.9991 Typical:12 bits Mehr Details dazu im Datenblatt. Gute Nacht TK
hallo, benutze p107 von olimex und kann o.g. 7 bit bestätigen...wenn man die beispiel-codes von olimex/stm/Ronald Macdonald verwendet. bei dma+ADC_InitStructure.ADC_ContinuousConvMode = ENABLE (!); sehe ich nur noch +/-3 lsb...warum auch immer...mit oversampling krieg ich sauber 0 nun meine frage: schalte ich gpio (z.b. 3 leds) wirds mehr, bis zu 10 lsb. ext stabile V ist da. bin kein elektroniker, woran kanns liegen? ich will exteren MAX etc vermeinden gruss rudi
Du verwendest bei den Tests keine anderen GPIOs, nur den ADC? +-0 würde ich -trotz oversampling- nicht trauen. ;) Die Ungenauigkeiten liegen zum Teil am Chip und zu Teil am Board-Layout. Ich habe es mittlerweile getestet auf einem Olimex STM32-H103, zwei WaveShare Boards (103 und 105), und diversen anderen. Ich habe das ursprüngliche Problem mehr oder weniger umgangen, indem ich die zu messende AC-Spannung vorher gleichrichte und vom mcu über ein digitales Potentiometer periodisch in Abhängingket der Wellenform variabel skaliere, das ganze wird dann digital wieder rekonstruiert. Ich kämpfe also um jedes Bit. Ich möchte Euch übrigens auf den STM32F37x aufmerksam machen. Endlich ein Cortex-M3/4 von ST mit 16-Bit SD-ADC. Damit hat sich das Problem dann -zumindest für meine Anwendung- wahrscheinlich erledigt und ich kann für Revision 3 die ganze ADC-Peripherie wieder aus dem Schaltplan kicken.
>> Du verwendest bei den Tests keine anderen GPIOs, nur den ADC? bei dem 0/+-1 test kein gpio, später (mit den abweichungen) schon >> +-0 würde ich -trotz oversampling- nicht trauen. ;) wir reden hier von knackigen 100 Hz für eine PID temperatur steuerung bei der es um leben und tod geht ;) >> Ich habe das ursprüngliche Problem mehr oder weniger umgangen, indem >> ich die zu messende AC-Spannung vorher gleichrichte und vom mcu über >> ein digitales Potentiometer periodisch in Abhängingket der Wellenform >> variabel skaliere, das ganze wird dann digital wieder rekonstruiert. davon verstehe ich leider nix / klingt irgendwie chinesisch >> Ich kämpfe also um jedes Bit. me too >> Ich möchte Euch übrigens auf den STM32F37x aufmerksam machen. Endlich >> ein Cortex-M3/4 von ST mit 16-Bit SD-ADC. Damit hat sich das Problem >> dann -zumindest für meine Anwendung- wahrscheinlich erledigt und ich >> kann für Revision 3 die ganze ADC-Peripherie wieder aus dem Schaltplan >> kicken. effektive bits sind dann wieviele ?
bump - einmal nur, versprochen andererseits, vieleicht hat RONALD MACDONALD einen ganz höchstpersönlichen suchfilter ? wer weiss andere hinweise bzgl. eingebauter adc probleme sind auch willkommen
sample-rudi schrieb: >>> Du verwendest bei den Tests keine anderen GPIOs, nur den ADC? > > bei dem 0/+-1 test kein gpio, später (mit den abweichungen) schon > >>> +-0 würde ich -trotz oversampling- nicht trauen. ;) > > wir reden hier von knackigen 100 Hz für eine PID temperatur steuerung > bei der es um leben und tod geht ;) Ursprünglich bin ich mit dem Problem in Kontakt gekomnen, beim Auslesen eines motorisierten Potentiometers, also sogar ein (meist) konstanter Wert. Aber selbst da hat oversampling nicht (genug) geholfen. > >>> Ich habe das ursprüngliche Problem mehr oder weniger umgangen, indem >>> ich die zu messende AC-Spannung vorher gleichrichte und vom mcu über >>> ein digitales Potentiometer periodisch in Abhängingket der Wellenform >>> variabel skaliere, das ganze wird dann digital wieder rekonstruiert. > > davon verstehe ich leider nix / klingt irgendwie chinesisch > Das ist auch keine schöne Lösung. Eher ein Hack. >>> Ich kämpfe also um jedes Bit. > > me too > >>> Ich möchte Euch übrigens auf den STM32F37x aufmerksam machen. Endlich >>> ein Cortex-M3/4 von ST mit 16-Bit SD-ADC. Damit hat sich das Problem >>> dann -zumindest für meine Anwendung- wahrscheinlich erledigt und ich >>> kann für Revision 3 die ganze ADC-Peripherie wieder aus dem Schaltplan >>> kicken. > > effektive bits sind dann wieviele ? Ich hoffe, die Verantwortlichen bei ST haben aus dem ADC Desaster gelernt. Da der SDADC aber eine komplett unabhängige Spannungsversorgung bekommt, bin ich da optimistisch. Mehr Bits als die 12 theoretisch verfügbaren des normalen ADCs werden es wohl schon sein. Allerdings hat ST mit der Pin-Belegung wieder einen Bock geschossen. Waren bei einem Board Layout, das STM32F1xx und STM32F2xx/STM32F4xx-Bestückung ermöglichen soll, noch zwei Änderungen notwendig (Kondensatoren oder 0-Ohm Widerstand an zwei Pins), kann man nun faktisch nicht mehr von einem kompatiblen Board-Layout sprechen. Es geht (hatte eins fertig, für STM32F1xx, STM32F2xx/STM32F4xx und STM32f3xx), aber Drop-In-Kompatibilität sieht anders aus, so dass ich mich für Rev. 2 (STM32F1xx/F2xx/F4xx) und Rev 3 (STM32F3xx) entschieden habe.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.