- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Hilfestellung für DAC-Initialisierung beim STM32F4 gesucht

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406

    Hilfestellung für DAC-Initialisierung beim STM32F4 gesucht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich beschäftige mich seid einigen Monaten mit einem STM32F407VGT Discovery-Board. Nach vielem Programmieren stolpere ich doch öfters über Probleme mit dem DAC. Teilweise bekomme ich diesen nicht initialisiert, bzw. ist dieser diesbezüglich ziehmlich störrisch.

    Als neustes habe ich ein Problem das mir zu rästeln aufgibt. Initialisiere ich den PIN für den DAC innerhalb der Main läuft alles. Packe ich die Initialisierung des PINs mit in die Initialisierungsfunktion des DACs läuft dieser nicht mehr. Ich konnte das Problem mittlerweile auf die Initialisierung des PINs begrenzen, komme damit aber nicht weiter. Auch wenn ich die Initialisierung anderer PINs mit der gleichen Initialisierungs-Struktur mit in die Funktion packe läuft es nicht.

    Ich bin ganzschön ratlos. Da mein Programm immer mächtiger wird möchte ich die Main der Übersicht halber gerne vereinfachen um noch durchsehen zu können.

    Die Ausgabe des DACs soll über den Channel2 am Pin PA5 erfolgen - und das funktioniert ja mit der jetzigen initialisierung...

    Hier mal der Code:

    main:
    Code:
        ...
        GPIO_InitTypeDef  GPIO_InitStructure;
        ...
        // Der Code darf nicht in die Funktion init_DAC ????
        RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE );
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_Init( GPIOA, &GPIO_InitStructure );
    
        // Hier die eigentliche Initialisierung:
        init_DAC();
        ...
    init_DAC():
    Code:
    void init_DAC()
    {
        // Enable DAC clock
        RCC_APB1PeriphClockCmd( RCC_APB1ENR_DACEN, ENABLE );
    
        DAC_InitTypeDef DAC_InitStruct;
    
        DAC_InitStruct.DAC_Trigger = DAC_Trigger_None;
        DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;
        DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    
        DAC_Init( DAC_Channel_2, &DAC_InitStruct );
    
        // Enable DAC Channel 1
        DAC_Cmd( DAC_Channel_2, ENABLE );
    }
    Arbeiten tue ich mich CooCox IDE ohne Optimierung.

    Ich denke/hoffe es handelt sich hier nur um eine Kleinigkeit, die ich einfach übersehen.
    Ich bin für jede Hilfestellung dankbar!

    Gruß Erik
    Meine Projekte auf Youtube

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Erik,

    Ich sehe da:
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE );
    RCC_APB1PeriphClockCmd( RCC_APB1ENR_DACEN, ENABLE );

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    Hallo,
    leider habe schaffe ich es jetzt erst zu schreiben. Aber großes Danke für die schnelle Antwort.
    Falls du den Unterschied meinst - der ist mir auch aufgefallen - das muss aber wohl so.

    Ich habe jetzt nochmal alles sehr gründlich durchgelesen um die Initialisierungreihenfolge einzuhalten.

    Kurioser Weise funktioniert es wenn ich die DAC-Initialisierung universeller abfrage:

    Code:
    void initDAC( uint32_t DAC_Channel )
    {
        RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE );
    
        GPIO_InitTypeDef  GPIO_InitStructure;
    
        if( DAC_Channel == DAC_Channel_1 )
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        else
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_Init( GPIOA, &GPIO_InitStructure );
    
        // Enable DAC clock
        RCC_APB1PeriphClockCmd( RCC_APB1ENR_DACEN, ENABLE );
    
        DAC_InitStructure.DAC_Trigger =         DAC_Trigger_None;
        DAC_InitStructure.DAC_WaveGeneration =     DAC_WaveGeneration_None;
        DAC_InitStructure.DAC_OutputBuffer =     DAC_OutputBuffer_Enable;
    
        DAC_DeInit();
        DAC_Init( DAC_Channel, &DAC_InitStructure );
    
        // Enable DAC Channel
        DAC_Cmd( DAC_Channel, ENABLE );
    }
    Damit kann ich zunächst erstmal leben.

    Allerdings finde ich die Dokumentation ganzschön mangelhaft.
    Im späteren Programm wechsle ich zwischen manueller DAC-Ausgabe mittels DAC_SetChannel2Data und der DAC Ausgabe mittels DMA.
    Leider kann man hier nicht einfach so wechseln, sondern muss den DAC neu initialisieren. Da ich das für meinen Zweck eigentlich nich machen darf ist das unschön!
    (Die DAC-Ausgabe muss/sollte flüssig und lückenlos erfolgen)

    Es steht auch nirgends wie man den DAC mit DMA richtig initialisiert. Wenn ein Timer zum triggern genutzt wird bleibt der Ausgangswert des DACs Null nach dem Aktivieren bis der Timer das erste mal überläuft.

    Gruß Erik

    Anbei: Auf dem STM32F4 Discovery stört die blöde LED für die Verbindung zum Computer erheblich den DAC!
    Meine Projekte auf Youtube

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Erik,
    Zitat Zitat von erik_wolfram Beitrag anzeigen
    Allerdings finde ich die Dokumentation ganzschön mangelhaft.
    Im späteren Programm wechsle ich zwischen manueller DAC-Ausgabe mittels DAC_SetChannel2Data und der DAC Ausgabe mittels DMA.
    Leider kann man hier nicht einfach so wechseln, sondern muss den DAC neu initialisieren. Da ich das für meinen Zweck eigentlich nich machen darf ist das unschön!
    (Die DAC-Ausgabe muss/sollte flüssig und lückenlos erfolgen)

    Es steht auch nirgends wie man den DAC mit DMA richtig initialisiert. Wenn ein Timer zum triggern genutzt wird bleibt der Ausgangswert des DACs Null nach dem Aktivieren bis der Timer das erste mal überläuft.
    Das ist halt das Problem, wenn man mit fertigen Bibliotheken arbeitet.

    Ein weiteres Problem ist, dass man die Bibliotheken nicht entsprechend allgemein halten kann, sodass sie jeden Anwendungsfall abdecken.
    Wenn man versucht jeden Fall abzudecken, wird die Bibliothek zu gross und zu langsam.

    Als ich angefangen hatte, gab es kaum Bibliotheken und man musste sowieso alles selber schreiben, Jetzt kann ich es und benutze kaum Bibliotheken.

    Ich sehe da kein grossen Probleme mit dem Umschalten des DACs, aber du wirst es wohl selber programmieren müssen um nur diejenigen Register-Bits umzustellen, welche nötig sind.
    Wenn man das selber macht, kann man den Timer auch initialisieren und zwar auf Max-1. Dann hast du beim nächsten Takt einen Überlauf des Timers. Bibliotheken stellen den immer auf 0, damit der erste Überlauf erst nach der gewünschten Zeit kommt.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    Danke für den Hinweis mit dem Timer "MAX-1".
    Ich nutzt meistens auch nur die Bibleotheken, um mir die Grundstruktur anzugucken. Viele Funktionen kopiere ich mir dann und passe sie meinen Wünschen an.
    Da gabs schon einige böse Fallen bei den vorgefertigten...
    Meine Projekte auf Youtube

Ähnliche Themen

  1. LCD Libary für STM32F4
    Von Stones im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 13.07.2012, 12:55
  2. STM32F4 Discovery und arm-none-eabi-gcc
    Von Torrentula im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 21.03.2012, 17:33
  3. ATmega32 Hilfestellung bei Programm gesucht
    Von m0b0t1x im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 19.09.2009, 08:31
  4. Wie einstiegen? Hilfestellung gesucht
    Von BlackDevil im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 13
    Letzter Beitrag: 21.05.2008, 19:11
  5. 2xDS1820 1Wire Fehlersuche Hilfestellung gesucht
    Von HP im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 10.04.2006, 18:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test