C Programcode für Motorsteurung

Gast #4514665
Lesenswert?

Hallo zusammen,

ich arbeite mit dem AT90CAN128 Mikrocontroller, ich benutze dafür Atmel 
Studio 7 und will damit ein Motor starten.
Die Schaltung habe ich schon gebaut nun brauche ich nur die Beispiel 
Code  dafür in C Sprache.
kann mir jemand da helfen?

vielen dank
Angehängte Dateien:
Gast #4514683
Lesenswert?

Danke gigigigi
das habe ich schon benutzt aber ich kriege in der Stelle immer Fehler, 
deswegen wollte ich fragen ob jemanden schon eine Code hat damit ich das 
ganze erstmals testen kann. Ich brauche ein einfaches Beispiel um den 
Motor zu starten da ich mit Software nicht wirklich gut auskenne :(
Gast #4514732
Lesenswert?

sammirou schrieb:
> Danke gigigigi
> das habe ich schon benutzt aber ich kriege in der Stelle immer Fehler,
> deswegen wollte ich fragen ob jemanden schon eine Code hat damit ich das
> ganze erstmals testen kann. Ich brauche ein einfaches Beispiel um den
> Motor zu starten da ich mit Software nicht wirklich gut auskenne :(

Dann poste Deinen Code.
Den Fehler finden wir schon.
Gast #4515884
Lesenswert?

Hallo zusammen,

ich habe folgende Code geschrieben und habe die auf dem at90can128 
Mikrocontroller geflasht ist aber nix passiert.
Hat es mit der Bits Initialisierung was zu tun?
Habe ich die richtigen Bits benutzt?

der Motor soll seine Geschwindigkeit erhöhen dann wieder langsamer 
drehen.
was mache ich da falsch :(
Gast #4515894
Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#define F_CPU 16000000ULL


#include <util/delay.h>

void InitPWM()
{

   TCCR0A|=(1<<WGM00)|(1<<WGM01)|(1<<COM0A1)|(1<<CS00);

   DDRB|=(1<<PB7);
}


void SetPWMOutput(uint8_t duty)
{
   OCR0A=duty;
}



void Wait()
{
 _delay_loop_2(3200);
}

void main()
{
   uint8_t speed=0;

   //Initialize PWM Channel 0
   InitPWM();



   while(1)
   {
      //Now Loop with increasing speed

      for(speed=0;speed<255;speed++)
      {
         //Now Set The speed using PWM

         SetPWMOutput(speed);

         //Now Wait For Some Time
         Wait();
      }

      //Now Loop with decreasing speed

      for(speed=255;speed>0;speed--)
      {
         //Now Set The speed using PWM

         SetPWMOutput(speed);

         //Now Wait For Some Time
         Wait();
      }
   }
}
Gast #4515932
Lesenswert?

Setze doch erstmal einfach den nur Pin auf High (und dass den ganzen PWM 
Kram raus), dann sollte der Motor mit maximaler Drahzahl laufen.

Danach sehen wir weiter.

Bis du sicher, dass  _delay_loop_2(3200) die gewünschte Zeit dauert? Ich 
würde _delay_ms() verwenden.
Gast #4515963
Lesenswert?

Ich habe verschiedene Fragen gestellt deswegen auch verschiedene Pseudo 
damit ich die unterscheiden kann ich habe nix zu verstecken!!!!
und trotzdem sehe ich da kein Problem.

Danke Stefan
aber Welche PIN soll ich nehmen, ich habe mein Mikrocontroller an PB7 
mit dem Motor verbunden und das ist doch der PWM Port für at90can128, 
den soll ich auf High setzen?
#4516014
Lesenswert?

remi schrieb:
> Ich habe verschiedene Fragen gestellt deswegen auch verschiedene Pseudo
> damit ich die unterscheiden kann ich habe nix zu verstecken!!!!
> und trotzdem sehe ich da kein Problem.
>
> Danke Stefan
> aber Welche PIN soll ich nehmen, ich habe mein Mikrocontroller an PB7
> mit dem Motor verbunden und das ist doch der PWM Port für at90can128,
> den soll ich auf High setzen?

Doch, das Problem ist, dass du ähnliche Fragen in verschiedenen Threads 
gestellt hast, und wir sollen uns jetzt ein Gesamtbild vorstellen...

Mach doch mal ein Foto von deinem Aufbau, würde mich interessieren, und 
kann nur hilfreich sein...
Gast #4516047
Lesenswert?

Zu praktisch allen Mikrokontrollern gibt es das Äquivalent zum 
Hello-World aus der 08/15-C-Programmierung.

Da wird ein Pin ein und wieder ausgeschaltet (Blink).

Das sollte auch ein Anfänger lesen können (sonst vergiss Dein Vorhaben).

Ändere einfach die verwendete Zeit und schließe den Motor, an den 
verwendeten Pin an. Alternativ kannst Du ja auch gucken, welcher Pin im 
Beispiel verwendet wird, und diesen an Deine Strippen anpassen.

Muss aber nicht sein...
Gast #4517213
Lesenswert?

wenn ich den Motor an VCC anschließe dreht sich der Motor schon.
Ich wollte aber den PIN PD0 oder irgend ein PIN benutzen und das in 
meiner Code anpassen und dann meine Code auf dem Mikrocontroller flashe 
sodass der Motor dann auch startet.
Gast #4517231
Lesenswert?

#define F_CPU 16000000UL       //Taktfrequenz 1MHz

#include <avr/io.h>
#include <util/delay.h>


int main(void){
  DDRD |= (1 << PD0);       // damit ist dann PD0 ein Ausgang

  while(1){
    PORTD |= (1 << PD0);  //PD0 High
  }

  return 0;
}



Diese Code habe ich geschrieben.
Gast #4517285
Lesenswert?

> Stecke mal das rote Kabel von PD0 ab und direkt an VCC. Dann sollte
> sich der Motor drehen. Es sei denn, der Transistor ist kaputt

Hast du den Transistor überprüft?

Wes für ein Typ ist das überhaupt? Nicht dass du versehentlich einen PNP 
verwendest, oder so.
#4517349
Lesenswert?

remi schrieb:
> ja ein PNP BC327 Transistor
remi schrieb:
> das wurde auch mir empfohlen dieser Transistor zu nehmen

Ja, von Stefan Us in
Beitrag "Re: Elektronik Bauteile um Motor zu starten mit AT90CAN"

Der schreibt aber sowieso nur Blödsinn.

> ist es falsch so einen Transistor bei dieser Schaltung zu benutzen?

So ist es. Du benötigst einen NPN Transistor wie mindestens BC337.
Oder besser einen, der auch den Anlaufstrom des Motors überlebt.

Falls es der Pollin Motor ist, der blockiert ca. 360mA an 10V zieht,
dann reicht der BC337 und der Vorwiderstand Rb von 100 Ohm passt auch 
wenn der uC mit 3.3V läuft.
Gast #4517437
Lesenswert?

remi schrieb:
> Der Mikrocontroller läuft mit 5V Spannung.
> wird es auch gehen wenn ich ein BC547C Transistor nehme?
> es geht um einen Mabuchi Motor PAT

Wie stellst du dir das eigentlich vor?
Willst du jedes kleine Detailproblem hier nachfragen und jedesmal 100 
Leute beschäftigen, für dich nachzudenken?

Es ist doch nicht zuviel verlangt, sich mal über die Funktionsweise und 
die Eigenschaften von Transistoren klar zu werden, das ganze 
überschlägig durchzurechnen und ein Miniprogram zum Schalten eines Ports 
zu schreiben.

Wenn du später im E-Technikbereich arbeiten willst, musst du dringend 
als erstes lernen, so kleine Probleme selbst zu lösen. Wenn du immer 
gleich jemanden fragst, nur weil du nach 2 Stunden nachdenken noch nicht 
auf die Lösung gekommen bist, ist das nichts für dich.

Komm wieder her, wenn du dir ein ganzes Wochenende um die Ohren gehauen 
hast und dann immer noch nicht weiter gekommen bist.
Und bemühe dich bitte dringend, schlauere Fragen zu stellen.
Gast #4517444
Lesenswert?

Ich habe dir in dem anderen Thread den BC327 als NPN empfohlen.
Das ist falsch. Es hätte der BC337 sein sollen.

Bei allen anderen NPN/PNP Pärchen hat der NPN Typ immer die kleinere 
Nummer. Zum Beispiel BC458 und BC558. Blöder Fallstrick.

> wird es auch gehen wenn ich ein BC547C Transistor nehme?

Ja, wenn der Motor ihn nicht überlastet.
Gast #4517448
Lesenswert?

sorry aber ich kenne mich mit so was nicht richtig gut aus, und wollte 
nur grade wissen ob ich den BC547C Transistor, den ich jetzt zu 
Verfügung habe, benutzen darf.
Ich arbeite mehr mit Software und programmiere gerne aber mit Hardware 
kenne ich mich nicht gut aus.
danke trotzdem für eure Antworten.
Gast #4517454
Lesenswert?

remi schrieb:
> Ich arbeite mehr mit Software und programmiere gerne aber mit Hardware
> kenne ich mich nicht gut aus.

Ja das sieht man an deiner Eingangsfrage:

sammirou schrieb:
> Die Schaltung habe ich schon gebaut nun brauche ich nur die Beispiel
> Code  dafür in C Sprache.

Übrigens ist es NICHT ERWÜNSCHT in einem Thread unter verschiedenen 
Namen zu posten.
Les mal die Netiquette
Gast #4517461
Lesenswert?

remi schrieb:
> Ich arbeite mehr mit Software und programmiere gerne aber mit Hardware
> kenne ich mich nicht gut aus.

Du erzählst Blödsinn.

Oben hattest du geschrieben, dass du die Hardware schon hast und nur ein
Beispiel C-Code brauchst. Also kennst du dich auch mit den einfachsten 
Software-Themen nicht aus.

So funktioniert das nicht. Das, was du machen willst ist wirklich sehr 
einfach. Und mit den Antworten, die bisher kamen, müsste das Thema auf 
jeden Fall geklärt sein. Wenn du immernoch Fragen hast, solltest du 
überlegen, ob das das Richtige für dich ist.

Also: Bald ist Ostern. Viel Zeit, mal grundlegend nachzudenken. Komm 
nach Ostern wieder, aber bitte mit schlauen Fragen.
Gast #4518285
Lesenswert?

Leute ich weiß dass ich nerve aber ich habe jetzt den anderen BC547C 
Transistor genommen und es hat auch nicht funktioniert,
meine Code ist doch richtig geschrieben oder? :

#define F_CPU 16000000UL       //Taktfrequenz 16MHz

#include <avr/io.h>
#include <util/delay.h>


int main(void){
  DDRD |= (1 << PD0);       // damit ist dann PD0 ein Ausgang

  while(1){
    PORTD |= (1 << PD0);  //PD0 High
  }

  return 0;
}
#4518338
Lesenswert?

Da wir immer noch nicht wissen, welchen Motor Du hast, wissen wir auch 
immer noch nicht, ob das mit dem Transistor überhaupt geht. Wenn nicht, 
dann brennt einfach der Transistor jedesmal durch. Hast Du den Rat schon 
befolgt, mit dem Multimeter einfach mal zu messen, ob der Pin auf HIGH 
schaltet?

PS: fang einfach an und nimm statt dem Motor erstmal eine LED mit 
Vorwiderstand direkt an den Port-Pin. Wenn die dann blinkt, dann versuch 
sie nicht direkt sondern per Transistor zum Blinken zu bringen. Und erst 
wenn das auch geht, kannst Du einen Motor an den Transistor hängen. Bis 
dahin weißt Du dann hoffentlich auch endlich, welcher Motor GENAU es 
ist.
#4518357
Lesenswert?

remi schrieb:
> Leute ich weiß dass ich nerve aber ich habe jetzt den anderen BC547C
> Transistor genommen und es hat auch nicht funktioniert,
> meine Code ist doch richtig geschrieben oder? :

Geh doch mal systematischer vor, dass ist ja ein Trauerspiel hier...

1) Häng den Motor direkt an GND und VCC. Dreht er sich -> weiter mit 2)

2) Hänge nun den Motor an einen (NPN)-Transistor, wieder zwischen GND 
und VCC. Die Basis legst du über einen Vorwiderstand ebenfalls auf VCC. 
Der Transistor müsste also dauernd durchschalten und der Motor sich 
drehen -> wenn alles i.O. weiter mit 3)

