Hallo, folgendes Problem: ich muss im Rahmen meiner Masterarbeit eine Regelung fuer einen Asynchronmotor implementieren. Das Verfahren zur Flussschwaechung und die Regelungsparameter sind soweit bestimmt, dass sich das Modell erfolgreich in Powersim simulieren laesst. Nun kommt aber das Theater mit dem genannten DSP - nicht nur, dass ich in C eine Flasche bin, die Registerbitschubserei (und dann hier im epwm das bit und das da weg und im adc dies und jenes) macht mich einfach nur noch fertig. Ich habe keine Ahnung, ob ich ueberhaupt einen ADC oder oder mehrere aktiviert habe, wie ich die PWM-Ansteuerung richtig mache (inkl. Verhinderung shoot through im VSI), um die 6 Signale (3-Phasen+3invertierte Phasen) zu realisieren. Dann kommt noch die Geschwindigkeitsmessung per capture/Zaehlung dazu, die ich noch weniger kapiere und das alles am besten noch im IQ-Format, damit sich keiner mehr auskennen soll (keiner mehr=ich in dem Fall). Ich habe bei TI Beispiele gefunden, aber die sind fuer die C28-Serie - funktionieren diese beim F28? Schoen waere es, dann muesste ich sie nur noch verstehen.... Oder gibt es irgendwo eine Anleitung fuer Idioten wie mich, wo Schritt fuer Schritt erklaert steht, was man machen muss, um Werte von einem Pin einzulesen und Pulsverhaeltnisse auszugeben? Ich freue mich auf Antworten! noob_
Ist denn das nicht im Datenblatt erklärt? Ansonsten vielleicht mal bei TI im Forum fragen.
Der F28335 ist ein DSP aus der C2000-Reihe (auch C2800, wenn ich mich nicht irre).
Danke fuer die einstweiligen Antworten. Das Problem, Pete, ist, dass ich das Kauderwelsch nicht verstehe, weil ich, wie gesagt zu dumm dafuer bin ;-)
Erich P. schrieb: > Das Problem, Pete, ist, dass ich das Kauderwelsch nicht verstehe, weil > ich, wie gesagt zu dumm dafuer bin ;-) Dann mußt Du entweder einen entsprechenden Lehrgang besuchen oder eine andere Aufgabe wählen. Ich habe allerdings den Eindruck, daß heutzutage zuwenig Grundlagenwissen vermittelt wird. Und es werden teilweise hochkomplexe Aufgaben vergeben, die durchaus 100-e Mannjahre benötigen, wenn man wirklich alles selber machen soll. Man kann dann nur an der äußersten Oberfläche kratzen und per copy&paste irgendwas zusammenschustern. Und hoffen, daß die Prüfer auch nur Bahnhof verstehen. Was der Fall sein dürfte, den wenn sie Bescheid wüßten, wüßten sie ja auch, das das nie ein Anfänger schaffen kann. Kreatives und zielführendes Arbeiten wird damit im Keim erstickt. Ich konnte meine Diplomarbeit noch bis ins kleinste Detail erklären. Peter
@Peter da sagst du was. Wir hatten zwar ein Praktikum darueber, aber Ziel war es einen Tiefsetzsteller zu regeln. Das funktionierte auch, aber irgendwie wusste keiner aus der Gruppe so richtig was er nun entscheidendes gemacht hat, um am Ende ein lauffaehiges Programm zu erhalten. Es lief irgendwie und so konnte es abgegeben werden... kein Teilnehmer war 100%ig zufrieden. Das Problem war, man hat ueber die Haelfte der Zeit damit verbracht, nur per matlab Stabilitaetskriterien zu analysieren - die Parameter haette gegeben sein muessen, da Inhalt anderer Faecher. So haette man sich (fast) das ganze Praktikum mit dem DSP beschaeftigen koennen. Meine Diplomarbeit konnte ich auch noch vollstaendig erklaeren. Es ist schon traurig, aber ich kann auch nicht sagen, dass mir der Master nichts bringt - die Motorregelung ist ein interessantes Thema und ich habe vor allem etwas ueber getaktete Stromversorgungen und deren Konzipierung von der galvanischen Trennung ueber die Regelung bis hin zur Ermittelung realer Komponenten gelernt. Ich behaupte, ich koennte in diesem Fall vom Wandler bis zum VSI (der verwendete ist Thema eines anderen Studenten) alles auslegen, bis auf die Motorelektrik - mechanisch muesste es auch noch gehen :-)
Hallo, ich nerve mal wieder :) Noch eine Teilfrage: Ich habe hier ein paar Beispiele, in denen PWM erstellt wird, jedoch gibt es so nur 2 Ausgangsports, T1PWM und T2PWM, die relativ einfach mit den T1/2CMP und T1/2PR-Registern Also muss ich irgendwie anders 6 Signale herbekommen. Ich schaetze, die GpioMuxRegs muss ich so einrichten: EALLOW; GpioMuxRegs.GPAMUX.all=0x0; GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA_0=1; ... GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA_5=1; GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIO8=1; GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIO9=1; GpioMuxRegs.GPAMUX.bit.CAP3QI1_GPIO10=1; EDIS; Wie erzaehle ich nun diesen Ausgaengen, dass sie von T1 abhaengen sollen, damit 3 cmp und t1cnt Signale auf PWM1..3 (active low) und die entsprechend invertierten Signale auf PWM4..6 (active high) ausgeben? Wie rufe ich die Ergebnisse der capture-units auf? Vielleicht weiss das ja jemand. Gru/3 noob_
Hallo Erich, ich schreibe auch gerade meine Masterarbeit, mit einer ähnlichen Aufgabenstellung, aber dem selben DSC. Am Anfang (also vor 2 Monaten) hatte ich ähnliche Startschwierigkeiten. Aber mittlerweile funktioniert die Regelung, die CAN-Anbindung und der Schaltplan mit der Schnittstelle zwischen Wechselrichter, Motor und DSC ist auch fasst fertig. Für den Start ist es wichtig wirklich die Beispiele akribisch genau durchzuarbeiten (und jedes Datenblatt auszudrucken und neben sich zu legen). Dein Problem ist, dass du noch nicht verstehst wie die einzelnen Register der ePWM-Einheit zusammenwirken. Du hast 6 ePWM-Einheiten, die unabhängig voneinander konfiguriert werden können. PWM1A-PIN (GPIO0) und PWM1B-PIN (GPIO1) werden von der ePWM-Einheit 1 bedient. PWM2A-PIN (GPIO2) und PWM2B-PIN (GPIO3) werden von der ePWM-Einheit 2 bedient, usw. Du kannst die Timer jeder einzelnen ePWM-Einheit mit unterschiedlichen Registerwerten „füttern“. Stellst du die Timerwerte (Timer-PRD) jeweils gleich ein, erhältst du die gleichen Periodendauern. Du musst also nun ePWM-Register 1, 2, & 3 verwenden. Timer PRD jeweils gleich einstellen, aber die Counter Compare (CMPA.half & CMPB) mit unterschiedlichen Werten füttern um die Duties jedes Pins zu Variieren. Wenn du möchtest stelle ich mal ein Minimalbeispiel rein, aber ich würde dir dringend raten die Beispiele erst einmal in Ruhe durchzuarbeiten. Lange Rede, fasst kein Sinn. Viel Erfolg und lass dich nicht unterkriegen. Viele Grüße Chris
Zu jedem Modul im C28 gibt es ein sog. Reference Guide. Für den F2809 und das ePWM ist das z.B. spru791, für den 28335 ist es ein anderes. Erfahrungsgemäß sollte man das komplett lesen, wenn man etwas von dem Modul verwenden möchte. Nach dem ersten Durchlesen hat man einen Überblick darüber, was das Modul kann. Dann überlegt man sich, in welcher Betriebsart man das betreiben möchte und ließt die dazugehörigen Teile nochmal. Nachdem man sich die entsprechenden Blockschaltbilder ausgedruckt hat und per Textmarker die beabsichtigten Pfade nachgezeichnet hat und die Konfigeinstellungen dazugeschrieben hat, springt man zu den Teilen, wo die Registerfunktionen beschrieben werden. Dann kann man anfangen zu Programmieren. Für die meisten Standardanwendungen gibt es auch Initialisierungsbeispiele. Für 3-Phasenbrücken im spru791f z.B. ab Seite 83. Wenn man das Reference Guide nicht gelesen hat, darf man auch nicht erwarten, auch nur irgendein einziges Beispiel oder Codeschnipsel verstehen zu müssen. Das Zusammenkopieren von irgenwelchen Teilen aus Beispielen oder Foren macht überhaupt keinen Sinn. Genausowenig macht es Sinn, andere Anleitungen als das Reference Guide zu verwenden, bevor man das nicht gelesen hat. Dass man beim ersten Durchlesen noch nicht alles versteht, ist ganz normal, dann muss man es eben nochmal lesen. Ein C28 ist eben ein paar Hausnummern komplizierter, als die ülichen 8-Bit-er. Man kann an den Modulen Optionen einstellen, von denen man vorher noch gar nicht gewusst hat, dass es überhaupt einen Prozessor gibt, der das in Hardware kann. Demnach nutzt man das auch nur dann optimal aus, wenn man alles verstanden hat und diese Optionen auch einsetzt. Dafür gibt es keine einfache Anleitung, es ist eben so kompliziert. Grüße, Peter
>Nun kommt aber das Theater mit dem genannten DSP...
Es gibt auch andere DSPs, mit einfacherem Aufbau, die das können.
Hallo, danke Euch fuer Euer Interesse. @Chris, danke fuer das Angebot, ich hatte gehofft, dass es vielleicht einfache Beispiele gibt. Oft funktioniert die Seite von TI auch etwas schlecht und da befuerchte(te) ich einfach, irgendetwas verpasst zu haben. Mein Wunsch war es zwar, bis September fertigzuwerden, aber das kann ich wohl knicken. Die Beispiele die du mir schicken koenntest sind reizvoll, doch haette ich gerne "legal", aber auf die einfachste Weise den DSP zu verwenden probiert, sonst bringt es mir wenig :-) (Und was den Termin angeht, kommt sowieso noch eine Schwierigkeit hinzu, da der fuer den VSI zustaendige Absolvent wohl das Handtuch geworfen hat und ich ihn ggf. fertigmachen muss, wenn ich nichts mehr von ihm hoere... also what shalls?) Meine Timer sollten schonmal richtig auf continuous up/down stehen und die Periode muesste 1/20kHz betragen, wenn es mal funktioniert. Nun muss ich mich noch um den ADC und das QEP kuemmern. Es ist uebrigens interessant, dass das Thema so "in" zu sein scheint. Habe schon von mehreren Seiten gehoert, dass sie das zu tun haben. In meinem Fall soll spaeter ein Praktikumsplatz entstehen. Aber darf ich dich fragen, welche Beispiele du genau meinst? Vielleicht ist mir da ja was entgangen. Ich habe da so einen Kurs zum 2812, der sehr aehnlich aber wohl nicht genauso funktioniert. Da verstehe ich die Beispiele, aber es ist nicht alles dabei, was ich brauche. (CAP und 6-Kanal-PWM werden erwaehnt aber nicht oder nur teilweise beschrieben) @Peter: auch Dir einen schoenen Dank. ich habe hier eine Datei namens sprca73, 57 Seiten stark und dann noch eine 200 Seiten Anleitung die weiter ins Detail geht. Ja, ein Freund von mir konnte da nur muede drueber laecheln weil der Controller von Infineon den er auf der Arbeit programmiert wohl eine 2000 Seiten starke Beschreibung hat :-) Ich werde es dann eben nochmal lesen und nicht weiter die Achundkrachmethode aus dem Praktikum verwenden. :) @MCUA: ja, es gibt einfachere Controller. Das stimmt wohl. Nur wird an meiner Fakultät dieser hier verwendet. Nochmal danke. Viele Gruesse, Erich p.s.: Feldorientierte Regelung ist schon toll. Unsere dreiphasige Frischwasserpumpe ist unstetig geregelt - das Geknalle geht mir auf den Geist :-) (hoffentlich geht sie bald kaputt)
Nachtrag: ah, da gibt es mehrere Dokumente.
Erich P. schrieb: > @Chris, danke fuer das Angebot, ich hatte gehofft, dass es vielleicht > einfache Beispiele gibt. Die gibt es doch... (siehe unten) Erich P. schrieb: > Die Beispiele die du mir schicken koenntest sind > reizvoll, doch haette ich gerne "legal", aber auf die einfachste Weise > den DSP zu verwenden probiert, sonst bringt es mir wenig :-) Nicht schicken, sondern hier posten, damit alle etwas davon haben. So funktioniert eine Community ;) Was du benötigst: Alle benötigten Sachen findest du doch hier: http://focus.ti.com/docs/prod/folders/print/tms320f28335.html Wichtig C2833x/C2823x C/C++ Header Files and Peripheral Examples (http://focus.ti.com/docs/toolsw/folders/print/sprc530.html) Get started: http://processors.wiki.ti.com/index.php?title=C2000_Getting_Started_with_Code_Composer_Studio_v4 Datasheet (http://focus.ti.com/lit/ds/symlink/tms320f28335.pdf) Application Notes/User Guides: http://www.ti.com/litv/pdf/spraai1 http://www.ti.com/litv/pdf/spru812a http://www.ti.com/litv/pdf/sprug04a http://www.ti.com/litv/pdf/spraah1 Mit diesen Links hast du schon die Basics. Erweiterungen sind natürlich immer möglich (Stichworte DMA, Flash Programming, etc.) Installiere also die Peripheral Examples lege dir die User Guides daneben und gehe die Code Examples peu à peu durch. In den User Guides ist beschrieben welche Register vorhanden sind, und wie es so ungefähr funktioniert. Erich P. schrieb: > Ja, ein Freund von mir konnte da nur muede > drueber laecheln weil der Controller von Infineon den er auf der Arbeit > programmiert wohl eine 2000 Seiten starke Beschreibung hat Meinst du wirklich es ist mit 200 Seiten getan? Wenn man wirklich in den DSC einsteigen und sich in allen Details auskennen möchte, wirst man bestimmt über den 2000 Seiten liegen. Viele Grüße
Hallo Chris, danke, ich hab das mit der Extradoku auch noch gespannt gestern :-) ich habe massig Material runtergeladen, aber zwei von den Beispielen waren nicht dabei (uebersehen?! Falsches Stichwort?!?). Seltsam - gut dass du Sie gepostet hast. Mal kucken ob das gut mit CCS V3.3 funktioniert. Ansonsten muss ich V4 auf dem PC installieren. Das Problem ist, der DSP ist auf Uni und irgendwie spinnt mein Laptop mit V4. Dort wird auch 3.3 verwendet. wie gesagt: danke
Hm, ich erkenne wieder, dass diese TI-Seite irgendwie nicht gescheit funktioniert. Vom Quickstart hatte ich eine aktuellere Version, aber ohne Dateien. Bei den staendigen 404ern hat man irgendwann keine Lust mehr. Ich frage mich, ob es sich wirklich um die aktuellste Version handelt, die ich also pdf habe (1.32).
Erich P. schrieb: > Mal kucken ob das gut mit CCS V3.3 funktioniert. Ansonsten muss ich V4 > auf dem PC installieren. Das Problem ist, der DSP ist auf Uni und > irgendwie spinnt mein Laptop mit V4. Dort wird auch 3.3 verwendet. Installiere mal die CCS Version 5.03 (http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5) Die CCS4 arbeitet mit einer alten Java-Version. Erich P. schrieb: > Hm, ich erkenne wieder, dass diese TI-Seite irgendwie nicht gescheit > funktioniert. Vom Quickstart hatte ich eine aktuellere Version, aber > ohne Dateien. Bei den staendigen 404ern hat man irgendwann keine Lust > mehr. Ich frage mich, ob es sich wirklich um die aktuellste Version > handelt, die ich also pdf habe (1.32). Bei mir funktioniert das immer super... Du surft bestimmt mit IE!? (Microsoft Opfer) Installiere mal Firefox. Falls es dann immer noch nicht funktioniert, würde ich mal zu format c:\ raten! ;) Viele Grüße
Hallo, vielen Dank fuer die Tipps! Nein, bin kein M$-Opfer. Und ein guter Freund von mir, Informatiker, Betriebssystemspezialist und M$-Nichtmoeger, der wie ich mit Firefox surft, hat mir auch schon von Problemen auf der Seite berichtet. :) (er ist uebrigens auch im embedded-Bereich taetig, aber mit einem anderen DSP). Ausserdem lebe und studiere ich ja in Spanien - vielleicht gibt es auch Probleme mit dem Routing von hier aus. Ach, was ich dich fragen wollte: bei deiner Regelung verwendest du doch sicher auch ein anti-windup, oder?? Erich
hallo, habe wieder eine Frage: ich moechte ja zwei Stroeme simultan abfragen. In spru812a sehe ich,d ass es zwei Modi fuer den ADC-Sequenzierer gibt: separat und kaskadiert. Ich nahm nun an, dass separat die richtige Einstellung ist. In den Beispielen auf den Seiten 18 und 19 sieht man jedoch, das fuer beide Betriebsarten ein "simultaneous sampling mode" eingestellt wird. Das irritiert mich nun - muss man das immer so initiieren, egal wie man es nutzt? Gruß, Erich
Wenn man die beiden ADC-Bänke auf separat und simultaneous stellt, wird der jeweilige Kanal von Bank A gleichzeitig mit dem von Bank B abgetastet. Grüße, Peter
Hallo Peter, aber kaskadiert und simultan geht auch. In beiden Faellen ist der Aufruf gleich, die Anzahl der Maxconvs kann man aber scheinbar im separaten Modus unterschiedlich waehlen - welchen Vorteil bringt das? Ich meine, ich kann ja ruhig einstellen: maxconv=0x0024. Dann haette Bank A 3 Konversionen und B 5 zu erledigen. Wenn ich aber beide 5 Schritte machen lasse und einfach nur den Wert nicht abfrage, den ich nicht brauche, gibt das dann ueberhaupt einen Unterschied?!
Die Frage ist relativ einfach zu beantworten. Du hast 2 Bänke (ADC-A & ADC-B). Möchtest du z.B. 2 Motoren Regeln, so verwendest du für die Messung am Motor 1 die Bank A und für die Messung am Motor 2 die Bank B. Der Zeitpunkt an dem eine Bank anfängt die Analogwerte zu wandeln, kann man dadurch unterschiedlich wählen (SOC_EPWM). Deswegen hat das komische Ding auch 2 Sequencer eingebaut. Wie du im Datenblatt siehst, hast du für jeden ADC ein S/H-Glied, aber nur einen "ADC". Die Kanäle können also niemals gleichzeitig gewandelt werden. Deswegen ist es sinnvoll nicht unnötige Eingänge zu wandeln, da jedes mal auf die Wandlung gewartet werden muss. Bin gerade in Eile, aber empfehlen kann ich das Datenblatt zum ADC, insbesondere Seite 13-19. Viele Grüße
Hallo, ja danke. Ich habe aber schon einen Fehler in der Beschreibung gefunden. Ich habe keine Ahnung, welchem Port ADCRESULT0 zugeordnet ist, denn der Eingang A0 wird eindeutig durch ADCRESULT1 abgefragt. Ich konfiguriere den ADC folgendermassen: // Configure ADC AdcRegs.ADCREFSEL.bit.REF_SEL=0x00; AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM=0x00; AdcRegs.ADCTRL1.bit.SEQ_CASC=0x1; //se prueba en modo cascada AdcRegs.ADCTRL3.bit.SMODE_SEL=0x1; // mod:conversion simultanea AdcRegs.ADCMAXCONV.all = 0x0000; // mod: Setup 2 conv's on SEQ //AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ //AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // versuchsweise AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) // Assumes ePWM4 clock is already enabled in InitSysCtrl(); EPwm4Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group EPwm4Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount EPwm4Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event EPwm4Regs.TBPRD = 0x0030; // Set period for ePWM4 EPwm4Regs.CMPA.half.CMPA = 20; // Set compare A value EPwm4Regs.TBCTL.bit.CTRMODE = 0; // count up and start //In der interruptroutine Voltage1[ConversionCount] = AdcRegs.ADCRESULT1 >>4; Voltage2[ConversionCount] = AdcRegs.ADCRESULT2 >>4; V1=(float) (((AdcRegs.ADCRESULT1 >>4))*3/4095.f); V2=(float) (((AdcRegs.ADCRESULT2 >>4))*3/4095.f); V1=V1-1.5; V2=V2-1.5; // und interruptreset So konfiguriert bekomme ich werte zwischen -1,3 und +0,8 fuer V1, waehrend V2 nur um -1,4 herumzappelt. Die Amplitude meiner Spannung ist 1,5V, weswegen mich sowohl der Wert im funktionierenden, als auch die geringe Reaktion des anderen "faszinieren". Kein Pin erzeugt eine Reaktion. Ich werde wahnsinnig. Ach und sollte Epwm4 nicht eigentlich einen Puls ausgeben? Bei mir gibt er einfach nur 0. Viele Gruesse Erich
noob_ schrieb: > //se prueba en modo cascada Wie geil ist das denn... :) Du möchtest A0 & B0 wandeln? mal schnell aus dem Kopf:
1 | #define VALUE_2_VOLTAGE 0.000732600733 //== 3/4095
|
2 | |
3 | InitADC(); //-> Findet sich glaube ich in der DSP_2833xx_ADC.c Datei |
4 | |
5 | //-> Hier kommt der wichtige Teil!!!!!
|
6 | AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x1; // Setup simultaneous sampling mode |
7 | AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x1; // Setup cascaded sequencer mode |
8 | AdcRegs.ADCMAXCONV.all = 0x0001; // 1 double conv's (2 total) |
9 | AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup conv from A0 & B0 |
10 | |
11 | //ADCINA0 -> ADCRESULT0
|
12 | //ADCINB0 -> ADCRESULT1
|
13 | |
14 | //-> Ende wichtiger Teil!!!!!
|
15 | |
16 | AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM |
17 | AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every |
18 | EOS) |
19 | |
20 | |
21 | // Assumes ePWM4 clock is already enabled in InitSysCtrl();
|
22 | // -> Sollte passen!
|
23 | EPwm4Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group |
24 | EPwm4Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount |
25 | EPwm4Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event |
26 | EPwm4Regs.TBPRD = 0x0030; // Set period for ePWM4 |
27 | EPwm4Regs.CMPA.half.CMPA = 20; // Set compare A value |
28 | EPwm4Regs.TBCTL.bit.CTRMODE = 0; // count up and start |
29 | |
30 | // in der ISR:
|
31 | |
32 | float V1_Real,V2_Real; |
33 | Voltage1[ConversionCount] = AdcMirror.ADCRESULT0; //-> Hier änderung! //-> AdcRegs.ADCRESULTX haben Wait-States.. bitschieben! |
34 | Voltage2[ConversionCount] = AdcMirror.ADCRESULT1; |
35 | |
36 | // Die Berechnung von V1_Real & V2_Real funktioniert nur schnell, wenn FPU32 support aktiviert ist!
|
37 | V1_Real= (AdcMirror.ADCRESULT0)*VALUE_2_VOLTAGE; //Spannung an A0 |
38 | V2_Real= (AdcMirror.ADCRESULT1)*VALUE_2_VOLTAGE; //Spannung an B0 |
39 | |
40 | // Achtung, die restlichen Eingänge (A1,B1, etc.) auf GND legen!!!!!
|
41 | |
42 | AdcRegs.ADCTRL2.bit.RST_SEQ1=1; |
43 | Piectrl...=PIEGROUP..; |
Hoffe da ist jetzt kein Fehler drin.. irgendwann kennst du die Register auch auswendig.. ;) Viele Grüße
hallo, dankeschoen :-) .... naja, habe halt nen Kommentar auf Spanisch reingeschrieben ;) Also das mit den maxconvs muss wirklich 1 sein? Lt Quelle sind 0x7 = 8 doppelconvs. Und ich verspreche dir: bei mir wird A0 bei ADCRESULT1 abgefragt. Frag mich bitte nicht, wieso, aber es ist so verrueckt. Wie aktiviere ich nochmal FPU32?!?? Ja und muesste nicht EPWM4 nur so aus Spass einen Puls ausgeben? Am montag kann ich das dann mal ausprobieren, vielen Dank :-) Erich
Also ich habs jetztnochmal versucht und irgendwie kommt ADCA0 nur ueber ADCRESULT1 bei mir an. Ansonsten kommt nur Schmarrn (also bei B0 und so zappeln die Werte herum). Selbst da wo was relativ proportionales zum Eingangssinus kommen sollte, stimmt das Offset nicht mit 1,5 ueberein und ich habe bei 3V Spitze-Spitze einen Sinus von ca. -1,2 bis ca. 0,8. Ich versuche mal was zum loeten aufzutreiben, damit ich Ports A4 bis 7 und B4 bis 7 zuverlaessig auf Masse legen kann (die Platine sieht dies nur 0 bis 3 vor)
habs mal abgeaendert in // Configure ADC AdcRegs.ADCREFSEL.bit.REF_SEL=0x00; //mod: ref interna AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM=0x00; //mod: ---- por cumplimentar AdcRegs.ADCTRL1.bit.SEQ_CASC=0x1; //se prueba en modo cascada AdcRegs.ADCTRL3.bit.SMODE_SEL=0x1; // mod:conversion simultanea AdcRegs.ADCMAXCONV.all = 0x0001; // mod: Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // mod: Setup ADCINB0 as 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 1; // Enable SOCB from ePWM to start SEQ AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; // AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;// Enable SOCB from ePWM to start SEQ1 // AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; // Enable SEQ2 interrupt (every EOS) // Assumes ePWM1 clock is already enabled in InitSysCtrl(); EPwm4Regs.ETSEL.bit.SOCBEN = 1; // Enable SOC on B group EPwm4Regs.ETSEL.bit.SOCBSEL = 4; // Select SOC from from CMPB on upcount EPwm4Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event EPwm4Regs.TBPRD = 0x0030; // Set period for ePWM4 EPwm4Regs.CMPA.half.CMPA = 20; // Set compare A value EPwm4Regs.TBCTL.bit.CTRMODE = 0; // count up and start und in der ISR: V1=(AdcMirror.ADCRESULT0*0.0007326007326)-1.5; V2=(AdcMirror.ADCRESULT1*0.0007326007326)-1.5; AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; ich kriege nur ADCRESULT1 und es gibt mir den Wert von ADCINA0 Der erhaltene Wert stimmt immernoch nicht ganz (weder Offset noch Skalierung stimmen mit dem Datenblatt ueberein) und die PWM tut auch noch nix. Ich hoffe, ich nerve Euch nicht. noob_
Also eben habe ich es nochmal parallel versucht. jetzt kommt ein anderes Gezappel in Kanal B0, also etwas das anders aussieht als der typische wert mit dem ich nichts anfangen kann. Aber ich verstehe es nicht. Auf Seite 18 von SPRU812A wird CONV00=0x0 gesetzt, um mit A0 und B0 gleichzeitig zu erfassen. ADCRESULT0 kriegt nix, es zappelt nur wie immer ein Wert um die -1,4 darin herum, ADCRESULT1 kriegt irgendwie A0 und B0, aber A0 "richtig" und mit B0 macht es irgendwas. Ich habe mal die HW-Einheit gewechselt, seitdem stimmt das offset, aber sonst ist alles beim alten. Gruss noob_
Poste morgen mal ein kurzes Beispiel. Mit der Konfiguration ist das auch kein Wunder! ;) Viele Grüße
Zu Befehl :-) // Configure ADC AdcRegs.ADCREFSEL.bit.REF_SEL=0x00; //mod: ref interna AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM=0x00; //mod: ---- por cumplimentar AdcRegs.ADCTRL1.bit.SEQ_CASC=0x0; //se prueba en modo cascada AdcRegs.ADCTRL1.bit.CONT_RUN=1; // dann laeuft das Teil wenigstens - reset wird in ISR deaktiviert AdcRegs.ADCTRL3.bit.SMODE_SEL=0x1; // mod:conversion simultanea AdcRegs.ADCMAXCONV.all = 0x0000; // mod: Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv. AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; // Enable SOCA from ePWM to start SEQ AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2= 1; // Enable SOCB from ePWM to start SEQ AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; // Assumes ePWM4 clock is already enabled in InitSysCtrl(); EPwm4Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on B group EPwm4Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CMPB on upcount EPwm4Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event EPwm4Regs.ETSEL.bit.SOCBEN = 1; // Enable SOC on B group EPwm4Regs.ETSEL.bit.SOCBSEL = 4; // Select SOC from from CMPB on upcount EPwm4Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event EPwm4Regs.TBPRD = 0x0030; // Set period for ePWM4 EPwm4Regs.CMPA.half.CMPA = 20; // Set compare A value EPwm4Regs.CMPB =20; // Set compare A value EPwm4Regs.TBCTL.bit.CTRMODE = 0; // count up and start Naja und in ISR: V1=(AdcMirror.ADCRESULT0*0.0007326007326)-1.5; V2=(AdcMirror.ADCRESULT1*0.0007326007326)-1.5; V3=(AdcMirror.ADCRESULT7*0.0007326007326)-1.5; // wollte einfach nur mal wissen was so geschieht, aus Verzweiflung V4=(AdcMirror.ADCRESULT8*0.0007326007326)-1.5; V5=(AdcMirror.ADCRESULT9*0.0007326007326)-1.5; // If 40 conversions have been logged, start over if(ConversionCount == 9) { ConversionCount = 0; } else ConversionCount++; // Reinitialize for next ADC sequence // AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 // AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1; AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE Brauchst du noch was? Erich return;
1 | //Init:
|
2 | |
3 | Uint16 A0,A1,A2,A3,A4,B0,B1,B2,B3,B4; |
4 | |
5 | AdcRegs.ADCTRL1.bit.RESET=1; |
6 | InitAdc(); |
7 | |
8 | AdcRegs.ADCTRL1.all = 0; |
9 | AdcRegs.ADCTRL1.bit.ACQ_PS = 4; |
10 | AdcRegs.ADCTRL3.bit.SMODE_SEL=1; |
11 | AdcRegs.ADCTRL1.bit.SEQ_CASC =1; |
12 | |
13 | AdcRegs.ADCTRL1.bit.CPS = 0; // divide by 1 |
14 | AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // single run mode |
15 | |
16 | AdcRegs.ADCTRL2.all = 0; |
17 | AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 1=enable SEQ1 interrupt |
18 | AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 =1; // 1=SEQ1 start from ePWM_SOCA trigger |
19 | AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0; |
20 | |
21 | AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; // ADC clock: FCLK = HSPCLK / 2 * ADCCLKPS |
22 | // HSPCLK = 75MHz (see DSP2833x_SysCtrl.c)
|
23 | // FCLK = 12.5 MHz
|
24 | |
25 | AdcRegs.ADCMAXCONV.all = 0x0004; // 2 conversions from Sequencer 1 |
26 | |
27 | AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; |
28 | AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; |
29 | AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; |
30 | AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; |
31 | AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; |
32 | |
33 | |
34 | EPwm2Regs.TBCTL.all = 0xC030; // Configure timer control register |
35 | /*
|
36 | bit 15-14 11: FREE/SOFT, 11 = ignore emulation suspend
|
37 | bit 13 0: PHSDIR, 0 = count down after sync event
|
38 | bit 12-10 000: CLKDIV, 000 => TBCLK = HSPCLK/1
|
39 | bit 9-7 000: HSPCLKDIV, 000 => HSPCLK = SYSCLKOUT/1
|
40 | bit 6 0: SWFSYNC, 0 = no software sync produced
|
41 | bit 5-4 11: SYNCOSEL, 11 = sync-out disabled
|
42 | bit 3 0: PRDLD, 0 = reload PRD on counter=0
|
43 | bit 2 0: PHSEN, 0 = phase control disabled
|
44 | bit 1-0 00: CTRMODE, 00 = count up mode
|
45 | */
|
46 | |
47 | EPwm2Regs.TBPRD = 2999; // TPPRD +1 = TPWM / (HSPCLKDIV * CLKDIV * TSYSCLK) |
48 | // = 20 µs / 6.667 ns
|
49 | |
50 | EPwm2Regs.ETPS.all = 0x0100; // Configure ADC start by ePWM2 |
51 | /*
|
52 | bit 15-14 00: EPWMxSOCB, read-only
|
53 | bit 13-12 00: SOCBPRD, don't care
|
54 | bit 11-10 00: EPWMxSOCA, read-only
|
55 | bit 9-8 01: SOCAPRD, 01 = generate SOCA on first event
|
56 | bit 7-4 0000: reserved
|
57 | bit 3-2 00: INTCNT, don't care
|
58 | bit 1-0 00: INTPRD, don't care
|
59 | */
|
60 | |
61 | EPwm2Regs.ETSEL.all = 0x0A00; // Enable SOCA to ADC |
62 | /*
|
63 | bit 15 0: SOCBEN, 0 = disable SOCB
|
64 | bit 14-12 000: SOCBSEL, don't care
|
65 | bit 11 1: SOCAEN, 1 = enable SOCA
|
66 | bit 10-8 010: SOCASEL, 010 = SOCA on PRD event
|
67 | bit 7-4 0000: reserved
|
68 | bit 3 0: INTEN, 0 = disable interrupt
|
69 | bit 2-0 000: INTSEL, don't care
|
70 | */
|
in der ISR:
1 | A0 = AdcMirror.ADCRESULT0; |
2 | B0 = AdcMirror.ADCRESULT1; |
3 | A1 = AdcMirror.ADCRESULT2; |
4 | B1 = AdcMirror.ADCRESULT3; |
5 | A2 = AdcMirror.ADCRESULT4; |
6 | B2 = AdcMirror.ADCRESULT5; |
7 | A3 = AdcMirror.ADCRESULT6; |
8 | B3 = AdcMirror.ADCRESULT7; |
9 | A4 = AdcMirror.ADCRESULT8; |
10 | B4 = AdcMirror.ADCRESULT9; |
11 | |
12 | |
13 | |
14 | // Reinitialize for next ADC sequence
|
15 | AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; |
16 | AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; |
17 | PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; |
Bei mir funktioniert es ohne Probleme. Werde nun die restlichen 2 Monate meiner Thesis "abtauchen". Viele Grüße PS: Christian W. schrieb: > Für den Start ist es wichtig wirklich die Beispiele akribisch genau > durchzuarbeiten (und jedes Datenblatt auszudrucken und neben sich zu > legen). ;)
Lieber Christian, vielen Dank fuer deine Hilfe. Aber ich muss schon sagen, so einfach ist das wirklich nicht zu verstehen. Ich habe es im kaskadierten Modus mit SOCB versucht, weil eben ePWM_SOCB_SEQ suggeriert, dass der kaskadierte Modus ueber einen gemeinsamen Sequenzierer darueber gesteuert wird - ich habe die Dokumentation durchaus gelesen und versucht, die Beispiele akribisch abzuarbeiten. Dass es nicht geklappt hat, frustriert mich schon und ich muss nun versuchen nachzuvollziehen, woran es scheiterte. Denn mittlerweile habe ich alles so hinmodifiziert, wie ich es hatte und es laeuft, bis auf dass nun in der Kaskade Sequenzierer 1 wie von dir vorgeschlagen genutzt wird. (es macht mich wirklich fertig!) Das Beispiel adc_soc war fuer serielle Konversionen ausgelegt und damit nicht nach meinem Wunsch konfiguriert. Jetzt kommt endlich das Ergebnis ADCRESULT0 aus A0 und ADCRESULT1 aus B0. Ich verstehe es nicht. .... aha... was mir gerade auch noch auffaellt: die prescaler sind offenbar auch noch sehr wichtig - nehme ich sie raus, habe ich wieder die alten Probleme. seufz Danke nochmal und alles Gute bei deiner Masterarbeit.
noob_ schrieb: > .... aha... was mir gerade auch noch auffaellt: die prescaler sind > offenbar auch noch sehr wichtig - nehme ich sie raus, habe ich wieder > die alten Probleme. seufz Ja, die sind wichtig. Es steht aber auch irgendwo im Datenblatt, dass die Nichtlinearität ab einer Samplerate von >12.5 msps stark zunimmt. Ich würde generell raten die Samplerate nur so groß wie nötig zu wählen. Das wichtigste ist, dass es nun funktioniert. Alles weitere (gerade im Hinblick auf die Dokumentation der Masterarbeit) musst du dir nun noch erarbeiten. Viel Erfolg und viele Grüße
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.