application note bldc

Gast #1700196
Lesenswert?

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.
Gast #1700249
Lesenswert?

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.
Gast #1702778
Lesenswert?

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.
#1862252
Lesenswert?

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

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