Hallo ich wollte mal fragen ob einer schonmal den application note AVR447 ( Sinusoidal driving of three-phase permanent magnet motor using ATmega48/88/168 ) von Atmel ausprobiert hat und mir helfen könnte. Ich versuche das jetzt schon eine Ewigkeit. Ich benutze IAR Embedded Workbench IDE und gehe dort auf "release" und dann "Rebuild all" Natürlich mache ich auch die in Doxigen aufgelisteten nötigen Einstellungen in den options. Dann erhalte ich eine Datei mit .a90 am Ende. Dann wechsel ich zu AVR Studio und speichere damit diese Datei im Atmega48. Ist das soweit sconmal richtig oder darf ich vielleicht nicht avr-Studio verwenden? Es läuft überhaupt nicht.
Das habe ich mir nämlich auch gedacht mit der .hex Datei. Das ganze Programm ist ziemlich gut mit Doxigen dokumentiert und da stehen unter anderem auch einige vorzunehmende Einstellungen für IAR Embedded Workbench drin. Welches Programm dehme ich dann am besten um den code in den Controller zu kriegen. So wie ich das sehe, kann IAR Embedded Workbench das nämlich nicht.
oder weiß jemand zufällig woher man noch ein Beispielprogramm zur BDLDC-Sinuskommutierung bekommen kann. Am besten für ATmega Controller
Hat jemand denn überhaupt schonmal ne Sinuskommutierung mit BLDC-Motoren hinbekommen? Egal wie.
Aber irgendjemand hat es doch bestimmt auch schonmal geschafft den application note AVR447 umzusetzen oder? Der code ist ja schon da und die Schaltung ist auch in den Unterlagen. Der code muss ja im Grunde nur noch in den Controller gebracht werden. Es will einfach nicht funzen.
Bin da auch gerade bei, AVR447 umzusetzen. Allerdings versuche ich, den ganzen code in AVR-GCC zu portieren. Es scheint mir eine uferlose Story zu werden. Prinzipiell funktioniert das ganze bei mir schon soweit, Interrupts sind OK. Allerdings kommt aus den Phasen-Ausgängen nichts raus. Ich vermute mal, dass da irgendwie der Wurm drin ist. Bräuchte da jemanden, der mir mal die Unterschiede zwischen IAR und AVR-GCC erklärt. Hier nur ein Beispiel aus dem AVR447, dass so nicht funktionieren kann:
1 | // #pragma inline=forced
|
2 | inline static void MotorSynchronizedUpdate(void) |
3 | {
|
4 | static uint8_t synchCount = 0; |
5 | |
6 | PMSMflags_t tempFlags; |
7 | |
8 | tempFlags = fastFlags; |
9 | |
10 | if ((tempFlags.desiredDirection == tempFlags.actualDirection) && |
11 | (tempFlags.motorStopped == FALSE) && (tempFlags.motorSynchronized == FALSE)) |
12 | {
|
13 | synchCount++; |
14 | if (synchCount >= SYNCHRONIZATION_COUNT) |
15 | {
|
16 | fastFlags.motorSynchronized = TRUE; |
17 | }
|
18 | }
|
19 | else
|
20 | {
|
21 | fastFlags.motorSynchronized = FALSE; |
22 | synchCount = 0; |
23 | }
|
24 | }
|
In der ersten Zeile wird die Variable synchCount auf Null gesetzt. Wird die erste IF-Anweisung erfüllt, wird sie um eins erhöht, hat dann den Wert=1. Die Funktion wird danach verlassen. SYNCHRONIZATION_COUNT wird durch PMSM.h auf 2 gesetzt. Dieser Wert wird allerdings nie erreicht, da beim nächsten Aufruf der Funktion der Wert von synchCount wieder auf Null gestzt wird?!?! Wundert euch bitte nicht über das auskommentierte #pragma... Ich habe nur versucht diese Zeile in AVR-GCC umzusetzen. Wäre nett, wenn irgendwer darauf eine Antwort hat. Gruß Andreas
> da beim nächsten Aufruf der Funktion der Wert > von synchCount wieder auf Null gestzt wird?!?! Falsch. synchCount ist static.
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.