www.mikrocontroller.net

Forum: Compiler & IDEs Schalten mit Atmega32


Autor: Klaus W. (overheater)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe hier einen Atmega, der über einen Hallsensor 4905 am Eingang 
INT0 Impulse zählt und somit die Drehzahl eines Motors in ms/Umdrehung 
in eine Variable schreibt. Das klappt soweit alles ausgezeichnet.

Nun soll beim Beschleunigen irgendwann ein Schaltvorgang ausgelöst 
werden und ein Ausgang gesetzt werden. Da der Motor dabei etwas 
abgebremst wird, fällt die Drehzahl etwas ab, der Motor beschleunigt 
wieder und der Schaltvorgang wiederholt sich endlos.

Ich benötige also vermutlich die Funktion eines Schmitt-Triggers, der 
beim Schalten einen gewissen Spielraum zulässt im Programm für den 
Schaltvorgang.

Wie programmiert man so eine Funktion in C?

Hysterese, ok - aber dieses annähernde Gegenteil? Alle meine Ideen haben 
nicht gegriffen, kann wer helfen?

Grüße aus dem nun kühleren Ruhrpott
Klaus

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine Hysterese.
if (drehzahl > (schwelle + Hysterese))
   SCHALT_AUSGANG_EIN;
else if (drehzahl < (schwelle - Hysterese))
   SCHALT_AUSGANG_AUS;
Sehr einfach also.

Autor: Klaus W. (overheater)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Das ist eine Hysterese.

Du hast Recht!

> Sehr einfach also.

Nochmals Recht - im Normalfall.

Hier liegt das etwas komplizierter: dieser Schaltvorgang soll den 
Motorantrieb von "analogem Beschleunigen" auf Synchronbetrieb 
umschalten.
Also in etwa so:


>
> if (drehzahl > (schwelle + Hysterese))
>    Synchronbetrieb;
> else if (drehzahl < (schwelle - Hysterese))
>    beschleunigen;
> 

Die Sinuserzeugung für den Synchronbetrieb steht unter "if" und wird 
damit eingeschaltet. Beim nächsten Schleifendurchlauf ist durch die 
Umschaltung die Drehzahl leicht abgefallen und damit wird "else if" 
angesprungen.
Weil "schwelle - Hysterese" noch nicht erreicht ist, bleibt der Motor 
einen Moment antriebslos und beschleunigt dann wieder.....

Bin für jede Idee dankbar!

nochmals Grüße aus dem Ruhrpott
Klaus

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du setzt dir in den if Abfragen nur ein Flag.

 if (drehzahl > (schwelle + Hysterese))
    sync = true;
 else if (drehzahl < (schwelle - Hysterese))
    sync = false;


if (sync)
{
  // Sinus generieren
}
else
{
...
}

Autor: Klaus W. (overheater)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hc Zimmerer, hallo Fabian,


Bingo!

Etliche Male Danke dafür!

Wieder einen Schritt weiter. Wie ihr schon gemerkt haben werdet, bin ich 
ziemlicher "Anfenger" in der Materie Mikrocontroller und dieser Sprache.

Das Grundprogramm stammt von einem netten Kollegen, der jetzt seinen 
wohlverdienten Urlaub genießt, ich tue aber schon, was ich kann, damit 
ich weiterkomme. Ich hoffe, ich darf mich nochmals melden, wenn die 
nächste größere Hürde kommt.....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.