3) nun hängst du die Basis (über einen Vorwiderstand) an den digitalen 
Ausgang eines Controllers. Schreibe ein Programm, das den Pin auf VCC 
schaltet. -> Dreht sich der Motor -> 4)

4) Schreibe das Programm um so dass der Pin alle 2-3s zwischen GND und 
VCC toggelt. Motor soll nun abwechselnd Bremsen und Beschleunigen

5) Schreibe das Programm um so dass der Pin mittels PWM angesteuert 
wird.

Mach das mal.
Dadurch handelst du dir immer nur eine Unbekannte ein und kannst Fehler 
eingrenzen.
Und, wenn was nicht klappt: Multimeter und Messen!
#4518380
Lesenswert?

remi schrieb:
> Ich habe verschiedene Fragen gestellt deswegen auch verschiedene Pseudo
> damit ich die unterscheiden kann ich habe nix zu verstecken!!!!
> und trotzdem sehe ich da kein Problem.

remi = Sammirou?

Das hat man davon wenn man zu einer Sache zu jeder Teilaufgabe einen 
eigenen Thread beginnt, und dazu auch noch unter verschiedenen Nicks. 
Verwirrung. Und wir dürfen puzzeln.

sammirou schrieb:
> Ich brauche ein einfaches Beispiel um den
> Motor zu starten da ich mit Software nicht wirklich gut auskenne :(

remi schrieb:
> Ich arbeite mehr mit Software und programmiere gerne aber mit Hardware
> kenne ich mich nicht gut aus.

???

Aber jetzt mal Konstruktiv:

Du rätselst noch immer über den Transistor. Warum setzt du nicht die 
Vorschläge um?

Vergiss zunächst den Transistor und teste dein Programm mit einer LED. 
Dann hast du nicht zwei Baustellen gleichzeitig und kannst den Fehler 
zuordnen. Lasse sie zuerst blinken. Sonst steht man da und denkt die 
Software funktioniert nicht obwohl nur die Pole vertauscht wurden.


remi schrieb:
> wenn ich den Motor an VCC anschließe dreht sich der Motor schon.
> Ich wollte aber den PIN PD0 oder irgend ein PIN benutzen und das in
> meiner Code anpassen und dann meine Code auf dem Mikrocontroller flashe
> sodass der Motor dann auch startet.

Du sollst nicht den Motor an Vcc anschließen sndern Motor wie geplant 
anschließen und ihn mit Transistor manuell testen, also den Transistor 
bzw seinen Basisvorwiderstand auf + legen.

Wenn du das gemeint hast und ich dich nur mißverstanden habe:
Mit dem "falschen" Transistor hat das ja geklappt. Ich wette dann klappt 
das mit dem richtigen nicht. Folglich wäre die Schaltung falsch.
Gast #4518387
Lesenswert?

Alles in allem hat remi hier anschaulich nachgewiesen, dass er nicht 
systematisch, also ingenieursmäßig, vorgehen kann und selbst die 
grundlegensten hard- und softwareseitigen Zusammenhänge nicht versteht 
und - noch viel schlimmer - nicht eigenständig erarbeiten kann.

Die Schlussfolgerung lautet deshalb: Falscher Beruf
#4518500
Lesenswert?

remi schrieb:
> Danke Stefan und Le X .Es hat geklappt, alles funktioniert wunderbar :)
> Sorry für die Störung

