Endstufe für CD-Laufwerk-Brushless-Motoren mit Atmega8

OP #2270915
Lesenswert?

Hallo zusammen,

bei meiner aktuellen frickelei kam ich in die Verlegenheit einen 
möglichst flachen Elektromotor antreiben zu müssen.
Nach kurzer Analyse meines Ausschlachtlagers stieß ich auf den 
Antriebsmotor eines alten CD-Laufwerks. Dieser ist in der Bauform recht 
flach (ca. 10mm) ausgeführt. Ein blick auf dessen Verdrahtung offenbarte 
4 Wicklungsanschlüsse. Der Vermutung nach U V W und der Sternpunkt 
(dieser besteht aus drei zusammengeführten Drähten).

Zur Endstufe: Da alles möglichst einfach ausgeführt werden soll, 
verwende ich 3 FETs die die Motorphasen nacheinander gegen GND 
durchschalten (Der Sternpunkt liegt auf Betriebsspannung).
Die Schaltung werde ich, sobald gezeichnet, Nachreichen. :)

Zur Software: Mit folgenden Zeilen habe ich bereits die ersten 
Motorumdrehungen hinbekommen. :)
1
int main()
2
{
3
    // Motor-Port auf OUT
4
    DDR_MOT  |= (1 << PAD_MOT_U);
5
    DDR_MOT  |= (1 << PAD_MOT_V);
6
    DDR_MOT  |= (1 << PAD_MOT_W);
7

8
    // Timer1 initialisieren
9
    timer1_init();
10

11
    // Interrupts aktivieren
12
    sei();
13

14
    // ADC initialisieren
15
    ADC_Init();
16

17
    // Port für Signal-LED initialisieren
18
    DDR_LED  |= (1 << PAD_LED);
19

20
    // Endlosschleife
21
    while (1)
22
    {
23
        // Schrittkette für Motorsequenz
24
        switch (count)
25
        {
26
            // case 0 bis 3 für vollschrittbetrieb U, V, W
27
            case 0: PORT_MOT &= ~(1 << PAD_MOT_W);
28
                    PORT_MOT &= ~(1 << PAD_MOT_V);
29
                    PORT_MOT |= (1 << PAD_MOT_U);
30
                    break;
31
            case 1: PORT_MOT &= ~(1 << PAD_MOT_W);
32
                    PORT_MOT &= ~(1 << PAD_MOT_U);
33
                    PORT_MOT |= (1 << PAD_MOT_V);
34
                    break;
35
            case 2: PORT_MOT &= ~(1 << PAD_MOT_V);
36
                    PORT_MOT &= ~(1 << PAD_MOT_U);
37
                    PORT_MOT |= (1 << PAD_MOT_W);
38
                    break;
39
            case 3: ;
40

41
            // case 4 bis 10 für halbschrittbetrieb U, UV, V, VW, W, WU
42
            case 4: PORT_MOT &= ~(1 << PAD_MOT_W);
43
                    PORT_MOT &= ~(1 << PAD_MOT_V);
44
                    PORT_MOT |= (1 << PAD_MOT_U);
45
                    break;
46
            case 5: PORT_MOT &= ~(1 << PAD_MOT_W);
47
                    PORT_MOT |= (1 << PAD_MOT_U);
48
                    PORT_MOT |= (1 << PAD_MOT_V);
49
                    break;
50
            case 6: PORT_MOT &= ~(1 << PAD_MOT_W);
51
                    PORT_MOT &= ~(1 << PAD_MOT_U);
52
                    PORT_MOT |= (1 << PAD_MOT_V);
53
                    break;
54
            case 7: PORT_MOT &= ~(1 << PAD_MOT_U);
55
                    PORT_MOT |= (1 << PAD_MOT_V);
56
                    PORT_MOT |= (1 << PAD_MOT_W);
57
                    break;
58
            case 8: PORT_MOT &= ~(1 << PAD_MOT_V);
59
                    PORT_MOT &= ~(1 << PAD_MOT_U);
60
                    PORT_MOT |= (1 << PAD_MOT_W);
61
                    break;
62
            case 9: PORT_MOT &= ~(1 << PAD_MOT_V);
63
                    PORT_MOT |= (1 << PAD_MOT_W);
64
                    PORT_MOT |= (1 << PAD_MOT_U);
65
                    break;
66
            case 10: ;
67
        }
68

69
        // Schrittzähler "count" zur steuerung der Schrittkette
70
        count++;
71

72
        // Überlauf des Schrittkettenzählers
73
        if (count == 3)
74
            count = 0;
75

76
        if (count == 10)
77
            count = 4;
78

79
        // Blinklicht zur visualisierung der While-Schleife
80
        PORT_LED ^= (1 << PAD_LED);
81

82
        // Warten
83
        wait_10ms (ADC_Read_Avg(0, 4));
84
    }
85
}

Nun bitte ich um Anregungen und Kommentare von eurer Seite.
- Verbesserungsvorschläge für's Programm.
- Wie begrenze ich den Motorstrom (Schaltung oder Software PWM?).
- Optimierung der Geschwindigkeitsvorgabe durch den Poti am ADC.

Bin gespannt auf Eure Antworten.
Viele Grüße Michael

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren