Forum: Mikrocontroller und Digitale Elektronik Zum verrueckt werden: DSP TMS320F28335 von texas instruments


von E. P. (noob_)


Lesenswert?

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_

von Pete K. (pete77)


Lesenswert?

Ist denn das nicht im Datenblatt erklärt? Ansonsten vielleicht mal bei 
TI im Forum fragen.

von technikadonis (Gast)


Lesenswert?

Der F28335 ist ein DSP aus der C2000-Reihe (auch C2800, wenn ich mich 
nicht irre).

von E. P. (noob_)


Lesenswert?

Danke fuer die einstweiligen Antworten.

Das Problem, Pete, ist, dass ich das Kauderwelsch nicht verstehe, weil 
ich, wie gesagt zu dumm dafuer bin ;-)

von Peter D. (peda)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

@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 :-)

von E. P. (noob_)


Lesenswert?

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_

von Christian W. (chrisw84)


Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von MCUA (Gast)


Lesenswert?

>Nun kommt aber das Theater mit dem genannten DSP...
Es gibt auch andere DSPs, mit einfacherem Aufbau, die das können.

von E. P. (noob_)


Lesenswert?

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)

von E. P. (noob_)


Lesenswert?

Nachtrag: ah, da gibt es mehrere Dokumente.

von Christian W. (chrisw84)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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).

von Christian W. (chrisw84)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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?!

von Christian W. (chrisw84)


Lesenswert?

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

von noob_ (Gast)


Lesenswert?

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

von Christian W. (chrisw84)


Lesenswert?

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

von E. P. (noob_)


Lesenswert?

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

von noob_ (Gast)


Lesenswert?

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)

von noob_ (Gast)


Lesenswert?

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_

von noob_ (Gast)


Lesenswert?

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_

von Christian W. (chrisw84)


Lesenswert?

Poste morgen mal ein kurzes Beispiel.

Mit der Konfiguration ist das auch kein Wunder! ;)



Viele Grüße

von noob_ (Gast)


Lesenswert?

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;

von Christian W. (chrisw84)


Lesenswert?

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).

;)

von noob_ (Gast)


Lesenswert?

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.

von Christian W. (chrisw84)


Lesenswert?

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
Noch kein Account? Hier anmelden.