mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD9850 braucht Hilfe


Autor: Pete K. (pete77)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich wollte mir einen Frequenzgenerator mit dem AD9850 Modul bauen.
Leider stimmt wohl noch etwas mit der Software oder Hardware nicht.
Auf jeden Fall zappelt das Oszi in einem Bereich von ca. 80-110mV Vpp 
munter umher.
Klare Sinuskurven sind nicht erkennbar.

Anbei die main.c mit der Ansteuerung.

Das ganze ist auf Experimentierplatine aufgebaut und wird mit einem 9V 
Netzteil sowie einem TL780-05C Linearregler versorgt.

Hardware: 8Mhz Atmega328, AD9850 Modul, 2x16 LCD, ALPS Drehencoder.
Verschaltung: siehe main.c Listing

Autor: Frank Link (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schau Dir mal das Ergebnis dieser Rechnung im LCD an. Meiner Meinung 
fehlt hier ein Cast.
int32_t freq = frequency * 4294967295UL/125000000UL;
int32_t freq = (int32_t)(frequency * 4294967295UL/125000000UL);

gruß
Frank

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, die Werte von freq stimmen jetzt. Aber nach Sinus sieht das immer 
noch nicht aus.
Ist die Ansteuerung des AD9850 denn ok? Wäre prima, wenn da jemand mal 
draufschauen könnte. Ich sehe hier den Wald vor lauter Bäumen nicht 
mehr...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Aber nach Sinus sieht das immer noch nicht aus.

Ist ja auch keiner, ist ja eine Treppe. ;-)

Damit die annähernd nach Sinus aussieht, darf die Frequenz nicht zu
hoch sein.  Bei höheren Frequenzen entsteht der Sinus erst nach dem
Antialiasing-Filter.

Warum machst du die Ansteuerung im Bitbang-Modus?  Kannst du denn den
normalen SPI-Port nicht benutzen?

Hier mal ein Codeschnipsel, welches ich bei einem AD9850-Projekt mal
benutzt habe:
static void
init_ad9850(void)
{
  /*
   * Disable SPI, and reset the DDS circuitry.
   */
  SPCR = 0;
  PORTC |= _BV(0);
  PORTC &= ~_BV(0);

  /*
   * After reset, initiate one W_CLK pulse followed by one FQ_UD pulse
   * to activate the serial configuration control word.
   */
  PORTB |= _BV(7);
  PORTB &= ~_BV(7);
  PORTC |= _BV(1);
  PORTC &= ~_BV(1);

  /*
   * Now, we're ready to hand over the data transmission to SPI.
   */
  SPCR = _BV(SPE) | _BV(DORD) | _BV(MSTR);
  SPSR = _BV(SPI2X);
}

static void
fq_ud(uint32_t fq)
{
  union
  {
    uint32_t l;
    uint8_t b[5];
  }
  u;
  uint8_t i;

  u.l = fq;
  /*
   * W32..W39: no phase angle, no power-down, control bits = 0
   */
  u.b[4] = 0;

  for (i = 0; i < 5; i++)
    {
      SPDR = u.b[i];
      while ((SPSR & _BV(SPIF)) == 0)
        /* wait */;
    }

  /* Update now. */
  PORTC |= _BV(1);
  PORTC &= ~_BV(1);
}

Ist nicht sehr gut abstrahiert, gebe ich zu. ;-)

