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
Ist doch im Prinzip nur SPI! Du bist halt beschränkt auf Bytes.
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
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.
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.
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...
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
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); |
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.