Forum: Mikrocontroller und Digitale Elektronik SSI Schnittstelle mit STM 32 Hall Library auslesen


von Michael F. (paron2407)


Lesenswert?

Hallo ich bin neu in der Mikrocontrollerwelt und muss möglich einfach 
eine SSI Schnittstelle eines Drehgebers auslesen.
Dazu habe ich einen STM32 Discovery F4 Board und würde gerne die Hall 
Library nutzen.
Hat jemand von euch eine Minimalbeispiel in einer Hall Library bei dem 
man die grundsätzliche Herangehensweise sehen kann.
Danke schonmal

von Frank (Gast)


Lesenswert?

Ist doch im Prinzip nur SPI!
Du bist halt beschränkt auf Bytes.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Auch mit Bitbanging ist SSI recht leicht zu bedienen. Code für AVR und 
gcc müsste bei mir irgendwo rumfliegen. Wimre brauchte der Sick Stegmann 
28 Clocks für einen Datensatz.

: Bearbeitet durch User
von Michael F. (paron2407)


Lesenswert?

Was muss man beim Anschließen beachten?
(Wie muss der Schaltplan in etwa aussehen)
Und mit welchen Befehlen (HAL) lese ich dann am besten die SPI 
Schnittstelle aus.

von CAN-Fan (Gast)


Lesenswert?

Schau dir doch CubeMX an. Dort kannst du die HW-Config erstellen und er 
kopiert dir gleich die HAL mit ins Projekt. Schau unter Drivers/HAL 
(oder wie auch immer)  und dort findest du z.B. eine spi.h, ... dort 
sind alle Funktionen drinnen und eigentlich selbst erklärend. Da die 
Doku relativ schlecht ist, hilft es, sich den Quelltext darunter 
anzusehen.

Du hast natürlich die Wahl zwischen DMA, Interrupt und Polling. Je 
nachdem sieht es anders aus.

von Frank (Gast)


Lesenswert?

Michael F. schrieb:
> Was muss man beim Anschließen beachten?
> (Wie muss der Schaltplan in etwa aussehen)

Spannung an Geber (meist 12V). Schau aber lieber ins DB.
Dann brauchst du noch eine Pegel-Anpassung für Clock und Daten.
Am besten ist, du nimmst RS485 Transceiver.

Michael F. schrieb:
> Und mit welchen Befehlen (HAL) lese ich dann am besten die SPI
> Schnittstelle aus.

Anzahl Clocks die der Geber braucht über den uC ausgeben. Im 
Empfangsregister des uC die Daten auslesen. Monoflopzeit abwarten und 
von vorne.

Matthias S. schrieb:
> Wimre brauchte der Sick Stegmann 28 Clocks für einen Datensatz.

Oftmals macht es ihnen nichts aus wenn es ein paar Clocks mehr sind. 
Manche kacken aber auch total ab...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank schrieb:
> Am besten ist, du nimmst RS485 Transceiver.

Wobei die eine Hälfte dann nicht benutzt wird. Meine Drehgeber hier 
(Sick Stegmann und Haidenhein) haben im Clockeingang Optokoppler und 
sind mit Signalen aus einer Parallelschaltung von je zwei 74HC14 Gattern 
und einem Inverter zuverlässig über 10m anzusteuern.
Da der STM32 nur 3,3V mit wenig Strom liefert, reicht es auf keinen 
Fall, direkt mit dem MC Signal zu arbeiten, puffern musst du auf jeden 
Fall.

Der Daten Rückweg wird dann tatsächlich am besten über einen RS485 
Receiver geführt oder auch z.B. über einen Komparator a la LM311. Wer 
die galvanische Trennung braucht, kann auch einen Optokoppler als 
Receiver nehmen - der allerdings die Datenrate gut vertragen muss.

: Bearbeitet durch User
von Justus S. (jussa)


Lesenswert?

SSI über ein STM32 F3 Discovery Board hab ich etwa so gemacht:

SPI initialisieren
1
/* SPI2 init function */
2
void MX_SPI2_Init(void)
3
{
4
5
  hspi2.Instance = SPI2;
6
  hspi2.Init.Mode = SPI_MODE_MASTER;
7
  hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
8
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
9
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
10
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
11
  hspi2.Init.NSS = SPI_NSS_SOFT;
12
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
13
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
14
  hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
15
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
16
  hspi2.Init.CRCPolynomial = 10;
17
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
18
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
19
  HAL_SPI_Init(&hspi2);
20
21
}

Pins konfigurieren (PB13-15):
1
  /*Configure GPIO pins : PB14 PB15 */
2
   GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
3
   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
4
   GPIO_InitStruct.Pull = GPIO_NOPULL;
5
   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
6
   GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
7
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
8
9
   /*Configure GPIO pins : PB13*/
10
    GPIO_InitStruct.Pin = GPIO_PIN_13;
11
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
12
    GPIO_InitStruct.Pull = GPIO_NOPULL;
13
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
14
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
15
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

4 Bytes abfragen
1
    dir0 = SPI2->DR;
2
    SET_BIT(SPI2->CR1, SPI_CR1_SPE);
3
    while ((SPI2->SR & SPI_SR_RXNE) != SPI_SR_RXNE)
4
    {}
5
    dir0 = SPI2->DR;
6
    while ((SPI2->SR & SPI_SR_RXNE) != SPI_SR_RXNE)
7
    {}
8
    dir1 = SPI2->DR;
9
    while ((SPI2->SR & SPI_SR_RXNE) != SPI_SR_RXNE)
10
    {}
11
    dir2 = SPI2->DR;
12
    while ((SPI2->SR & SPI_SR_RXNE) != SPI_SR_RXNE)
13
    {}
14
    dir3 = SPI2->DR;
15
    CLEAR_BIT(SPI2->CR1, SPI_CR1_SPE);

von Bürovorsteher (Gast)


Lesenswert?

> Matthias S. schrieb:
>> Wimre brauchte der Sick Stegmann 28 Clocks für einen Datensatz.
>
> Oftmals macht es ihnen nichts aus wenn es ein paar Clocks mehr sind.
> Manche kacken aber auch total ab...

Endlichmal eine fundierte Expertenantwort...

Der Drehgeber braucht 28 Takte, weil es offenbar ein Multiturn-Drehgeber 
ist mit vllt 13 bit Singleturn (8192 Inkremente) und 15 bit Multiturn 
(32k irgendwas Umdrehungen).

> Oftmals macht es ihnen nichts aus wenn es ein paar Clocks mehr sind.

Dann ist der Drehgeber eine Fehlkonstruktion.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich hab mal in meinen Sourcen gewühlt, der Sick Stegmann AG661 braucht 
das:
1
/* Read the Sick Stegmann Encoder AG661
2
 * This is done by bringing the clock low first 
3
After rising the clock again, the first bit is sent by the encoder. 
4
24 bits are sent followed by the PF bit indicating a Power fail. 
5
A break with a minimum of 20 µs will reset the encoder to start */
Der AG661 ist ein 4096 Schritte/Umdrehung und 4096 Turn Encoder und 
braucht also genau 25 Clock Pulse.
Der Haidenhein ENQ425 ist der zweite Encoder in diesem Projekt und hat 
genau die gleichen Bedingungen - nur, das er an einem anderen Portpaar 
hängt.

Zu beachten ist, das zumindest meine Encoder Gray Code liefern, der mit 
einer simplen Routine in Binär umgewandelt werden muss. Ob das beim TE 
der Fall ist, muss er selber wissen.

: Bearbeitet durch User
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.