DA Wandlung mit Spartan 3AN Board

#1346026
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1349474
Lesenswert?

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

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

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

Sollte das nicht eher so heißen:
1
  signal dacData : unsigned(23 downto 0);
2
  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...
Gast #1350471
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 ?
Gast #1350501
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
Moderator (Firma: Titel) Persönliche Seite #1350704
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?
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1350811
Lesenswert?

Im einfachsten Fall so etwa:
1
   :
2
   :
3
   --Inputs
4
   signal CLK_50MHZ : std_logic := '0';
5
   signal btn_south : std_logic := '1';
6

7
   --Outputs
8
   signal SPI_SCK : std_logic;
9
   signal SPI_MOSI : std_logic;
10
   signal DAC_CLR : std_logic;
11
   signal DAC_CS : std_logic;
12

13
   signal sr : std_logic_vector(23 downto 0);
14
   signal dacout : std_logic_vector(7 downto 0);
15
   
16
   constant CLK_50MHz_period : time := 20 ns;
17
BEGIN
18
   uut: .....
19

20
   CLK_50MHz <= not CLK_50MHz after CLK_50MHz_period/2;
21

22
   btn_south <= '0' after 100 ns;
23
   
24
   process (SPI_SCK,SPI_MOSI,DAC_CS)
25
   begin
26
      if (DAC_CS = '1') then
27
         dacout <= sr(15 downto 8);
28
      else
29
         if rising_edge(SPI_SCK) then
30
             sr <= sr(22 downto 0) & SPI_MOSI;            
31
         end if;
32
      end if;
33
   end process;
34

35
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1351863
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.
Moderator (Firma: Titel) Persönliche Seite #1352298
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren