Hallo zusammen, derzeit bin ich am Programmieren des DACs am STM32. Hierzu gibt es bereits auch einige Beispiele. In allen Beispielen wird als Reference Voltage 1.25 Volt eingestellt. Das bedeutet wiederrum, dass die max. Ausgangsspannung bei den 12 Bit auslösung, also für den Wert 4095 auch den 1.25 Volt entsprechen. Ich möchte jedoch 3,3 V als max. Ausgangsspannung erreichen. Es gibt in der DAC_Init_TypeDef Struktur für reference voltage noch 2.5V zum einstellen, sowie VDD. Jedoch wenn ich einen dieser Parameter benutze, bleibt weiterhin die Ausgangsspannung jedesmal auf den max. 1.25 V für den DIgitalwert 4095. Was ist hier das Problem, habe echt keine Ahnung mehr...
Hi, die max Ausgangs-Spannung hängt mit der Spannung am VREF+ Pin zusammen das ist die max. erreichbare Spannung für den DAC kann es sein, das bei dir dort nur 1,25V anliegen ? Gruss Uwe
Hey Uwe, danke für den Hinweis, vermutlich ist dass das Problem. Wo finde ich jedoch den Vref Pin an meinem Controller? Mein Controller ist momentan über USB versorgt, und hat einen Pin mit 3,3V und einen mit 5V herausgeführt? Wo liegt Vref, bzw. wo muss es angelegt werden? PS: Habe ein Bild mit Pins mit hinzugefügt
Habe im Datenblatt des Controllers auch noch folgenden Hinweis gefunden: 29.3.2 Reference Selection Three internal voltage references are available and are selected by setting the REFSEL bits in DACn_CTRL: • Internal 2.5V • Internal 1.25V • VDD The reference selection can only be changed while both channels are disabled. The references for the DAC need to be enabled for some time before they can be used. This is called the warm-up period, and starts when one of the channels is enabled. For a bandgap reference, this period is 5 DAC_CLK cycles while the VDD reference needs 1 DAC_CLK cycle. The DAC will time this period automatically(given that the prescaler is set correctly) and delay any conversion triggers received during the warm-up until the references have stabilized. In meinem Programm beginne ich auch mit der Funktion DAC_Setup, welche die Reference Spannung auf 2,5V einstellt, und aktiviere erst dann den Kanal, von daher sollte auch dies kein Problem sein. Weil hier im Text ja steht, dass nur im abgeschalteten Zustand die Referenzspannung verstellt werden kann.
Problem ist behoben... die Struktur wurde am Anfang mit einer Default Struktur initialisiert. Anschließend wurde ein Wert der Struktur (die Reference Voltage) nochmal neu gesetzt. Anscheinend kann dieser Wert nicht mehr überschrieben werden, wenn er zuvor mit den Default Parametern gesetzt wurde. Er bleibt nämlich immer noch auf 1.25 V obwohl er anschließend auf 2.5V gesetzt wurde. Dass ist dann wohl eher ein C-Problem. Auch seltsam, da die Default Struktur ja nicht const ist, und auch der Compiler kein Problem meldet. Nunja, jetzt geht es...
Programmierer schrieb: > die Struktur wurde am Anfang mit einer Default Struktur initialisiert. > Anschließend wurde ein Wert der Struktur (die Reference Voltage) nochmal > neu gesetzt. Anscheinend kann dieser Wert nicht mehr überschrieben > werden, wenn er zuvor mit den Default Parametern gesetzt wurde. > Er bleibt nämlich immer noch auf 1.25 V obwohl er anschließend auf 2.5V > gesetzt wurde. Kannst du den Teil des Codes zeigen? Ich verwende demnächst auch den DAC...
1 | /**************************************************************************//**
|
2 | * @brief Setup DAC
|
3 | * Configures and starts the DAC
|
4 | *****************************************************************************/
|
5 | void DAC_setup(void) |
6 | {
|
7 | /* Use default settings */
|
8 | DAC_Init_TypeDef init = DAC_INIT_DEFAULT; |
9 | DAC_InitChannel_TypeDef initChannel = DAC_INITCHANNEL_DEFAULT; |
10 | |
11 | /* Enable the DAC clock */
|
12 | CMU_ClockEnable(cmuClock_DAC0, true); |
13 | |
14 | /* Calculate the DAC clock prescaler value that will result in a DAC clock
|
15 | * close to 500kHz. Second parameter is zero, if the HFPERCLK value is 0, the
|
16 | * function will check what the current value actually is. */
|
17 | init.prescale = DAC_PrescaleCalc(500000, 0); |
18 | |
19 | /* Set reference voltage to 1.25V */
|
20 | //init.reference = DAC_CTRL_REFSEL_2V5;
|
21 | |
22 | /* Initialize the DAC and DAC channel. */
|
23 | DAC_Init(DAC0, &init); |
24 | DAC_InitChannel(DAC0, &initChannel, 0); |
25 | }
|
26 | |
27 | |
28 | /**************************************************************************//**
|
29 | * @brief Write DAC conversion value
|
30 | *****************************************************************************/
|
31 | void DAC_WriteData(DAC_TypeDef *dac, unsigned int value, unsigned int ch) |
32 | {
|
33 | /* Write data output value to the correct register. */
|
34 | if (!ch) |
35 | {
|
36 | dac->CH0DATA = value; |
37 | }
|
38 | else
|
39 | {
|
40 | dac->CH1DATA = value; |
41 | }
|
42 | }
|
Und in der main habe ich folgende aufrufe: [c] /* Initialise the DAC */ DAC_setup(); /* Enable DAC channel 0, located on pin PB11 */ DAC_Enable(DAC0, 0, true); [\c] Danach kann ganz normal geschrieben werden mit dem Befehl DAC_WriteData(..) in der DAC_Setup Funktion habe ich übrigens inzwischen einfach die 2,5V als Reference Voltage auskommentiert, und im em_dac file in der DefaultStruktur den Wert einfach direkt auf die 2,5V gesetzt..;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.