Autor: Frank Link (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
dann schau Dir mal Dein Bit geschubse an, das kann so auch nicht 
stimmen.
for (int i=0; i<8; i++, data>>=1) {
  if ((data & 0x01)==0) {Port(D7_PORT) &= ~(1<<i);} //clear
  if ((data & 0x01)==1) {Port(D7_PORT) |= (1<<i);} //set


Entweder Du setzt ein Bit oder Du löscht es. Aber das komische ~(1<<i) 
ist komplett überflüssig.

Gruß
Frank

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Ist ja auch keiner, ist ja eine Treppe. ;-)

Aktuell teste ich mit 100Hz - 10kHz. Das sollte noch gehen.

Der Abschnitt oben sieht jetzt so aus:
for (int i=0; i<8; i++) {
  if ((data & 0x01)==0) {Port(D7_PORT) &= ~(1<<D7_PIN);} //clear
  if ((data & 0x01)==1) {Port(D7_PORT) |= (1<<D7_PIN);} //set
        data>>=1;

Der Ausgang bleibt auf 1,08V mit einem "Ripple" von ca. 80-100mVpp

Autor: --- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast keinen LA?
Zu geizig für Sechs Euro Fuffzich?

Sollen nun alle die main.c auf ihren 9859 loslassen
und dann mit ihrem LA nach dem Fehler suchen?

Fragen über Fragen.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich habe keinen LA.

Autor: Christian S. (vivus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--- schrieb:
> Hast keinen LA?
> Zu geizig für Sechs Euro Fuffzich?

Nicht der Wahrheit entsprechend.
Beim Ali aktuell für 4,58$ inkl. Versand was ca. 3,80 EUR sind.
https://www.aliexpress.com/item/Free-Shipping-10se...

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal woher Du es kopiert hast (Link), dann kann man es zumindest mit 
dem Original vregleichen. War das Original für einen anderen AVR-MC 
geschrieben - oder ggf. für den Arduino?

: Bearbeitet durch User
Autor: Frank Link (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Schau nochmal ins Handbuch Seite 10 Timing Diagramm für Fq_ud dort steht 
eindeutig Low vor dem schieben, dann einmal High und dann wieder Low. 
Dann werden die Daten übernommen.

Gruß
Frank

: Bearbeitet durch User
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Der Abschnitt oben sieht jetzt so aus:

Nochmal die Frage: warum keine Hardware-SPI?

Der von mir gepostete Code ist “known to work”.

Autor: Sapperlot W. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Analog Devices ist man oft im Bitbang Mode weil das Hardware SPI 
Timing nicht ganz passt. Dann kann man's auch gleich so lassen. Zudem 
ist Hardware SPI nicht sonderlich effizient. Weder mit Interrupts, noch 
mit Pollen.

: Bearbeitet durch User
Autor: Holm Tiffe (holm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sapperlot W. schrieb:
> Bei Analog Devices ist man oft im Bitbang Mode weil das Hardware SPI
> Timing nicht ganz passt. Dann kann man's auch gleich so lassen. Zudem
> ist Hardware SPI nicht sonderlich effizient. Weder mit Interrupts, noch
> mit Pollen.

Fakenews?

Gruß,

Holm

Autor: Beo Bachta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sapperlot W. schrieb:
> weil das Hardware SPI Timing nicht ganz passt.

Das schlechte SPI Timing sitzt dann wie üblich vor der Tastatur.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sapperlot W. schrieb:
> Bei Analog Devices ist man oft im Bitbang Mode weil das Hardware SPI
> Timing nicht ganz passt.

Nochmal ganz langsam: das da oben ist ein Codeschnipsel aus einem
AD9850-Projekt von mir, welches nachweislich funktioniert.

An Einfachheit und Geschwindigkeit ist es durch manuelle Bitbangerei
sowieso nicht zu übertreffen.

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter F. schrieb:
> Sag mal woher Du es kopiert hast (Link)

Nicht mehr nötig, habe es - glaube ich - gefunden. Eine Portierung eines 
Arduino-Programms.

http://www.ad7c.com/projects/ad9850-dds-vfo/

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte mich eher hier orientiert:
https://electronicfreakblog.wordpress.com/2014/01/...

@Jörg: Für Hardware-SPI müsste ich das neu verkabeln. Daher möchte ich 
das gerne erst einmal mit bit banging versuchen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Daher möchte ich das gerne erst einmal mit bit banging versuchen.

Spätestens jetzt ist allerdings wirklich der Zeitpunkt gekommen, wo
du einen LA benutzen solltest.

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Hatte mich eher hier orientiert:
> 
https://electronicfreakblog.wordpress.com/2014/01/...

Wenn Du es schreibst :-) merkwürdige Korrealtion der Kommentare ...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darüber solltest du wohl nochmal nachdenken:
  // set FQUP low
  Port(FQUP_PORT) |= (1<<FQUP_PIN);

  // ...

  // set FQUP high and take new frequency
  Port(FQUP_PORT) &= ~(1<<FQUP_PIN);

Ganz davon abgesehen, vergleich' das mal mit meinem Code: dort kommt
ein (kurzer) FQUD-Puls nach dem Schreiben des Datenworts.

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> dort kommt
> ein (kurzer) FQUD-Puls nach dem Schreiben des Datenworts.

In der von mir erwähnten Vorlage auch:
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }

...

// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {  
  if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
  int32_t freq = frequency * 4294967295/125000000;  // note 125 MHz clock on 9850.  You can make 'slight' tuning variations here by adjusting the clock frequency.
  for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
  }
  tfr_byte(0x000);   // Final control byte, all 0 for 9850 chip
  pulseHigh(FQ_UD);  // Done!  Should see output
}

: Bearbeitet durch User
Autor: Pete K. (pete77)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ihr seit die Besten! Jetzt funktioniert es.

Ich hatte noch einen dicken Bug in der init/reset Routine drin. Man 
sollte so etwas nicht spät abends programmieren ;-)

Anbei das aktuelle Ergebnis.

Danke!

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]
  • [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.

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