Forum: Mikrocontroller und Digitale Elektronik MCP4921 Vout


von Walt N. (belayason)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich habe einen MCP4921 an meinen STM32F411 angeschlossen. Als 
referenzspannung habe ich die 3.3V vom NUCLEO Board benutzt. Ich wollte 
nun 8 Amplituden zwischen 3.3V und 0V generieren. Das macht der MCP4921 
auch, nur macht er es leider zwischen 440mV und 0V (Bild im Anhang). 
Senden tue ich wie folgt.
1
uint8_t high_impulse[2]  = {0xff, 0x3f};   //3,3v
2
uint8_t low_impulse[2]   = {0x00, 0x30};   //0V
3
4
if(HAL_GPIO_ReadPin(I_Trigger_GPIO_Port, I_Trigger_Pin)== GPIO_PIN_SET)
5
    {
6
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_RESET);
7
        HAL_SPI_Transmit(&hspi2,high_impulse, 1, HAL_MAX_DELAY);
8
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_SET);  
9
10
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_RESET);
11
        HAL_SPI_Transmit(&hspi2,low_impulse, 1, HAL_MAX_DELAY);
12
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_SET);  
13
.
14
.
15
.
16
    }else
17
    {
18
      HAL_GPIO_WritePin(O_LED_GPIO_Port, O_LED_Pin, GPIO_PIN_RESET);
19
      //HAL_GPIO_WritePin(O_state_GPIO_Port, O_state_Pin, GPIO_PIN_RESET);
20
    }

Also wieso bekomme ich bei max Ausgangsspannung nicht die 3.3V am 
Ausgang?

von blubb (Gast)


Lesenswert?

Wie ist denn die BEschaltung fuer Vref?
WIe sind die Einstellungen fuer Vfref gain und den Buffer?

Schreibst Du und misst Du den richtigen Kanal?

von Walt N. (belayason)


Angehängte Dateien:

Lesenswert?

blubb schrieb:
> Wie ist denn die BEschaltung fuer Vref?
> WIe sind die Einstellungen fuer Vfref gain und den Buffer?
>
> Schreibst Du und misst Du den richtigen Kanal?

Vref habe ich einfach von der Spannungsversorgung mit 3.3V auf Vref 
durchgebrückt.

0x3fff = 0b 0011 1111 1111 1111
ersten 4 konfigurationsbits
0 = Write to DAC A
0 = Unbuffered
1 = gain 1x
1 = Output Power down Control bit

Auf dem IC befindet sich nur ein DAC daher kann ich nicht den falschen 
Kanal messen

: Bearbeitet durch User
von jo mei (Gast)


Lesenswert?

Walt N. schrieb:
> HAL_SPI_Transmit(&hspi2,high_impulse, 1, HAL_MAX_DELAY);

Du schreibst nur ein Byte raus, willst aber zwei?

Und wenn das Datenblatt richtig ist dann kommt das high Byte
zuerst, dann das low Byte (sollte kommen).

Ob die MSBit/LSBit Konfiguration richtig eingestellt ist
hast du nicht gezeigt ....

von Walt N. (belayason)


Lesenswert?

Konfiguriert ist meine SPI Schnittstelle wie folgt.
1
static void MX_SPI2_Init(void)
2
{
3
  /* USER CODE END SPI2_Init 1 */
4
  /* SPI2 parameter configuration*/
5
  hspi2.Instance = SPI2;
6
  hspi2.Init.Mode = SPI_MODE_MASTER;
7
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
8
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
9
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
10
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
11
  hspi2.Init.NSS = SPI_NSS_SOFT;
12
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
13
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
14
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
15
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
16
  hspi2.Init.CRCPolynomial = 10;
17
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
18
  {
19
    Error_Handler();
20
  }
21
}
In meinem letzten angehängten Bild sieht man auch die Aufzeichnung mit 
meinem Logic Analyzer. Die zwei Byte werden eigentlich richtig auf die 
Reise geschickt.

von jo mei (Gast)


Lesenswert?

Walt N. schrieb:
> hspi2.Init.DataSize = SPI_DATASIZE_16BIT;

Das passt nicht zusammen mit

Walt N. schrieb:
> uint8_t high_impulse[2]  = {0xff, 0x3f};   //3,3v
> uint8_t low_impulse[2]   = {0x00, 0x30};   //0V

Das tut man nicht, sonst fällt man auf die Schnauze.

