- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Motor-Treiber

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Anzeige

    Praxistest und DIY Projekte
    also normalerweise sollte der pulldown per software funktionieren.

    ich habe allerdings bisher bei meinen schaltungen mit mosfets immer noch hochohmige pulldown oder pullup widerstände mit ans gate gesetzt, um ein undefiniertes schalten zu verhindern wenn mal der ic nichts mehr macht. quasi eine analoge sicherung

    also bei n-mosfets z.B. einen pulldown mit 20k
    bei p-fets einen entsprechenden pullup widerstand.

    so bleibt der mosfet ausgeschaltet, solange der ic nichts tut.

    edit:
    mit dem p-fet irf4905, Reichelt glaub 1,30euro wären bei 5V gatespannung auch schon 15A möglich..
    http://www.ortodoxism.ro/datasheets/irf/irf4905.pdf

    als n-fet zum schalten ist der irl3803 sehr schön


    edit: ich seh grad, da oben hab ich das ja schonmal so etwa geschreiben
    GrußundTschüß \/
    ~Jürgen

  2. #12
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Hi!
    Das mit den Pullup bzw Pulldown ist ne gute Lösung um die Schaltung bei einem Fehler zu schützen, aber ne PWM kriegt man auf die Art und Weise nicht effektiv zum laufen!
    Ich bin mal gespannt auf den Programmausschnitt!

    Der IRF4905 bzw. IRF3803 gehen natürlich auch, wobei der IRF3803 bei Reichelt nicht erhältlich ist (das ist bei mir immer das KO Kriterium).

    Bast

  3. #13
    Reichelt hat den IRF3803 deshalb nicht, weil es keinen IRF3803 gibt
    Das Ding heist IRL3803 und kostet Eur 1,20 bei Reichelt.

    Gruss Tobias

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2004
    Beiträge
    23

    Quellcode

    Hey..

    Hier der Code...
    Ich habe gerade nur einen etwas anderen teil zur verfügung..
    der einzige unterschied ist nur, dass statt dem Ausgang mit einer LED der ausgang mit dem Gate genutzt wird (habt den code angepasst, könnte aber minimale abweichungen vom verwendeten haben - den poste ich heut abend - sorry)

    Hoffe das hilft bei der lösung

    MfG
    ngb

    Code:
    //-----------------------------------------------------------------------------------------//
    //-----------------------------------------------------------------------------------------//
    //                         RS485- Implementierung mit MAX 485                              //
    //                      Autor: Niels Göran Blume 2007 für ROUVus                           //
    //                               www.hardegser-sv.de/rov                                   //
    //-----------------------------------------------------------------------------------------//
    //-----------------------------------------------------------------------------------------//
    /*
       Hardware- Konzessionen:
       Atmega8 mit UART an PORTD0 und PORTD1 und Switch Receive/Send für MAX 485 an PORTD2
       Halb-Duplex
    */
    
    /*    Protokoll- Definition:
       Das Protokoll ist auf den One-Master-Multi-Slave-Betrieb ausgelegt.
       Bei entsprechender Programmierung ist auch ein eingeschränkter
       Multi-Master-Betrieb möglich.
       
       Standard: Jede Nachricht startet mit "!".
       Es folgt die Adresse des Ziels in einem Byte.
       Nun folgen 5 Datenbytes, die beliebig gefüllt werden können (Erweiterung einfach möglich).
       Am Ende steht in der Zielmaschine ein char- Array bereit, dass alle Bytes seit dem "!"
       (sprich Adresse und 5 Datenbytes) enthält.
       
       | ! | a | L | E | D | 1 | 1 | als Beispiel...
       
       An Adresse "a" ergeht die Nachricht "LED11", was vielleicht als "LED1 auf Status 1 setzen"
       interpretiert werden könnte.
    */
    
    #define F_CPU       16000000UL
    
    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include "rs485.c"
    
    int main(void)
    {
        rs485_init();                                 //USART initialisieren (8 Datenbits, no Parity, 1 Stopbit)
                                                 //Baud: 19200
       DDRD = (1<<DDD2)|(1<<DDD3);                     //Output DDD2 setzen für Send/Receive- Wechsel
                                                 //DDD3 für ne LED
       warte(5000);
       
       rs485_puts('a',"Melde mich zum Dienst ! Meine Adresse: b");
       
       sei();                                       //Interrupts enablen
       
       PORTD &= ~(1 << 1);                           //Gate-Port ausschalten
       
       while(1)                                    //Reaktion in Schleife
       {
          if (befehl_fertig == 1)                     //Befehl vorhanden
          {
             warte(5000);                           //Zeit damit ich den Sende-Mode am PC mit der Maus beenden kann
             if(strcmp(buffer, "bpwm11") == 0)            //Beispielkommando als Vergleichsgrundlage
             {                                    
                PORTD |= (1 << 1);                     //mit einzelnem Byte (&buffer[i]) | Gate an
             };
             if(strcmp(buffer, "bpwm10") == 0)            //Beispielkommando als Vergleichsgrundlage
             {                                    
                PORTD &= ~(1 << 1);                     //mit einzelnem Byte (&buffer[i]) | Gate an
             };
             befehl_fertig = 0;                        //Befehl abgearbeitet - Status zurücksetzen
          }
       };
    }

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2004
    Beiträge
    23

    Der richtige Code !

    Hey..

    hier der richtige code..
    hoffe der hilft bei der lösung

    Code:
    //-----------------------------------------------------------------------------------------//
    //-----------------------------------------------------------------------------------------//
    //                         RS485- Implementierung mit MAX 485                              //
    //                      Autor: Niels Göran Blume 2007 für ROUVus                           //
    //                               www.hardegser-sv.de/rov                                   //
    //-----------------------------------------------------------------------------------------//
    //-----------------------------------------------------------------------------------------//
    /*
    	Hardware- Konzessionen:
    	Atmega8 mit UART an PORTD0 und PORTD1 und Switch Receive/Send für MAX 485 an PORTD2
    	Halb-Duplex
    */
    
    /* 	Protokoll- Definition:
    	Das Protokoll ist auf den One-Master-Multi-Slave-Betrieb ausgelegt.
    	Bei entsprechender Programmierung ist auch ein eingeschränkter 
    	Multi-Master-Betrieb möglich.
    	
    	Standard: Jede Nachricht startet mit "!".
    	Es folgt die Adresse des Ziels in einem Byte.
    	Nun folgen 5 Datenbytes, die beliebig gefüllt werden können (Erweiterung einfach möglich).
    	Am Ende steht in der Zielmaschine ein char- Array bereit, dass alle Bytes seit dem "!" 
    	(sprich Adresse und 5 Datenbytes) enthält.
    	
    	| ! | a | L | E | D | 1 | 1 | als Beispiel...
    	
    	An Adresse "a" ergeht die Nachricht "LED11", was vielleicht als "LED1 auf Status 1 setzen"
    	interpretiert werden könnte.
    */
    
    #define F_CPU       16000000UL
    
    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include "rs485.c"
    
    int main(void)
    {
        rs485_init();											//USART initialisieren (8 Datenbits, no Parity, 1 Stopbit)
    															//Baud: 19200 
    	DDRD = (1<<DDD2)|(1<<DDD3)|(1<<DDB1);					//Output DDD2 setzen für Send/Receive- Wechsel
    															//DDD3 für ne LED und DDB1 für PowerMOSFet
    	warte(5000);
    	
    	rs485_puts('a',"Melde mich zum Dienst ! Meine Adresse: b");
    	
    	sei();													//Interrupts enablen
    	
    	PORTD &= ~(1 << 3);									//LED ausschalten
    	PORTB &= ~(1 << 1);
    	
    	while(1)												//Reaktion in Schleife
    	{
    		if (befehl_fertig == 1)							//Befehl vorhanden
    		{
    			warte(5000);									//Zeit damit ich den Sende-Mode am PC mit der Maus beenden kann
    			if(strcmp(buffer, "bled11") == 0)				//Beispielkommando als Vergleichsgrundlage
    			{												//später weitere zum Beispiel als Switch 
    				PORTD |= (1 << 3);							//mit einzelnem Byte (&buffer[i]) | LED an
    				rs485_puts('a', "led11");	
    			};
    			if(strcmp(buffer,"bled10")==0)
    			{
    				PORTD &= ~(1 << 3);
    				rs485_puts('a',"bled10");
    			};
    			if(strcmp(buffer,"bpwm11")==0)
    			{
    				PORTB |= (1 << 1);
    			};
    			if(strcmp(buffer,"bpwm10")==0)
    			{
    				PORTB &= ~(1 << 1);
    			};
    			befehl_fertig = 0;								//Befehl abgearbeitet - Status zurücksetzen
    		}
    	};
    }
    und die rs485.c:
    Code:
    #include "rs485.h"
    #define BAUD        19200UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    char buffer[7];
    int buffer_pos = 0;
    int befehl = 0;
    int address = 0;
    int befehl_fertig = 0;
    
    void warte (uint16_t loop) //loop: wartezeit in ms
    {
    	uint16_t i;
    	for(i=0;i<loop;i++) _delay_ms(1); 
    }
    
    // Empfangene Zeichen werden im Buffer gespeichert und warten dort 
    SIGNAL (SIG_UART_RECV)
    {
    	char data;
    	int i;
    	
    	data = UDR;
    	if (data == '!')
    	{
    		befehl = 1;
    		address = 0;
    		return;
    	}
    	else
    	{
    		if(befehl == 1 && address == 0)
    		{
    			if (data == 'b')							//Unsere Adresse ?
    			{
    				buffer[buffer_pos] = data;
    				buffer_pos++;
    				address = 1;
    				return;
    			}
    			else
    			{
    				befehl = 0;
    				address = 0;
    				return;
    			};
    		};	
    		
    		if(befehl == 1 && address == 1)
    		{
    			buffer[buffer_pos] = data;
    			if (buffer_pos < 5)							//Noch ein Platz frei im Buffer ?
    			{
    				buffer_pos++;							//Dann Zeiger erhöhen
    				return;
    			}
    			else
    			{
    				buffer_pos = 0;							//Wenn Buffer voll, reset an Anfang 
    				befehl = 0;								//Befehl fertig...
    				address = 0;
    				buffer[6] = '\0';
    				
    				befehl_fertig = 1;
    				return;
    			};
    		};
    	};
    }
    
    void rs485_init()
    {
    	// Baudrate einstellen (Normaler Modus)
        UBRRH = (unsigned char) (UBRR_BAUD>>8);
        UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
    
        // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
        UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    
        // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    // Um das Problem bei RS485 zu umgehen, dass nicht gleichzeitig gesendet und empfangen werden kann (2 Adern),
    // nur "direktes" Senden möglich
    
    // Einzelnes Zeichen senden
    void rs485_putc (unsigned char address, unsigned char buffer)
    {
    	while ( !(UCSRA & (1<<UDRE)));				//Warten bis UDR leer ist für Senden
    	PORTD |= (1 << 2);								//Max485 auf Senden
    	UDR = '!';										//Sendungsanfang
    	
    	while ( !(UCSRA & (1<<TXC)));					//Warten bis Senden abgeschlossen
    	UCSRA &= ~(1<<TXC);							//Gesendet-Bit löschen
    	UDR = address;									//Adresse senden
    	
    	while ( !(UCSRA & (1<<TXC)));					//Warten bis Senden abgeschlossen
    	UCSRA &= ~(1<<TXC);							//Gesendet-Bit löschen
    	UDR = buffer;									//Daten senden
    	
    	warte(100);										//MAX485-Buffer leeren lassen
    	PORTD &= ~(1 << 2);							//Max485 auf Empfang
    }
    
    // String senden
    void rs485_puts (unsigned char address, const char *s)
    {
    	while ( !(UCSRA & (1<<UDRE)));				//Warten bis UDR leer ist für Senden				
    	PORTD |= (1 << 2);								//Max485 auf Senden
    	UDR ='!';
    	
    	while ( !(UCSRA & (1<<TXC)));					//Warten, bis Senden abgeschlossen wurde
    	UCSRA &= ~(1<<TXC);							//Gesendet-Bit löschen
    	UDR = address;									//Adresse senden
    	
    	while ( !(UCSRA & (1<<TXC)));					//Warten bis Senden abgeschlossen
    	UCSRA &= ~(1<<TXC);							//Gesendet-Bit löschen
    	
    	while (*s != '\0')
    	{
    		loop_until_bit_is_set(UCSRA,UDRE);			//warte bis Datenregister frei
    		UDR = *s;									//Zeichen nach Sendedatenregister
    		s++;										//Adresse erhöhen
    	}	
    	
    	warte(100);										//MAX485-Buffer leeren lassen
    	PORTD &= ~(1 << 2);							//Max485 auf Emfang
    }
    und die rs485.h:
    Code:
    #ifndef _RS485_H_
    #define _RS485_H_
    
    extern void rs485_init();
    extern void rs485_putc(unsigned char address, unsigned char buffer);
    extern void rs485_puts(unsigned char address, const char *s);
    extern void warte(uint16_t loop);
    
    static inline void rs485_flush()
    {
    	while (UCSRB & (1 << UDRIE));
    }
    
    #endif /* _RS485_H_ */
    vielen dank für alle vorschläge im voraus !

    MfG
    ngb

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2004
    Beiträge
    23

    Hilflos

    Hallo..

    hat keiner einen tipp oder einen vorschlag wie man diesem problem mit dem gate herr werden könnte ?
    ich hänge da ziemlich..

    wäre es theoretisch und praktisch möglich das gate mit einem widerstand mit Ground zu verbinden und davon auszugehen, dass der strom erstmal das gate auflädt..
    und wenn der ATMega8- Port auf 0 gesetzt wird die Ladung über den Widerstand auf Ground abfließt ?
    und wie ist das mit dem erwähnten Tri-State ?
    Hab gerade ein bisschen gesucht, und so wie ich das verstehe kann das nur eintreten, wenn das DDR auf "0" für den Pin gesetzt ist..
    ich hab das DDR aber auf "1" für den Pin gesetzt.. (siehe Quellcode)

    ich hoffe ihr habt einen keinen tipp für mich !

    MfG
    ngb

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    17.04.2006
    Beiträge
    2.193
    Dass man für die meistens getakteten Anwendungen wie PWM dedizierte Treiber einsetzt wolltest Du ja nicht hören, welchen Rat soll man Dir also noch geben? Erfinde die Physik neu!

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    wenn shaun sein ok gibt (?)

    kannst du mit dieser TREIBERschaltung deinen port-pin entlasten..
    aus/in den ic fließen dann nur ca 10mA
    die transistoren haben ne verstärkung von mindestens 250..
    aber das high-low muß trotzdem richtig rauskommen..

    Anstatt dem mosfet kannst du auch was anderes ranhängen, das pwm signal wird so nur "verstärkt"

    Die widerstände sind für 5V berechnet..

    Wobei ich mich immernoch frage, wie du deinem ic entstörte 5V geben willst, wenn an der gleichen leitung dein motor hängt, alles auf 5V läuft, und du vor dem ic keinen spannungsregler mit beschaltung benutzt..

    Könnte es einfach sein, dass dein ic gestört wird?

    was fixiert dich auf die 5V ?
    PS.:Atmega.. hab ich keine Ahnung von
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken pwmtreiberstufe.jpg  
    GrußundTschüß \/
    ~Jürgen

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2004
    Beiträge
    23
    Hey...

    danke für die konstruktive antwort, PsiQ ...
    in bezug auf den treiber habe ich ja gerade den IRLZ34N gewählt, weil der laut datenblatt ein logic-level-mosfet (=5V) ist, oder sehe ich da was falsch ?
    das sollte doch heißen, dass ich den mit 5V schalten kann..
    ich bin aus 2 gründen auf 5V so "fixiert":
    1. ich will ein atx-netzteil als stromversorgung verwenden. diese netzteile haben nunmal einfach nur 5V und 12V (jeweils mit hohem stromfluss) und wenn ich so eins noch auf dem Dachboden liegen habe (was der fall ist), wäre es doch dämlich es nicht zu verwenden ..
    2. ich habe bei fast allen schaltungen im µC bereich 5v benutzt (atmega, RS485-RS232-wandler, TCM2-modul, ...)

    wenn die klare aussage ist, dass es mit einem treiber einfacher geht, dann werde ich darauf zurückgreifen, nur ich dachte eigentlich, dass ich den bei einem logic-level-mosfet weglassen könnte..
    und die letzten fragen waren auch mehr des verständnisses wegen (es lebe der genitiv )..
    ich hab noch nicht verstanden, warum der IRLZ34N einwandfrei schaltet, wenn ich das gate direkt mit 5V verbinde und dann zum stoppen direkt mit masse..
    wenn das der µC macht (bzw. er macht es ja eher nicht), dann geht das anschalten und dann muss der die 5V vom pin nehmen, dafür aber nicht ground anlegen..
    rein um grund für dieses verhalten ging es mir..
    wenn es mit einem treiber einfacher geht, greif ich auf meine alte kombination BTS432 und IRFP150N zurück.. (die reicht dann mehr als aus..)

    und ich habe das IC eigentlich entstört (laut tutorial - frag nicht welches..)
    ich stelle heute abend mal den schaltplan online..

    und bei einem stabilisierten netzteil wie einem atx-netzteil sollte es meines erachtens möglich sein, motoren und µC gleichzeitig anzuschließen..
    wenn dem nicht so sein sollte, habe ich ein weiteres problem gewonnen.. (im kabel zum rov müssten dann 8 adern daten (cat5e) und 3 adern spannung (5 und 12v und ground) liegen)


    MfG
    ngb

    P.S.
    @???: ich habe keinesfalls vor die physik neu zu erfinden.. und das brauche ich auch gar nicht..
    denn wenn das mit einem treiber möglich, wie sieht der denn dann aus ? da muss das ja auch funktionieren..
    und wenn du findest, dass meine fragen blöd und unsinnig sind, dann ignorier sie doch einfach, aber solche antworten sind, wie auch PsiQ deutlich gemacht hat, ziemlich überflüssig..

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    17.04.2006
    Beiträge
    2.193
    Fragen ungeachtet der bereits gegebenen Antworten zu wiederholen auch, aber wir wollen ja trotzdem alle nett zueinander sein und daher spare ich uns auch weitere Kommentare dieser Art, ok?

    Die Schaltung von PsiQ ist eine denkbare Variante eines Treibers. Die Transistoren sind als Emitterfolger geschaltet und verstärken den Strom, den der Port liefern kann, sowohl beim Ein- als auch beim Ausschalten hinreichend gut, um das Gate des MOSFET bis zu einigen kHz PWM-Frequenz schnell genug umzuladen. Die Basisvorwiderstände kannst Du zu einem einzelnen zusammenfassen und die Basen direkt verbinden, genau genommen kann er auch entfallen, dass man ihn dennoch häufig einsetzt, zielt auf Schutz des uC, Entkopplung vom Lastkreis, Vermeidung steiler Stromflanken usw ab. Also lass ihn ruhig drin.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress