- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 27

Thema: Strom über den Motor messen (RB40, L298, Shunt)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    16.10.2005
    Ort
    Adendorf
    Alter
    43
    Beiträge
    46
    Ok, so weit so gut.

    Ich trage nun mal zusammen wie ich den Strom messe.

    Ich verwende für die Motoren eineH-Brücke mit einem L298. An den Sense-Ausgängen sind 0.22Ohm Lastwiderstände (5W). Von Dort führe ich die Spannung über einen Tiefpass zu einem Verstärker und dann zum MC.

    Dort entspricht 5V-> 2,066A und 0V->0A. Ich kann also bis maximal 200mA den Strom des Motor messen und das in 1024 Schritten(+- 2mA).

    Das Programm ist besteht aus drei Teilen.
    dem AD-Wandler; dem Umrechnung in mA und der Ausgabe über UART.
    Die Umrechnung erfolgt immer dann, wenn der Timer0 übergelaufen ist.
    Die f_CPU Frequenz ist 11.059MHZ und der prescaler auf 64, das ergibt eine Überlaufzeit von 1.48ms. So oft wird also eine Strommessung gemacht.

    Im Anhang habe ich das Komplette AVR-GCC Projekt angefügt.
    Es enthält noch Tastenentprellen und Drehzahlmessung mit Interrups.

    Ganz zum Schluss habe ich noch den Kurvenverlauf von Strom und Drehzahl, bei einem unbelasteten Motor und sprunghaften Ein- und wieder Ausschalten.
    Ich meine, wenn man den Motor "ausrollen" lässt kann man die Trägheit ablesen. Je länger es dauert bis die Drehzahl auf 0 ist, desto Träger ist das System. Die Trägheit J entspricht dann der Steigung oder?
    Und wenn die fallende Kurve stark durchgebogen ist, ist die Reibung groß.
    Was man Zeit bis der Motor auf Drehzahl ist ablesen kann weiß ich leider nicht, müsste aber einer von euch sicher wissen

    Gruß Bronko

    Code:
    /**    
    * AD Wandler
    * Dieses Programm enthält funktionen zu auslesen der AD-Wandler
    *
    * V0.1
    */
    #include <avr/io.h> 	//I/O-Register 
    #include <stdint.h>		//standart Integertypen
    
    #include "adwandler.h"
    
    /***/
    /**		Routine zum auslesen eines einzelnen A/D-Wertes	*/		
    /***/
    uint16_t get_adc(uint8_t adc_pin)
    {
      uint8_t i;
      uint32_t result = 0;         		//Initialisieren wichtig, da lokale Variablen
    									//nicht automatisch initialisiert werden und
    									//zufällige Werte haben. Sonst kann Quatsch rauskommen
    									
      ADCSRA = (1<<ADEN) | AD_PRE;    	// Frequenzvorteiler 
    									// setzen auf 8 (1) und ADC aktivieren (1)
    
      ADMUX = adc_pin;                  // Kanal waehlen
      ADMUX |= AD_REF; 					// Referenzspannung nutzen 
      //ADMUX |=(1<<ADLAR);				// Werte linksbündig schreiben
      
      /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
         also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
      ADCSRA |= (1<<ADSC);				// eine ADC-Wandlung 
      while ( ADCSRA & (1<<ADSC) );	// auf Abschluss der Konvertierung warten 
    
      /* Eigentliche Messung: Mittelwertbildung aus MITTELWERT aufeinanderfolgenden Wandlungen */
      for(i=0;i<MITTELWERT;i++)
      {
        ADCSRA |= (1<<ADSC);         	// eine Wandlung "single conversion"
        while ( ADCSRA & (1<<ADSC) );	// auf Abschluss der Konvertierung warten
        result += ADCW;		    		// Wandlungsergebnisse aufaddieren
      }
      ADCSRA &= ~(1<<ADEN); 			// ADC deaktivieren (2)
    
      result /= MITTELWERT;        		// Summe durch MITTELWERT teilen = arithm. Mittelwert
    
      return result;	
    }
    
    /**    
    * MOTOR
    * Dieses Programm soll alle funktionen zu den Motoren beinhalten
    *
    * V0.1
    * DEfines für die Motoren definiert
    *
    * V0.2
    * Der Motorstrom kann ausgelesen werden
    * Beim Richtungswechsel oder Speed 0 Blokieren die Motoren kurz
    *
    * V0.3
    * PWM auf 21,6kHz geändert (nicht hörbar)
    * PWM läst sich nun mit 9 bit einstellen
    *
    * V0.4
    * Drehzahlmessung hinzugefügt
    * Die Ausgabe Über UART lässt sich nun mit einer Taste starten/stopen
    * UART sendet PWM[in %]   Drehzahl[in Upm]  Strom[in mA]
    * Fehler in der Drehzahlberechnung behoben
    *
    */
    /* Ermittelt den Motorstrom */
    uint16_t get_Motorstrom(uint8_t motor_shunt)
    {
    	uint16_t data;
    	/* liest den Aktuellen Wert am AD */
    	data = get_adc(motor_shunt);
    	
    	/* Umrechnen in mA */
    	data = (data * 24)/10;	
    	
    	return(data);
    }
    
    /**    
    * Motorstrom
    * Dieses Programm soll den Motorstrom an einem Pin Messen und
    * Über UART ausgeben
    *
    * V0.1
    * programm giebt Spannung und Strom über UART aus
    *
    * V0.2
    * Die Referenzspannungwird auf 0.5V gesenkt und der AD-Wandler im Normalen
    * Modus betrieben(nicht Gain 10x)
    *
    * V0.3
    * Der Spannungsabfall am Shunt wird nun mit einem OP 11fach verstärkt.
    * Die Referenzspannung wurde wieder auf interne 2.56V gesetz
    * der A/D arbeitet mit 172KHz  und mittelt 8 Messungen
    * die PWM arbeitet mit 21,6kHz und lässt sich mit 9Bit(max 01FF) einstellen
    *
    *
    * V0.4
    * Motorstrom wird nun in mA umgerechnet und PWM in prozent
    * Die Referenzspannung des A/D-Wandlers ist nun die Versorgungsspannug Vcc (5V)
    *
    * V0.5
    *
    * Drehzahl der Motoren wird ausgegeben
    */
    /** Programmteil 2 **/
    		/** status über UART ausgeben **/
    		/* Timer0_counter hat sich geändert und sm2 ist aktiv */
    		if((alt!=timer0_counter)&&(sm & 0x02))		
    		{
    			alt = timer0_counter;	
    			//LED_PORT ^=(1<<LED1);	//LED blinken, ist immer gut
    			
    			uint16_t strom;
    			uint16_t drehzahl;
    			strom = get_Motorstrom(MOTOR_RECHTS_SHUNT);	// ermittelt dden Strom
    			drehzahl= get_Motordrehzahl();				// ermittelt die Drehzahl
    			
    			//uart_putc(0x0c);		// terminal clearsceen (bildschirm löschen)
    			
    			/*
    			uart_puts("\r\n");
    			uart_puts("Statusmeldung\t\trechter Motor\r\n\r\n");
    			uart_puts("PWM   Drehzahl   Motorstrom\r\n ");
    			*/
    			
    			/* Wert der PWM ausgeben */
    			itoa(((uint16_t)(speed_r*100)/PWM_MAX), buffer, 10);
    			uart_puts(buffer);
    			uart_puts("\t");
    			/* Drehzahl ausgeben */
    			utoa(drehzahl, buffer, 10);
    			uart_puts(buffer);
    			uart_puts("\t");
    			/* Strom ausgeben */
    			utoa(strom, buffer, 10);
    			uart_puts(buffer);
    			uart_puts("\r\n");
    		}
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken strommessung_938.png   drehzahl_strom.gif  
    Angehängte Dateien Angehängte Dateien
    http://wsgs.blogspot.com

    Wenn deine Freundin denkt,du bist bei deiner Frau,und deine Frau denkt,du bist bei deiner Freundin, dann hast du endlich Zeit ins Labor zu gehen

Berechtigungen

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

12V Akku bauen