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

Thema: Frage zur Funktionsweise eines Anti Collision System (mit Infrarot)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ein Blick in den Schaltplan (Seite 2) der Base offenbart es:

    Bild hier  

    Die ACS-LEDs können getrennt angesteuert werden:
    Code:
    /**
     * Disables the ACS task.
     * ACS and IRCOMM Transmissions/Receptions will not work anymore.
     */
    void disableACS(void)
    {
    	acs_state = ACS_STATE_IDLE;
    	TIMSK &= ~(1 << OCIE2);
    	IRCOMM_OFF();
    	PORTB |= ACS_L;
    	PORTC |= ACS_R;
    	obstacle_right = false;
    	obstacle_left = false;
    }
    
    /**
     * Enables the ACS task.
     */
    void enableACS(void)
    {
    	TIMSK &= ~(1 << OCIE2);
    	IRCOMM_OFF();
    	PORTB |= ACS_L;
    	PORTC |= ACS_R;
    	obstacle_right = false;
    	obstacle_left = false;
    	acs_state = ACS_STATE_IRCOMM_DELAY;
    }
    
    /**
     * Turn ACS Power off.
     *
     * Example:
     *
     *			setACSPwrOff();
     *
     */
    void setACSPwrOff(void)
    {
    	DDRD &= ~ACS_PWR;
    	PORTD &= ~ACS_PWR;
    	DDRB &= ~ACS_PWRH;
    	PORTB &= ~ACS_PWRH;
    	PORTB &= ~ACS_L;
    	PORTC &= ~ACS_R;
    }
    
    /**
     * Set ACS Power low.
     *
     * Example:
     *
     *			setACSPwrLow();
     *
     */
    void setACSPwrLow(void)
    {
    	DDRD |= ACS_PWR;
    	PORTD |= ACS_PWR;
    	DDRB &= ~ACS_PWRH;
    	PORTB &= ~ACS_PWRH;
    }
    
    /**
     * Set ACS Power medium.
     *
     * Example:
     *
     *			setACSPwrMed();
     *
     */
    void setACSPwrMed(void)
    {
    	DDRD &= ~ACS_PWR;
    	PORTD &= ~ACS_PWR;
    	DDRB |= ACS_PWRH;
    	PORTB |= ACS_PWRH;
    }
    
    /**
     * Set ACS Power high.
     *
     * Example:
     *
     *			setACSPwrHigh();
     *
     */
    void setACSPwrHigh(void)
    {
    	DDRD |= ACS_PWR;
    	PORTD |= ACS_PWR;
    	DDRB |= ACS_PWRH;
    	PORTB |= ACS_PWRH;
    }
    (Aus RP6RobotBaseLib.c)

    Mit ACS_PWR und ACS_PWRH kann man R8 und R9 in unterschiedlichen Kombinationen ansteuern und so den Strom durch die ACS-LEDs und die Leuchtstärke beeinflußen.

    Gruß

    mic


    [Edit]

    Ach ja, ganz vergessen, die Kathoden liegen an ACS_L/ACS_R. Die Leds leuchten, wenn sie auf low liegen und über R8/9 ein high ausgegeben wird:
    Bild hier  

    [Noch ein Edit]
    Bei der Suche nach dem Urheber der 36kHz-Trägerfrequenz für das ACS habe ich die getrennte Ansteuerung der ACS-LEDs gefunden:

    Code:
    // -------------------------------
    
    /**
     * Timer 2 Compare ISR
     * ACS & IRCOMM
     *
     * WARNING: DO NOT CHANGE THIS!
     * NEVER try to control the IRCOMM by your own routines if you do not
     * know what you are doing!
     *
     */
    ISR (TIMER2_COMP_vect)
    {
    	static uint8_t ircomm_pulse;
    	if(acs_state < 2) { // If ACS is not active, perform IRCOMM transmissions
    		if(ircomm_pulse) { // Do we have IR pulses to send?
    			if(ircomm_pulse < 60) { // Bi-Phase encoding...
    				if(ircomm_data & 0x4000) // check current bit
    					PORTD ^= (1<<PIND7); // Toggle IRCOMM port
    				else
    					PORTD &= ~(1<<PIND7); // deactivate IRCOMM port
    			}
    			else if(ircomm_data & 0x4000) // The same as above, but the other way round:
    				PORTD &= ~(1<<PIND7); // deactivate IRCOMM port
    			else
    				PORTD ^= (1<<PIND7); // Toggle IRCOMM port
    			ircomm_pulse--;
    		}
    		else if(ircomm_send) { // Do we still have data?
    			PORTD &= ~(1<<PIND7);
    			ircomm_data <<= 1; // Next Bit!
    			ircomm_pulse = 120;
    			ircomm_send--;
    		}
    		else 
    			PORTD &= ~(1<<PIND7); // no more pulses - IR LEDs off!
    	}
    	else if(acs_pulse) { // Send ACS IR pulses?
    		if(sysStatACS.channel == ACS_CHANNEL_LEFT) // which channel?
    			PORTB ^= ACS_L; 
    		else 			
    			PORTC ^= ACS_R; 
    		acs_pulse--;
    	}
    	else { // no more pulses - IR LEDs off!
    		PORTB |= ACS_L;
    		PORTC |= ACS_R;
    	}
    }
    (Ebenfalls aus RP6RobotBaseLib.c)
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken rp6_acs_detail.png   rp6_acs_detail2.png  
    Geändert von radbruch (05.06.2012 um 17:28 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. Roboter Sicherheit bzw. Funktionsweise eines Kleberoboters
    Von Surfacing im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 9
    Letzter Beitrag: 20.08.2021, 10:17
  2. Funktionsweise eines brushless Motors
    Von sky2 im Forum Motoren
    Antworten: 5
    Letzter Beitrag: 24.12.2008, 09:09
  3. IS471F Infrarotsensor? Frage zu funktionsweise...
    Von -C3P0- im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 24.07.2007, 13:44
  4. Funktionsweise eines Bootloaders
    Von Zeroeightfifteen im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 21.03.2007, 20:44
  5. Verständnisprobleme über die Funktionsweise eines Interrupts
    Von electrofux im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.10.2006, 16:14

Berechtigungen

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

Labornetzteil AliExpress