Forum: Mikrocontroller und Digitale Elektronik Mehrere x-nucleo-IHM02A1 L6470 Schrittmotor mit mbed libraray


von Christian M. (chris_me)


Angehängte Dateien:

Lesenswert?

Hallo,

das ist mein 1. Post ... bitte um Nachsicht.

Versuche schon seit geraumer Zeit mittels der L6470 Treiber auf dem 
IHM02A1 Board (2x in dasy chain Konfiguration) Schrittmotoren zu 
verwenden (auf einem Nucleo-L476RG)
Funktioniert mit einem Board und 2 Motoren auch alles wie erwartet.

Nun versuche ich aber 2 weitere IHM02A1 Boards hinzuzufügen und habe 
große Probleme. Habe die CS-Jumper auf verschiedene Pins gestellt und 
dazu noch den Clock PIN geändert damit er nicht mit der LED in Konflikt 
gerät)

Leider funktioniert nur das zuerst initalisierte Board (Object). Bei 
jedem weiteren bleibt MISO/MOSI LOW bzw HIGH. Siehe auch angehängte 
sigrok screenshots.

Keine Ahnung ob es an meinen Mangelhaften C/C++ oder Hardware 
Kenntnissen liegt. Hier ist meine (gekürzte) Version abgeleitet aus dem 
Hello World Beispiel:

Hoffe jemand kann mir auf die Sprünge helfen.
1
/* mbed specific header files. */
2
#include "mbed.h"
3
4
/* Helper header files. */
5
#include "DevSPI.h"
6
7
/* Expansion Board specific header files. */
8
#include "XNucleoIHM02A1.h"
9
10
#define maxBoards 3
11
XNucleoIHM02A1 *x_nucleo_ihm02a1[maxBoards];
12
PinName const board_CS[4] = {D5,D2,A2,D10};
13
14
L6470 **motors[maxBoards];
15
16
int main()
17
{
18
  DevSPI dev_spi(D11, D12, D13); // MISO,MOSI,SCK
19
    
20
    DigitalOut active(D6);
21
    active=false;
22
23
    /* Initializing Motor Control Expansion Boards. */
24
    for (b = 0; b<maxBoards; ++b) {
25
        active=true;
26
        x_nucleo_ihm02a1[b] = new XNucleoIHM02A1(&init[0], &init[1], A4, A5, D4, board_CS[b], &dev_spi);
27
        active=false;
28
        pcTerminal.printf("Board %d %d (%d) initalized\r\n",b,board_CS[b],x_nucleo_ihm02a1[b]);
29
        motors[b] = x_nucleo_ihm02a1[b]->get_components();
30
        for (m=0; m<2; ++m) {
31
            motors[b][m]->hard_hiz(); // shutdown H-bridge
32
            result = motors[b] [m] -> get_status();
33
            pcTerminal.printf("  Init B:%d M:%d Result:%d\r\n",b,m,result);
34
//            wait(1);
35
        }
36
//        wait(2);
37
    }
38
39
// Move all Motors forward   
40
41
        for (b=0; b<maxBoards; ++b) {
42
            for (m=0; m<2; ++m) {
43
                pcTerminal.printf("Board %d Motor %d Steps %d",b,m,STEPS_1);
44
                motors[b][m]->move(StepperMotor::FWD, STEPS_1);
45
                motors[b][m]->wait_while_active();
46
                motors[b][m]->hard_hiz();
47
                result = motors[b][m] -> get_status();
48
                pcTerminal.printf(" Result: %d\r\n",result);
49
                wait(1);
50
            }
51
        }
52
53
// Move all Motors backward   
54
        
55
         for (b=0; b<maxBoards; ++b) {
56
            for (m=0; m<2; ++m) {
57
                pcTerminal.printf("Board %d Motor %d Steps -%d",b,m,STEPS_1);
58
                motors[b][m]->move(StepperMotor::BWD, STEPS_1);
59
                motors[b][m]->wait_while_active();
60
                motors[b][m]->hard_hiz();
61
                result = motors[b][m] -> get_status();
62
                pcTerminal.printf(" Result: %d\r\n",result);
63
                wait(1);
64
            }
65
        }
66
           
67
        /* Printing to the console. */
68
        pcTerminal.printf("terminate.\r\n");
69
     
70
71
    
72
}

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