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ß
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
