-         

Ergebnis 1 bis 5 von 5

Thema: PWM an M32 mit Timer 1

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    30
    Beiträge
    220

    PWM an M32 mit Timer 1

    Anzeige

    Hallo, beschäftige mich schon seit ein paar tagen mit dem thema PWM. dazu hab ich diverse internetthreads durch gelesen und bin auf folgendes progrämmchen gestoßen:

    Code:
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    								
    int main (void)
    {initRP6Control();
    
    
      DDRD |= (1 << PD4); // PWM Ausgang
      
    
      TIMSK |= (1<<OCIE1A); //   Interrupt bei Compare A
      
         TCCR1A |= (1 << COM1A1); //set am Periodenanfang, clear bei Vergleich
    	 
      TCCR1B |= (1 << WGM12); 
      
         TCCR1A |= ( 1 << WGM10  |1<<WGM11);  // FastPWM 10-Bit
    	 
      OCR1A   = (200);  // Anfangsvergleichwert
      
         TCCR1B |= ((1 << CS10)); // Starte Timer mit Fcpu/1
    
      sei();
    
         while(1)
         {
         }
    
    
    
    return 1;
    };
    Mir gehts vorerst mal nur darum die led4 zu dimmen.
    jetzt hab ich mal am pin STR versucht spannung gegen GND zu messen.
    Aber irgendwie kann ich nix messen, obwohl die LED4 leuchtet.

    Kann mir vielleicht jemand sagen, ob dieses Programm zur PWM- Dimmung einer LED genügt?

    Gruß

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    28
    Beiträge
    607
    Wenn du dich mit einer Funktion eines Controllers beschäftigst, dann lohnt es sich immer zuerst das Datenblatt zu lesen. http://www.atmel.com/dyn/resources/p...ts/doc2503.pdf (Kapitel: 16bit Timer/Counter 1)

    Das Programm sieht ansonsten ganz ok aus, nur dass "TIMSK |= (1<<OCIE1A); // Interrupt bei Compare A " unnötig ist, da du den Interrupt ja garnicht verwendest.
    Mit OCR1A stellst du die Dimmung der LED ein, je kleiner der Wert, desto gedimmter die LED.
    Stell den Wert auf 900, dann solltet du auch eine vernünftige Spannung messen können.

    Gruß, Yaro

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    30
    Beiträge
    220
    dass das TIMSK- Register nicht gesetzt werden muss, wenn man die PWM ohne Interrupt macht hab ich auch schon vermutet. Das Datenblatt hab ich schon ausgiebig durchforstet, sonst wär ich auch gar nicht in der lage gewesen dieses kurze programm zu schreiben.

    Allerdings besteht immer noch mein oben beschriebenes problem. und zwar kann ich nach wie vor an pin STR keine spannung messen. auch nicht mit OCR1A= 900.
    Aber vielleicht messe ich auch am falschen pin. also, wenn ich den Schaltplan der M32 richtig lese wird PD4 auf STR geführt.

    Aber vielleicht kann mich da jemand genauer aufklären?

    gruß

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    30
    Beiträge
    220
    jetzt hab ich gerade nochmal das datenblatt durchgeschaut. kann es sein, dass es nicht TCCR1B |= (1 << WGM12);
    sondern TCCR1A |= (1 << WGM12); heißen muss?
    gruß

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    30
    Beiträge
    220
    so, jetzt hab ich mal ein fertiges programm geschrieben um eine am PD5 am M32 angeschlossene LED zu dimmen.

    Code:
    #include "RP6ControlLib.h" 
    
    int main (void)
    {
    	
    
    DDRD |= (1 << PD5); // PWM Ausgang
      
      
         TCCR1A |= (1 << COM1A1); //set am Periodenanfang, clear bei Vergleich
       
      TCCR1B |= (1 << WGM12);
         TCCR1A |= ( 1 << WGM10  |1<<WGM11);  // FastPWM 10-Bit
       
      
         TCCR1B |= ((1 << CS10)); // Vorteiler= 1
    
    	
    	showScreenLCD("ADC Value:", "Button: T");
    	while(true) 
    	{
    		
    		uint8_t key = getPressedKeyNumber(); 
    
    		if(key) 
    		{
    			uint16_t key_adc = readADC(ADC_KEYPAD);
    			setCursorPosLCD(0, 11); 
    			
    			setCursorPosLCD(1, 9);
    			
    			writeInteger(key_adc,DEC);
    			writeString_P(" --> Pressed key:");
    			writeInteger(key,DEC);
    			writeChar('\n');
    			
    			while(getPressedKeyNumber());
    			
    			switch(key)
    			{case 1: 				//Taster 1
    					OCR1A=(100);
    				break;
    				case 2: 			//Taster 2
    					OCR1A=(1000);	
    				break;
    			}
    		}
    	}
    	return 0;
    }
    Was mich jetzt aber sehr interessieren würde ist die tatsache, dass dieses programm nicht funktioniert, wenn ich in den main- teil initRP6Control(); mit einbaue. ich kann mir den grund nicht erklären aber vielleicht kann mich jemand aufklären?

    gruß

Berechtigungen

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