application note bldc

Gast #1700196
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
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
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.