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
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 :(
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.
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 :(
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.
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.
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?
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...
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...
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
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.
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.
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.
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
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.
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.
#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.
> 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.
remi schrieb:> ja ein PNP BC327 Transistorremi 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.
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.
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.
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.
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
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.
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.
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?
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;
}
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.
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!
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.
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
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.
@ 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
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!
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!
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?
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.
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?
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.
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 :)
Schaltungsvorschläge findest du in der Artikelsammlung, sogar ganz
konkret für diesen Fall.
Und ja, der Motor kann eine eigene andere Spannungsversorgung haben.
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)
}
}
}
> 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?
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.