AVR32uc3c DACIFB Verwendung

#3489939
Lesenswert?

Hallo zusammen :D

Ich möchte den Digital-Analogwandler des AVR32uc3c512c verwenden, um 
einzelne, vom Prozessor errechnete Werte in eine analoge Spannung 
umzuwandeln.

Ich verwende:
Atmel Studio 6
STK600
AVR Dragon

Die im ASF aufgeführten Beispielprogramme verwenden den PDCA um dort 
zuvor abgelegte Sinus-Werte nacheinander über den DAC auszugeben. ich 
möchte jedoch direkt die Werte an den DAC übergeben, mittels der 
"dacifb_set_value(...)"-Funktion. der Wert soll dann so lange gehalten 
werden, bis ein neuer übergeben wird.
Ich habe bereits versucht, das DACIFB-Example1 etwas umzuschreiben:


#include <asf.h>
#include <delay.h>
#include <scif_uc3c.h>
#include <dacifb.h>
#define F_CPU 20000000     // 20000000 Hz crystal

dacifb_opt_t my_dacifb ={
  .reference=DACIFB_REFERENCE_VDDANA,
  .channel_selection= DACIFB_CHANNEL_SELECTION_B,
  .low_power= false,
  .dual= false,
  .prescaler_clock_hz= F_CPU
  };

dacifb_channel_opt_t my_dacifb_channel ={
  .auto_refresh_mode= false,
  .trigger_mode= DACIFB_TRIGGER_MODE_MANUAL,
  .left_adjustment= false,
  .data_shift= 0,
  .data_round_enable= false
  };

int main (void)
{
  board_init();

// systemclock
  sysclk_init();

  osc_enable(OSC_ID_OSC0);
  osc_wait_ready(OSC_ID_OSC0);
  sysclk_set_source(SYSCLK_SRC_OSC0);

gpio_map_t DACIFB_GPIO_MAP = {
  {AVR32_DACREF_PIN, AVR32_DACREF_FUNCTION},
  {AVR32_ADCREFP_PIN, AVR32_ADCREFP_FUNCTION},
  {AVR32_ADCREFN_PIN, AVR32_ADCREFN_FUNCTION },
  {AVR32_DAC1B_PIN, AVR32_DAC1B_PIN},
  };

  gpio_enable_module(DACIFB_GPIO_MAP, 
sizeof(DACIFB_GPIO_MAP)/sizeof(DACIFB_GPIO_MAP[0]));
  dacifb_get_calibration_data(&AVR32_DACIFB1, &my_dacifb, 1);
  dacifb_configure(&AVR32_DACIFB1, &my_dacifb, F_CPU);

dacifb_configure_channel(
  &AVR32_DACIFB1,
  DACIFB_CHANNEL_SELECTION_B,
  &my_dacifb_channel,
  F_CPU
  );

dacifb_start_channel(
  &AVR32_DACIFB1,
  DACIFB_CHANNEL_SELECTION_B,
  F_CPU
  );

while(1){
//generate a trigger-signal each period
gpio_set_gpio_pin(AVR32_PIN_PA06);
gpio_clr_gpio_pin(AVR32_PIN_PA06);

dacifb_set_value(&AVR32_DACIFB1,DACIFB_CHANNEL_SELECTION_B, false, 
1000);
// low time
delay_us(100);

dacifb_set_value(&AVR32_DACIFB1,DACIFB_CHANNEL_SELECTION_B, false, 3000 
);
// high time
delay_us(100);
}


In der while(1)-Schleife soll bei jedem Durchlauf ein Trigger-Signal für 
das Oszilloskop erzeugt werden und mit dem DAC ein Rechteck-Signal 
ausgegeben werden. die Pegel sollen jeweils 100us gehalten werden.

In der Oszi-Ausgabe kommt jedoch der "3000er"-high-Pegel sofort nach dem 
Trigger, obwohl doch zuerst der "1000er" low-pegel kommen müsste. Die 
Periodenzeit stimmt allerdings. (siehe angehängtes Scope-Bild).

Welche Parameter für die dacifb_opt_t und dacifb_channel_opt_t 
Strukturen wären für meine Aufgabe sinnvoll ? Hat Jemand Mit dem DACIFB 
Erfahrungen gesammelt?

Danke schonmal,
Gruß
Angehängte Dateien:

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