Forum: Mikrocontroller und Digitale Elektronik C Programcode für Motorsteurung


von sammirou (Gast)


Angehängte Dateien:

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

von gigigigi (Gast)


Lesenswert?

Hier steht wie man einen Port als Ausgang auf 0/1 setzt. Damit kannst Du 
den Motor ein/ausschalten:

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ausg.C3.A4nge

von sammirou (Gast)


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 :(

von Long Don (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Code, um eine LED anzusteuern, hätte ich ja, aber ob der auch für einen 
Motor passt?

Oliver

von remi (Gast)


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 :(

von remi (Gast)


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();
      }
   }
}

von Stefan F. (Gast)


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.

von Der Andere (Gast)


Lesenswert?

Hallo Stefanus:
Der TO hat dazu schon 4 Threads unter verschiedenen Namen laufen:
Siehe Beitrag "Atmel Code in C zur Motorsteuerung"
unten sind die Links auf die anderen Threads.

Da sollte man nicht mehr antworten, sondern ein Mod aufräumen.

von remi (Gast)


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?

von wie schwer ists denn (Gast)


Lesenswert?

Wie schwer ists denn das rauszulesen?

von Stefan F. (Gast)


Lesenswert?

Wenn der Motor an Pin PB7 angeschlossen ist, dann setze diesen Per 
Software auf High.

von Bernhard R. (b-r)


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...

von Amateur (Gast)


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...

von remi (Gast)



Lesenswert?

Hallo zusammen,

ich habe die fertige Schaltung angehängt, wie ihr das sieht ich benutze 
den PIN PD0 von meinem Board, ich habe versucht den PIN auf High zu 
setzen hat der Motor sich aber nicht gedreht

von Der Andere (Gast)


Lesenswert?

Dann nimm dein Multimeter und mess mal ob der Pin schaltet und falls ja 
ob der Transistor schaltet.
Stell dich nicht an wie ein 4jähriger, benutze dein Hirn, dafür ist es 
da.

von Stefan F. (Gast)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

Mal ganz blöd gefragt ... die einzige Energiequelle auf den Bildern ist 
doch der USB-Anschluss .. richtig?

OK, dann wundert es mich nicht, dass der Motor nicht anläuft.

von Paul B. (paul_baumann)


Lesenswert?

Holger schrieb:
> OK, dann wundert es mich nicht, dass der Motor nicht anläuft.

Da muß man mit > 24 Volt dran, dann läuft der Motor an -und zwar blau
;-)
MfG Paul

von remi (Gast)


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.

von Holger (Gast)


Lesenswert?

Kann es evtl. sein, dass die Spannung vom USB derart zusammenbricht, 
wenn der Motor anläuft, dass Dein Controller komische Sachen macht.
Neu starten wäre noch das harmloseste.

von remi (Gast)


Lesenswert?

Ja die Energiequelle ist der USB Anschluß

von remi (Gast)


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.

von remi (Gast)


Lesenswert?

mache ich da irgendwas falsch :(

von Karll (Gast)


Lesenswert?

Ich würde den grünen Draht durchtrennen.

von remi (Gast)


Lesenswert?

Welcher grünen Draht?

von Stefan F. (Gast)


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.

von remi (Gast)


Lesenswert?

ja ein PNP BC327 Transistor

von remi (Gast)


Lesenswert?

das wurde auch mir empfohlen dieser Transistor zu nehmen

von remi (Gast)


Lesenswert?

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

von experte (Gast)


Lesenswert?

ja, leider schon.

von Robert C. (anykey)


Lesenswert?

Na dann schau doch mal in deinen Schaltplan und denk scharf nach.
Hast du einen NPN zur Hand, dann steck den mal in die Schaltung.

Gruß Robert

von Michael B. (laberkopp)


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.

von remi (Gast)


Lesenswert?

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

von remi (Gast)


Lesenswert?

kann ich das mit BC547C Transistor ausprobieren?

von Manni (Gast)


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.

von Stefan F. (Gast)


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.

von remi (Gast)


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.

von Der Andere (Gast)


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

von Route_66 H. (route_66)


Lesenswert?

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

Warum hast du dann diesen Thread eröffnet? Der Titel sagt jedenfalls, 
daß du von Software auch keine Ahnung hast. Aus den unzähligen 
Parallelpostings kann man das ebenfalls entnehmen.

von Stefan F. (Gast)


Lesenswert?

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

Ja, wenn der Motor ihn nicht überlastet.
Wieviel Strom zieht der Motor denn beim Anlaufen?

von Manni (Gast)


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.

von remi (Gast)


Lesenswert?

Stefan schrieb:
> Ja, wenn der Motor ihn nicht überlastet.
> Wieviel Strom zieht der Motor denn beim Anlaufen?

  der Motor hat ein Anlaufstrom von 80mA

von Ralf G. (ralg)


Lesenswert?

remi schrieb:
> der Motor hat ein Anlaufstrom von 80mA
:-/

Welcher kommt denn deinem Motor am nächsten? Vielleicht steht er ja 
sogar in der Liste?
http://www.mabuchi-motor.co.jp/en_US/product/p_0306.html

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Na dann kannst du den Transistor nehmen.

von remi (Gast)


Lesenswert?

Ralf schrieb:
>Welcher kommt denn deinem Motor am nächsten? Vielleicht steht er ja
>sogar in der Liste?

das ist der Flat Typ

von Günter M. (redround)


Lesenswert?

aha ... und welcher von den Flat Typen? FC-286SB ist z. B. ein Flat-Typ 
und hat einen Blockier-Strom von 1,5 A bei 12 Volt ... also nix mit 80 
mA!!!

: Bearbeitet durch User
von Ralf G. (ralg)


Lesenswert?

Günter M. schrieb:
> aha ... und welcher von den Flat Typen?

Wollt' ich auch gerade fragen. Da gibt' 27 verschiedene.

@remi
Willst du nicht mal ein wenig mitarbeiten?

von remi (Gast)


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;
}

