Gast
#837631
Moin! Ich habe hier schon sehr viel im Forum gesucht und leider keine passende Lösung gefunden. Folgende Aufgabenstellung: Ich muss mit einem Controller 8 PWM-Signale erzeugen um 8 Motoren anzutreiben. Dafür sind ja auch viele Beispiele vorhanden. Die Besonderheit bei mir ist aber: ich muss für JEDEN Kanal einzeln FREQUENZ, TASTVERHÄLTNIS und ob das Signal mit Low- oder High-Pegel anfängt festlegen können. Und zudem sollen die Motoren beliebig gestartet und gestoppt werden können. Ich habe folgenden Code programmiert (bin erst seit kurzem dabei, von daher nicht der sauberste :-) Meine Überlegung: ich nutze den Timerinterrupt als globalen Taktgeber, jeder Kanal hat seinen eigenen Zähler, dessen Grenzen einzeln festgelegt werden können. So wie der Code unten steht erzeugt der Zähler jede ms einen Interrupt, und ruft dann für jeden Motor die Funktion MotorControl auf, die entsprechend der Werte des Motors die PWM erzeugt. Im Beispiel unten habe ich zwei Motoren, einen mit der Periodendauer 20ms (50Hz) und einem Tastverhältnis von 0.5 (duty=10ms) und einen Motor mit Periodendauer 30ms (33,3Hz) und Tastverhältnis 1/3 (duty=10ms). Das ganze basiert auf dem Soft-PWM-Artikel-Beispiel. Habt ihr Ideen, wie man das besser lösen kann? Vor allem macht mir sorgen, dass die motorControl ja innerhalb des Interrupts achtmal aufgerufen wird, was ja wohl ziemlich ungünstig ist. Und dann fehlt noch die komplette Logik falls ich nicht mit einem High-Pegel starten will, sondern mit einem Low-Pegel.. Das Signal soll dann nicht invertiert werden, sondern genau um den Low-Pegel verschoben sein (also einfach einmal den LowPegel vorm High-Pegel durchlaufen lassen, danach nicht wieder). Ich dachte, das wäre ganz einfach, isses aber wohl doch nicht :-)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
oh, jetzt ist das ganz schön viel Text geworden, ich hoffe, es findet sich jemand, der Lust hat, das alles durchzulesen :-) ps: die Frequenzen sind später nicht sehr hoch, mit denen die Motoren angesteuert werden, die liegen im Bereich 1-5Hz (statt PWM könnte man vllt auch besser periodisches An/Ausschalten sagen, das PWM-Signal wird nicht dazu genutzt, die Drehzahl zu regulieren) pps: gleichzeitig kommuniziert der Controller noch per UART mit einem SteuerungsPC, so dass dafür auch noch Leistungsreserven übrig sein müssen