-
        

Ergebnis 1 bis 3 von 3

Thema: PWM problem mit Atmega 8

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    50
    Beiträge
    50

    PWM problem mit Atmega 8

    Anzeige

    Hallo zusammen,

    Ich bin Neuling in C und bräuchte eure Hilfe.
    Ich benutze das Bord vem Embedit USC008 oder Robo008.
    Das Board ist mit einem Atmega 8 und einem SN754410 bestückt.
    Ich benutze RB35 Motoren diese möchte ich über beide PWM ansteuern.
    Quartz 14,745600 Hz

    Mit meinem Script möchte ich als erstes mal den PWM zum laufen haben.
    Um zu lernen und verstehen wie dieses funktioniert.

    Es soll als etrstes mit Taster PD2 links herum und mit PD3 rechts herum drehen.

    Funktioniert fast, Ich kann den 0C1A und 0C1B zuweisen was ich möchte.
    Beider Motoren drehen immer gleich schnell.

    Hier in diesem Script habe ich alle Werte auf 0 gesetzt, um zusehen und merken, dass beide Motoren sich drehen.

    Nun meine Frage warum ?


    Code:
    /* ========================================================================== */
    /*                                                                            */
    /*   PWM_Robot_8_Board_Atmega8_1.c                                            */
    /*   (c) 2008 Enterprise                                                      */
    /*                                                                            */
    /*   Mit Taster PD3 drehen die beide Motoren links herum.                     */
    /*                                                                            */
    /*   Mit Taster PD3 drehen die beide Motoren rechts herum.                    */
    /*                                                                            */
    /* ========================================================================== */
    
    #include <avr/io.h>
    #include <stdint.h>
    
    
    void main()
    {
    
    //Prescaler 256
        TCCR1B |= (1<<CS12); 
    	
    // Timer in den Fast PWM Mode, 8 Bit schalten
    	TCCR1A |= (1<<WGM10);
    	TCCR1B |= (1<<WGM12);
    	
    // Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. Ergibt nichtinvertierte PWM.	
    	TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;	
    	
    // PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255.
    	OCR1A =	0;		// M1 Geschwindigkeit
    	OCR1B = 0;	    // M2 Geschwindigkeit
    	
    // PWM-Signal liegt an den Pins an!	
    	DDRD |= (1<<PD4) | (1<< PD6);	// M2 und M1 Drehrichtung links
    	DDRD |= (1<<PD7) | (1<< PD5);   // M2 und M1 Drehrichtung rechts
    
    // Port PD2 und PD3 Taster
    	PORTD = (1<<PD2) | (1<< PD3);
    
    
    	while(1){
    
    	if ( PIND & (1<<PIND2) ) {
        		PORTD |= ((1<<PD4) | (1<<PD7));
        	  	OCR1A =	0;
    		OCR1B = 0; 
       }
       	else {
        	PORTD &= ~((1<<PD4) | (1<<PD7));
        	OCR1A =	0;
    	OCR1B = 0;
       		}  
    
        if ( PIND & (1<<PIND3) ) {
        		PORTD |= ((1<<PD6) | (1<<PD5));
        	  	OCR1A =	0;
    		OCR1B = 0; 
       }
       	else {
        	PORTD &= ~((1<<PD6) | (1<<PD5));
        	OCR1A =	0;
    	OCR1B = 0;
       		}  
    
        }
    
    }

    mfg
    Enterprise

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    ich glaub da gehen noch 2 Ports ab, die auf Ausgang zu stellen sind. Nämlich PB1 und PB2 an denen OC1A und OC1B "rauskommen".

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.10.2004
    Alter
    50
    Beiträge
    50
    Danke Linux_80,

    Für die noch so späte Hilfe.

    Jetz funktioniert es.

    Hier den code:

    Code:
    /* ========================================================================== */
    /*                                                                            */
    /*   PWM_Robot_8_Board_Atmega8_1.c                                            */
    /*   (c) 2008 Enterprise                                                      */
    /*                                                                            */
    /*   Mit Taster PD3 drehen die beide Motoren links herum.                     */
    /*                                                                            */
    /*   Mit Taster PD3 drehen die beide Motoren rechts herum.                    */
    /*                                                                            */
    /* ========================================================================== */
    
    #include <avr/io.h>
    #include <stdint.h>
    
    
    void main()
    {
    
    //Prescaler 256
        TCCR1B |= (1<<CS12); 
    	
    // Timer in den Fast PWM Mode, 8 Bit schalten
    	TCCR1A |= (1<<WGM10);
    	TCCR1B |= (1<<WGM12);
    	
    // Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. Ergibt nichtinvertierte PWM.	
    	TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;	
    
    // Port PB1 "0C1A" und PB2 "0C1B" als Ausgang geschaltet.
        DDRB |= (1<<PB1) | (1<< PB2);
    	
    // PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255.
    	OCR1A =	0;		// M1 Geschwindigkeit
    	OCR1B = 0;	    // M2 Geschwindigkeit
    	
    // PWM-Signal liegt an den Pins an!	
    	DDRD |= (1<<PD4) | (1<< PD6);	// M2 und M1 Drehrichtung links
    	DDRD |= (1<<PD7) | (1<< PD5);   // M2 und M1 Drehrichtung rechts
    
    // Port PD2 und PD3 Taster
    	PORTD = (1<<PD2) | (1<< PD3);
    
    
    	while(1){
    
    	if ( PIND & (1<<PIND2) ) {
        		PORTD |= ((1<<PD4) | (1<<PD7));
        	  	OCR1A =	255;
    			OCR1B = 255; 
       }
       	else {
        	PORTD &= ~((1<<PD4) | (1<<PD7));
        	OCR1A =	0;
    		OCR1B = 0;
       		}  
    
        if ( PIND & (1<<PIND3) ) {
        		PORTD |= ((1<<PD6) | (1<<PD5));
        	  	OCR1A =	255;
    			OCR1B = 255; 
       }
       	else {
        	PORTD &= ~((1<<PD6) | (1<<PD5));
        	OCR1A =	0;
    		OCR1B = 0;
       		}  
    
        }
    
    }

    mfg
    Enterprise

Berechtigungen

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