Forum: Mikrocontroller und Digitale Elektronik DAC STM32 maximale Ausgangsspannung


von Programmierer (Gast)


Lesenswert?

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...

von Uwe B. (derexponent)


Lesenswert?

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

von Programmierer (Gast)


Angehängte Dateien:

Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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...

von Der (Gast)


Lesenswert?

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...

von Programmierer (Gast)


Lesenswert?

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