Merk dir am Besten für die Zukunft: immer kleine Schritte machen. Nur 
immer eine Unbekannte einführen. Alle Teilprobleme einzeln lösen.

Niemand entwickelt eine komplexe Schaltung, schreibt eine dicke Firmware 
dafür und erwartet dann, das alles sofort funktioniert.
#4519575
Lesenswert?

remi schrieb:
> kann ich irgendwie meinen Motor extra mit Spannung versorgen sodass ich
> nicht die Spannung von dem VCC des Mikrocontroller nehme?
> Als Schutz für den Mikrocontroller

Ja, das ist sogar üblich so. Bei deinem Schaltplan bin ich auch davon 
ausgegangen daß du das schon so machst.

Man muß aber in der Regel den Masseanschluß beider Stromversorgungen an 
geeigneter Stelle miteinander Verbinden. Es gibt auch Bauarten, bei 
denen das nicht muß, aber in deiner Kostruktion ist es notwendig und du 
hast es auch schon passend im Schaltplan stehen.
Gast #4519826
Lesenswert?

Du hattest doch vorhin geschrieben, dass das deine letzte Frage ist.

Dir muss man wirklich alles vorkauen. Hast du keine Lust, selbst 
nachzudenken oder bist du dazu nicht in der Lage???

Irgendwo hattest du auch geschrieben, dass es um eine wissenschaftliche 
Arbeit geht. Von wissenschaftlichem Arbeiten merkt man bei dir nix.

