- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 12

Thema: BL-Regler Programmierung Atmega8

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406
    Also, das ist so ungefähr die einzige PDF die da nicht passt - es sind wirklich viele. (z.B. Suchbegriff "BLDC timer)
    Ich habe zum Beispiel grade folgende Seite gefunden:
    http://www.atmel.com/tools/ATAVRMC30...?tab=documents
    Dort ist u.a. ein Beispiel für den Attiny861 für den Sensorlosen BLDC Betrieb + Erklärung!
    Auf den 1. Blick sieht es von den Timer so aus, dass das auch für den Atmega8 passen müsste...
    Meine Projekte auf Youtube

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2012
    Beiträge
    28
    Danke für deine Hilfe und entschuldigung für meine vielleicht etwas unpassenden Fragen.
    Ich nehme mal an es wird nicht so einfach sein, die C-Dateien und Headerdatein in ein Projekt zu packen (ich verwende AVRStudio5.1)und ein paar Ausgänge neu zu setzen, oder gleich die .hex-Datei zu übertragen. Ansonsten übersteigt es meine Fähigkeiten.. ich wüsste nicht wie ich da etwas umschreiben müsste (sollte ein Register nicht passen etc)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.02.2012
    Beiträge
    127
    Schau dir mal die Sourcen von dem Simonk(irby) oder Blheli an.
    Sind zwar eher für Quads (wegen der Ansteuerfrequenz) bzw Heli/Quad (Blheli) gedacht aber das Funktionsprinzip ist ja das gleiche.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Vllt findest du hier was...das ist auf jeden Fall hochkompliziert, besonders Langsamlauf.

    http://www.wettringer-modellbauforum...threadID=36848

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2012
    Beiträge
    28
    Also diese Software (habe mir beide angeschaut) kann ich definitiv ohne größeren Aufwand nicht leicht umschreiben. Zudem ist die Schaltung dazu anders, es werden zb. keine Gatetreiber-ICs verwendet. Das bedeutet ich müsste die Ausgänge neu beschreiben nud die Funktion dessen und soweit ich es gesehen hab gibt es dort keine einfachen Makros wo ich Ausgägne neu setzen könnte.
    Gibt es keine einfache Software die man leicht umschreiben könnte? Ich denke es gibt sicher mehr Leute, die sowas im Selbstbau verwirklicht haben

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Ein BLDC ist etwas für Fortgeschrittene, sowohl bei der Hardware, insbesondere aber bei der Software. So mit Cut und Paste wird das nichts.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2012
    Beiträge
    28
    Ok hier mein erster Versuch:
    Code:
    #include <avr/interrupt.h>
    #include <avr/io.h>
    #define F_CPU 8000000UL	//Fusebit auf interner 8 Mhz Oscillator gesetzt
    #include <util/delay.h>
    
    
    //PHASE1 (U)
    
    #define U_PWM		DDRB|=(1<<4);PORTB|=(1<<4);DDRB&=~(1<<5)
    #define U_Floating	DDRB|=(1<<4);PORTB&=~(1<<4)
    #define U_HIGH		DDRB|=(1<<4);PORTB|=(1<<4);DDRB|=(1<<5);PORTB|=(1<<5)
    #define U_LOW		DDRB|=(1<<4);PORTB|=(1<<4);DDRB|=(1<<5);PORTB&=~(1<<5)
    
    //PHASE2 (V)
    
    #define V_PWM		DDRB|=(1<<2);PORTB|=(1<<2);DDRB&=~(1<<3)
    #define V_Floating	DDRB|=(1<<2);PORTB&=~(1<<2)
    #define V_HIGH		DDRB|=(1<<2);PORTB|=(1<<2);DDRB|=(1<<3);PORTB|=(1<<3)
    #define V_LOW		DDRB|=(1<<2);PORTB|=(1<<2);DDRB|=(1<<3);PORTB&=~(1<<3)
    
    //PHASE3 (W)
    
    #define W_PWM		DDRB|=(1<<7);PORTB|=(1<<7);DDRB&=~(1<<6)
    #define W_Floating	DDRB|=(1<<7);PORTB&=~(1<<7)
    #define W_HIGH		DDRB|=(1<<7);PORTB|=(1<<7);DDRB|=(1<<6);PORTB|=(1<<6)
    #define W_LOW		DDRB|=(1<<7);PORTB|=(1<<7);DDRB|=(1<<6);PORTB&=~(1<<6)
    
    #define SENSE_U		ADMUX&=~((1<<MUX2)|(1<<MUX1)|(1<<MUX0));
    #define SENSE_V		ADMUX&=~((1<<MUX2)|(1<<MUX1)); ADMUX|=(1<<MUX0);
    #define SENSE_W		ADMUX&=~((1<<MUX2)|(1<<MUX0)); ADMUX|=(1<<MUX1);
    
    volatile uint8_t rotor_state=1;
    
    //setzt den übergebenen Status der Rotoren und setzt den Analog Komparator neu
    void set_commutate_state(uint8_t state){ 
    	switch (state){
    		case 1:
    			U_PWM;
    			V_Floating;
    			W_LOW;
    			SENSE_V;	
    			break;
    		case 2:	
    			U_Floating;
    			V_PWM;
    			W_LOW;
    			SENSE_U;
    			break;
    		case 3:
    			U_LOW;
    			V_PWM;
    			W_Floating;
    			SENSE_W
    			break;
    		case 4:
    			U_LOW;
    			V_Floating;
    			W_PWM;	
    			SENSE_V;
    			break;
    		case 5:
    			U_Floating;
    			V_LOW;
    			W_PWM;
    			SENSE_U;
    			break;
    		case 6:
    			U_PWM;
    			V_LOW;
    			W_Floating;
    			SENSE_W;
    			break;
    	}	
    }
    
    ISR (ANA_COMP_vect) 
    { 
    	set_commutate_state(rotor_state);
    	rotor_state++;
    	(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    	
    }
    
    void anlaufvorgang();
    
    int main (void) 
    {
    	//PWM an Port PB1(OC1A) einstellen
    	TCCR1B |= (1<<CS10);	//Prescaler 0; Takt des Timers1 = CPU-Takt
    	TCCR1A |= (1<<WGM10);	// 8-Bit PWM Betriebsart aktivieren
    	TCCR1B |= (1<<WGM12);	//Timer1 zählt bis zu einem Vergleichswert, definiert in OCR1AH/L	
    	TCCR1A |= (1<<COM1A1);	// nicht invertierter Modus
    	OCR1A = 128;		// Verhältnis einstellen
    	DDRB |= (1<<PB1);		// PB1 als Ausgang definieren, PWM wird aktiviert
    	
    	DDRC=0x00;     //ADC0-2 auf Eingang für Analog Komparator
    	PORTC=0x00;
    	
    	DDRB=0xff;
    	PORTB=0x00;
    	
    	//Analog Komparator Interrupt
    	
    	ADCSRA&=~(1<<ADEN); //ADC ausgeschaltet
    	ACSR&=~(1<<ACD); //Komparator = ein
    	ACSR&=~(1<<ACBG); //externe Referenzspannug an AIN0
    	ACSR|=(1<<ACIE); //Komparator Interrupt = ein
    	ACSR&=~((1<<ACIS1)|(1<<ACIS0)); //löst Komparator bei jedem Flankenwechsel aus
    	SFIOR|=(1<<ACME); //aktiviert Multiplexer
    	
    	anlaufvorgang();
    	
    	U_Floating;
    	V_Floating;
    	W_Floating;
    	
    	_delay_ms(10);
    	
    	SENSE_U;
    	
    	sei();
    	
    	while(1){
    	}	
    }
    
    void anlaufvorgang(){
    	for(uint16_t i=0;i<50;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_ms(5);		
    	}
    	for(uint16_t i=0;i<100;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_ms(4);	
    	}
    	for(uint16_t i=0;i<200;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_ms(3);	
    	}
    	for(uint16_t i=0;i<300;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_ms(2);	
    	}
    	for(uint16_t i=0;i<500;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_us(1500);	
    	}
    	for(uint16_t i=0;i<1000;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_us(1250);	
    	}
    	for(uint16_t i=0;i<1500;i++){
    		set_commutate_state(rotor_state);
    		rotor_state++;
    		(rotor_state==7)?(rotor_state=1):(rotor_state=rotor_state);
    		_delay_us(1100);	
    	}
    }

    Der Anlaufvorgang funktioniert so wie er soll, er schaltet schrittweiße nach oben bis zur letzten Drehzahl. (nicht wundern über die komische Verfahrensweiße, für mich ists so fürn Anfang leichter gewesen)

    Allerdings gibt der Festplattenmotor, nachdem er per Zwangskommutierung hochgedreht ist, nur ein Pfeifen von sich.
    Folgendes habe ich bereits auf ihre Funktionsweiße überprüft:
    Analog Komparator / Multiplexer:
    Code:
    ISR (ANA_COMP_vect) 
    { 
    	DDRC|=(1<<PC5);
            PORTC^=(1<<PC5); (LED an/ausschalten)
    }
    
    int main(){
        // Hier Hochdrehen lassen; siehe Quelltext oben
        // hier Analog Komparator und Multiplexer aktivieren; siehe Quelltext oben
        SENSE_U;
        sei();
       while(1){}
    }
    --> Die LED blinkt sehr schnell

    Daher weiß ich nicht was falsch sein sollte, von der Logik sollte es ja funktionieren?
    ->nach dem Hochdrehen SENSE auf U/V/W (ist egal?) setzen
    ->nichts machen (while(1)) und warten bis der Interrupt ausgelöst wird
    ->Phase setzen zb. U an, V Floating, W aus und SENSE auf V (also auf dasjenige das gerade eben auf FLOATING gesetzt wurde) //in der ISR wir die Methode set_commutate_state(); aufgerufen
    ->wieder warten bis der nächste Interrupt ausgelöst wird, usw.


    Einen Timer fürs zeitverzögerte Auslösen hab ich noch nicht drin, die nächste Phase direkt nach dem Komparator-Interrupt zu schalten sollte auch funktionieren?

Ähnliche Themen

  1. Bascom Atmega8 + VoiceModul (vrbot) Programmierung
    Von furiouscars im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 26.11.2011, 11:25
  2. PID Regler - Hilfe! Atmega8
    Von bexter im Forum Software, Algorithmen und KI
    Antworten: 5
    Letzter Beitrag: 15.07.2011, 21:35
  3. Probleme bei der Programmierung Atmega8
    Von Mad_Maxx im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 05.07.2011, 21:13
  4. Programmierung Atmega8 klappt nicht
    Von filth im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 18.03.2009, 07:31
  5. Atmega8-Programmierung zur Steuerung eines Autos - HILFE!!!
    Von r2d2matze im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 25.10.2005, 17:00

Stichworte

Berechtigungen

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

12V Akku bauen