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.
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?
So, hier noch das Bild. Hoffe die Einstellungen sind zu erkennen.
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...
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 ?
@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
>> 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?
Hallo Duke, interessante Idee. Verstehe ich nur leider nicht. Was soll denn das machen bzw. können ? Wie soll denn das ausschauen ?
> 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...
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.
Ü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
> Ü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.
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.
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.
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.
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".
> 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...
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.