Ich hoffe, dir beantwortet hier keiner mehr irgend eine Frage, bis du 
mal zeigst, dass du auch selbst was auf die Reihe kriegst.
#4519862
Lesenswert?

remi schrieb:
> ich werde eine stabilisierte Spannungsquelle mit 5V Spannung und dazu
> ein Optokoppler nehmen um das ganze galvanisch zu trennen.
> Hat jemanden schon damit gearbeitet?
> was kann man da empfehlen?

Wie schon mal geschrieben. Galvanische Trennung ist hier nicht unbedingt 
notwendig (und wird natürlich die Sache komplizierter und 
fehlerträchtiger machen). Deshalb, einfach erstmal die Motor-Stromquelle 
dort anschließen wie in deinem Schaltplan eingezeichnet.
Und Masse ist eben Masse für alles.
Wenn das funktioniert kannste immer noch galvanisch trenne. Oder auch 
optisch, oder akustisch, oder mechanisch oder wie auch immmer :)
Gast #4522290
Lesenswert?

Hallo zusammen,

alles funktioniert wunderbar mit eigenem Spannungsversorgung, nun habe 
ich eine Code geschrieben um PWM als Ausgang PIN zu setzen, allerdings 
weiß ich nicht welche Bits ich auf 1 setzen soll.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#define F_CPU 16000000ULL


