Forum: Mikrocontroller und Digitale Elektronik Endstufe für CD-Laufwerk-Brushless-Motoren mit Atmega8


von Michael Z. (zellm)


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

von Michael Z. (zellm)


Angehängte Dateien:

Lesenswert?

Ergänzend noch die komplette main.c im Anhang.

Der Code stammt größtenteils aus Beispielen aus diesem Forum.
An dieser Stelle Vielen Dank für die Super Erklärungen!

von gaast (Gast)


Lesenswert?


von Michael Z. (zellm)


Lesenswert?

Hallo du anonymer gaast,

vielen Dank für deinen Hinweis! :)

ich schau mir das mal genauer an!
(hoffentlich steige ich mit meinen bescheidenen uC Kenntnissen da auch 
durch)

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.