von Günter M. (redround)


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.

: Bearbeitet durch User
von Le X. (lex_91)


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!

: Bearbeitet durch User
von Carsten R. (kaffeetante)


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.

: Bearbeitet durch User
von experte (Gast)


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

von remi (Gast)


Lesenswert?

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

von Le X. (lex_91)


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.

von Stefan F. (Gast)


Lesenswert?

> Es hat geklappt, alles funktioniert wunderbar :)

Warum klappt es jetzt? Wo war der Fehler?

von schaltplan (Gast)


Lesenswert?

@Stefan Us:  Nette Frage und auch berechtigt. Aber ein Troll wird sich 
doch nicht herablassen irgendwelche Antworten zu geben.

von remi (Gast)


Lesenswert?

@ Schaltplan :) :) :)
@ Stefan es lag an dem flashen vom Code auf dem Mikrocontroller
ich habe eine andere Baudrate genommen und zwar 125000

von remi (Gast)


Lesenswert?

@ Stefan:
 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

von Günter M. (redround)


Lesenswert?

und hättest Du mit einem Multimeter nachgemessen wie schon vor langem 
vorgeschlagen, hättest Du gesehen, dass der MC nix tut. Wir geben solche 
Tipps doch nicht aus Langeweile!

von remi (Gast)


Lesenswert?

ja habe ich gemessen aber ich bin nicht auf die Idee gekommen dass die 
Baudrate von meinem Flash Programm geändert werden muss.

von Günter M. (redround)


Lesenswert?

wenn Du gemessen hast, warum hast Du uns dann nicht gesagt, dass der PIN 
nicht umschaltet? Das hätte uns das ganze Rätselraten um die Hardware 
(Motor / Transistor) erspart!

von remi (Gast)


Lesenswert?

ja ich war durcheinander :(

von remi (Gast)


Lesenswert?

die alle letzte Frage:

ich würde gerne meine Schaltung nicht direkt von dem Mikrocontroller mit 
5v versorgen.
was gibt's da für alternativen oder Bauteile die ich brauchen werde?

von Carsten R. (kaffeetante)


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.

von remi (Gast)


Lesenswert?

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?

von remi (Gast)


Lesenswert?

oder brauche ich noch andere Bauteile dazu?

von Manni (Gast)


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.

von Wolf W. (pansensuppe)


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 :)

von Stefan F. (Gast)


Lesenswert?

Schaltungsvorschläge findest du in der Artikelsammlung, sogar ganz 
konkret für diesen Fall.
Und ja, der Motor kann eine eigene andere Spannungsversorgung haben.

von remi (Gast)


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)
      }
   }
}

von Stefan F. (Gast)


Lesenswert?

> allerdings weiß ich nicht welche Bits ich auf 1 setzen soll.

Wo willst du ein Bit auf 1 Setzen, warum und welcher Pin ist denn der 
gewünschte PWM Ausgang?

von remi (Gast)


Lesenswert?

PB7 ist der PWM Pin und den soll ich benutzen und dessen BITS 
initialisieren

von remi (Gast)


Lesenswert?

was in meiner Code falsch gemacht glaube ich

von doedel (Gast)


Lesenswert?

lies Dir das Tutorial über Timer durch 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer und das über 
Interrupts 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts 
... und zwar so lange, bis Du sie verstanden hast ... und dann wirst Du 
sehen, was bei Dir noch fehlt.

von Stefan F. (Gast)


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.

von remi (Gast)


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

von Stefan F. (Gast)


Lesenswert?

Jetzt hast du TCCR1A nicht initialisiert. Das ist schon nach wie vor 
nötig.

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
Noch kein Account? Hier anmelden.