#include <util/delay.h>

void InitPWM()
{

   TCCR0A|=(1<<WGM00)|(1<<WGM01)|(1<<COM0A1)|(1<<CS00);

   DDRB|=(1<<PB7);
}


void SetPWMOutput(uint8_t duty)
{
   OCR1A=duty;
}




void main()
{
   uint8_t speed=0;

   //Initialize PWM Channel 0
   InitPWM();



   while(1)
   {
      //Now Loop with increasing speed

      for(speed=0;speed<255;speed++)
      {
         //Now Set The speed using PWM

         SetPWMOutput(speed);

         //Now Wait For Some Time
         _delay_ms(2000)
      }

      //Now Loop with decreasing speed

      for(speed=255;speed>0;speed--)
      {
         //Now Set The speed using PWM

         SetPWMOutput(speed);

         //Now Wait For Some Time
        _delay_ms(2000)
      }
   }
}
Gast #4522487
Lesenswert?

Es soll also PB7 sein. Jetzt wollte ich gerade prüfen, ob der Pin 
überhaupt PWM Funktionalität hat, da fällt mir auf, dass die wichtigste 
Frage noch gar nicht gestellt wurde:

Um welchen Mikrocontroller geht es?

Du hast das Bit COM0A1 gesetzt, damit aktivierst du den PWM Ausgang 
OC0A1.

Beim ATmega48, 88, 168, 328 ist das der Pin PD6.

Wenn du andere Pins als PWM Ausgang verwenden willst, als von der 
Hardware vorgesehen, dann musst du COM0A1 auf 0 setzen und stattdessen 
mit Interruptroutinen arbeiten.

Die werden aber deine delay() Befehle stören, so dass deren Timing nicht 
mehr genau eingehalten wird.

Fehler: Das TCCR0A Register hat kein CS00 Bit. Du bist da beim falschen 
Register.

Außerdem: Bist du sicher, dass du keinen Prescaler verwenden willst? 
Dein Counter wird dann mit den vollen 16Mhz getaktet. Bei der hohen 
Frequenz kannst du Interruptroutinen vergessen. Die versauen Dir das 
ganze Timing.
Gast #4522529
Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#define F_CPU 16000000ULL


#include <util/delay.h>


void InitPWM()
{

TCCR1B = 
(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10 
);

DDRB |= (1 << DDB6);  //port b6
}





void SetPWMOutput(uint8_t duty)
{
  OCR1B=duty;
}



// void Wait()
// {
//   _delay_loop_2(3200);
// }

void main()
{
  uint8_t speed=0;

  //Initialize PWM Channel 0
  InitPWM();



  while(1)
  {
    //Now Loop with increasing speed

    for(speed=0;speed<255;speed++)
    {
      //Now Set The speed using PWM

      SetPWMOutput(speed);

      //Now Wait For Some Time
      _delay_ms(2000);
    }

    //Now Loop with decreasing speed

    for(speed=255;speed>0;speed--)
    {
      //Now Set The speed using PWM

      SetPWMOutput(speed);

      //Now Wait For Some Time
       _delay_ms(2000);

    }
  }
}

ist OCR1B=duty; richtig verwendet?
weil ich denke dass void InitPWM()
richtig geschrieben ist

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