mikrocontroller.net

Forum: FPGA, VHDL & Co. DA Wandlung mit Spartan 3AN Board


Autor: Hans-werner M. (hanswerner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hänge bei der Ansteuerung des DA-Wandlers des Spartan 3AN Boards 
fest.
Trotz fehlerfreieer Synthese und Simulation zeigt mein Oszilloskope 
leider nicht das erwartete Ergebnis. Ich habe versucht eine 
Dreieeckssignal auszugeben. Das Ergebnis ist aber eine trapezförmige 
Spannung. Warum bleibt die Spannung solange auf dem Maximalwert ? Der 
Spannungsverlauf schwingt zudem ein wenig hin und her. Die Oberwellen 
entstehen wahrscheinlich durch die DA-Wandler selbst. Eine Einkoppelung 
konnte ich nicht feststellen.
Das ganze besteht aus zwei Prozessen. Der eine zählt einen Zähler rauf 
und wieder runter. Der andere steuert über den SPI-Bus den DA-Wandler.
Es wird das 24 Bit Format für die Ansteuerung des DA-Wandlers verwendet. 
Ausgegeben wird ein 8 Bit Wert.
Wann muß bzw. sollte man das 24 Bit Format und wann das 32 Bit Format 
verwenden ? Ich habe leider bur ein Beispiel für das 24 Bit Format 
gefunden.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du vielleicht einen Screenshot für uns?

Kannst Du den analogen Ausgang und die SPI/I2C/I2S oder was auch immer 
Daten mit anzeigen?

Autor: Hans-werner M. (hanswerner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bild kommt am Montag. Habe momentan das Oszi nicht zur Hand.

Autor: Hans-werner M. (hanswerner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, hier noch das Bild. Hoffe die Einstellungen sind zu erkennen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Verdacht, du machst da was mit dem range falsch :-o

Aus deinem Code:
  signal dacData : unsigned(23 downto 0);
  signal dacCounter : integer range dacData'range;

Daraus macht die Synthese erst mal:
  signal dacCounter : integer range 23 downto 0;
Willst du das?
Das betrifft auch die ganzen Zuweisungen...

Sollte das nicht eher so heißen:
  signal dacData : unsigned(23 downto 0);
  signal dacCounter : integer range 0 to 2**(dacData'left+1)-1;


Zu deinem Bild:
Irgendwie geht die Spannung ziemlich zackig auf 3,3V Vref, dann gibts 
Probleme. Mir scheint da was mit dem Zählbereich im Argen zu liegen...

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daraus macht die Synthese erst mal:
signal dacCounter : integer range 23 downto 0;

Richtig.

Willst du das?

Ja.

Sollte das nicht eher so heißen:
signal dacData : unsigned(23 downto 0);
signal dacCounter : integer range 0 to 2**(dacData'left+1)-1;

Nein. dacCounter muß nur über die 24Bits der Ausgabe an den DAC zählen. 
Es werden kein 2 Hoch 24 Bits an den DAC ausgegeben.

Irgendwie geht die Spannung ziemlich zackig auf 3,3V Vref, dann gibts
Probleme.

Zackig ist richtig. Sollte halt stufenweise auf die Maximalspannung 
gehen und dann wieder herunter. Halt eine Dreiecksspannung. Aber warum 
bleibt die Spannung eine ganze Weile auf dem Maximalwert ?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans-Werner:

Für die Simulation wäre ein SPI-Empfänger-Modell ganz gut (welches nicht 
synthetisierbar sein muß). Damit kannst Du Dir die gesendeten Daten in 
der Simulation anschauen (als Liste oder Waveform) und den Fehler 
eingrenzen.

Duke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>> Willst du das?
> Ja.
Na gut, mit dem richtigen Editor geöffnet und die Zeilenumbrüche korrekt 
eingestellt, sieht man das besser. Das ist soweit also korrekt...  :-/


Eigentlich sieht auch die Simulation erträglich aus...
Da sollte schon was gehen :-/
Ein Hardwareproblem? Passiert auf allen 4 Kanälen das selbe?

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Duke,

interessante Idee. Verstehe ich nur leider nicht. Was soll denn das 
machen bzw. können ? Wie soll denn das ausschauen ?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was soll denn das machen bzw. können ? Wie soll denn das ausschauen ?
Du baust in VHDL die Schnittstelle des DAC (aus dem Datenblatt) nach, 
und kontrollierst, ob die Daten dort richtig ankommen...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im einfachsten Fall so etwa:
   :
   :
   --Inputs
   signal CLK_50MHZ : std_logic := '0';
   signal btn_south : std_logic := '1';

   --Outputs
   signal SPI_SCK : std_logic;
   signal SPI_MOSI : std_logic;
   signal DAC_CLR : std_logic;
   signal DAC_CS : std_logic;

   signal sr : std_logic_vector(23 downto 0);
   signal dacout : std_logic_vector(7 downto 0);
   
   constant CLK_50MHz_period : time := 20 ns;
BEGIN
   uut: .....

   CLK_50MHz <= not CLK_50MHz after CLK_50MHz_period/2;

   btn_south <= '0' after 100 ns;
   
   process (SPI_SCK,SPI_MOSI,DAC_CS)
   begin
      if (DAC_CS = '1') then
         dacout <= sr(15 downto 8);
      else
         if rising_edge(SPI_SCK) then
             sr <= sr(22 downto 0) & SPI_MOSI;            
         end if;
      end if;
   end process;

END;
Man sieht im Screenshot, dass die Daten korrekt empfangen werden...

Man könnte jetzt natürlich noch die ganzen Timingverletzungen mit in die 
TB eintragen, aber weil du ein synchrones Design hast, wäre das 
Overkill.

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens, Modelsim kann Werte auch analog anzeigen (rechte Maustaste -> 
Format -> Analog).

Das macht sich bei DAC-Ausgaben, FIFO-Füllständen, Zählern, Instruction 
Counter etc. pp sehr gut.

Duke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Übrigens, Modelsim kann Werte auch analog anzeigen ...
Das sieht man z.B. dort an der Waveform zur DDFS ganz hübsch:
http://www.lothar-miller.de/s9y/categories/31-DDFS

Aber aufpassen mit unsigned-Werten. Zur korrekten Anzeige muß bei 
"Radix" auf Unsigned umgestellt sein. Sonst werden Werte mit gesetztem 
MSB negativ angezeigt.

Autor: Hans-werner M. (hanswerner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch mal gebastelt.
Hatte doch glatt die falschen Pins des Boards angeschlossen.
Wie war das noch ?
Schwarz ist Rot und Plus ist Minus ?
Nun sieht es an allen vier Kanälen so aus.
Scheint irgendwie "gedeckelt" bzw. limitiert.
Also noch kein Dreieck.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vieleicht übersteuerst du den DA? Oder es liegt an der Hardware gibst du 
das Signal noch auf nen Verstärler/Koppelkondensator? Ich hatte so ein 
"abschneiden" auch mal weil ich am Koppelkondensator nur einen 
Widerstand nach GND nicht aber einen nach VCC dranhatte und sich so das 
Signal verschoben hat.

Autor: Hans-werner M. (hanswerner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, nichts mit Kondensator oder Verstärker.
Übersteuern, wie denn ?
Wenn ich einen 12 Bit DA-Wandler habe, kann ich doch auch 12Bit 
ausgeben.
Einfach von den Pins des Boards auf den Oszi. Der Oszi Eingang hat 50 
Ohm.
Bin kein Meßtechniker.

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans-werner M. schrieb:
> Der Oszi Eingang hat 50
> Ohm.

Schonmal mit 1MegOhm probiert? Vllt liefert der DA einfach nicht mehr 
den Strom an 50 Ohm für die Pegel oberhalb deiner "Begrenzung".

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich einen 12 Bit DA-Wandler habe, kann ich doch auch 12Bit ausgeben.
Du schon, aber der ADC nicht ;-)

> Der Oszi Eingang hat 50 Ohm.
Autsch...
Der ADC hat einen maximalen Ausgangstrom von +-15mA. Also ist mit 50 Ohm 
bei 15 mA*50 Ohm = 0,75V Schluss. Passt genau zu deinem Bild.

> Bin kein Meßtechniker.
Ja, das sieht man...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.