Forum: Compiler & IDEs AVR32uc3c DACIFB Verwendung


von mirko f. (mirkochip)


Angehängte Dateien:

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ß

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
Noch kein Account? Hier anmelden.