Entweder du konfigurierst dein SPI als 8 Bit und schreibst zwei
Bytes (aber in der richtigen Reihenfolge, also MSByte zuerst) oder
du erzeugst deine Variablenwerte in 16 Bit. Dann ist die Transfer-
Anzahl natürlich 1 wie angegeben.

Beitrag #6520214 wurde vom Autor gelöscht.
von Walt N. (belayason)


Angehängte Dateien:

Lesenswert?

1
uint8_t a_high_impulse = 0x3f;
2
uint8_t b_high_impulse = 0xff;
3
4
uint8_t a_low_impulse = 0x30;
5
uint8_t b_low_impulse = 0x00;
6
7
while (1)
8
  {
9
10
    if(HAL_GPIO_ReadPin(I_Trigger_GPIO_Port, I_Trigger_Pin)== GPIO_PIN_SET)
11
    {
12
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_RESET);
13
        HAL_SPI_Transmit(&hspi2,&a_high_impulse, 1, HAL_MAX_DELAY);
14
        HAL_SPI_Transmit(&hspi2,&b_high_impulse, 1, HAL_MAX_DELAY);
15
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, GPIO_PIN_SET);  
16
17
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, 0);
18
        HAL_SPI_Transmit(&hspi2,&a_low_impulse, 1, HAL_MAX_DELAY);
19
        HAL_SPI_Transmit(&hspi2,&b_low_impulse, 1, HAL_MAX_DELAY);      
20
        HAL_GPIO_WritePin(GPIOC, SPI2_CS_Pin, 1);  
21
....
22
....
23
}

So sieht der code jetzt aus, das Ergebnis ist das gleiche. Anschließend 
habe ich eine Verstärkerschaltung angeschlossen (Anhang Bild 1). Diese 
soll mir das Signal auf +/-12V verstärken. Doch der Ausgang zeigt das 
Signal zwischen 0V und 0.4V (Anhang Bild 2). Einfach weil der Ausgang 
des DAC's nicht 3.3V ausgibt...

von jo mei (Gast)


Lesenswert?

Walt N. schrieb:
> So sieht der code jetzt aus,

Umständlicher kann man es ja kaum machen, ein Hinweis darauf
dass du offensichtlich gar nicht verstehst um was es geht
und wie man so etwas macht.

Walt N. schrieb:
> hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
------------------------^^^^^^^^^^^^^^^^^^^^
Wenn man sagt dass etwas nicht funktioniert muss man schon
alles zeigen. Wie schaut denn die SPI-Konfiguration jetzt aus?

Walt N. schrieb:
> SPIMCP.png

Auf diesem Diagramm fällt auch noch auf dass der Chip Select
nicht nach 16 Bit hoch geht. Das verlangt aber das Datenblatt
(siehe Seite 6, Figure 1-1). Sollte dir beim Implementieren
schon längst aufgefallen sein.

von jo mei (Gast)


Lesenswert?

Deinen Aufbau solltest du auch noch zeigen, hast du denn alle
Pins des DAC vollständig verschaltet?

von Walt N. (belayason)


Lesenswert?

jo mei schrieb:
> Umständlicher kann man es ja kaum machen, ein Hinweis darauf
> dass du offensichtlich gar nicht verstehst um was es geht
> und wie man so etwas macht.

Du bist ja der coolste hier. Es geht hier um einen Testaufbau und es 
soll einfach funktionieren. mach dir mal keine Sorgen um die Code 
Optimierung

jo mei schrieb:
> Wenn man sagt dass etwas nicht funktioniert muss man schon
> alles zeigen. Wie schaut denn die SPI-Konfiguration jetzt aus?

Natürlich habe ich aus der 16 eine 8 gemacht.

jo mei schrieb:
> Auf diesem Diagramm fällt auch noch auf dass der Chip Select
> nicht nach 16 Bit hoch geht. Das verlangt aber das Datenblatt
> (siehe Seite 6, Figure 1-1). Sollte dir beim Implementieren
> schon längst aufgefallen sein.

Anstatt gleich zu zicken kann man auch einfach mal nachfragen. Klar habe 
ich gesehen das der Chipselect nicht triggert. Liegt aber an meinem 
Logic Analyzer. Außerdem hat man den Schaltplan von meinem DAC auch ein 
dem Bild. Hast du Lust zu helfen oder nur hier um den coolen zu spielen?

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.