-
        

Ergebnis 1 bis 3 von 3

Thema: pwm in c ?!?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2007
    Beiträge
    5

    pwm in c ?!?

    Anzeige

    Hi
    also ich versuche eigentlich nur nen Beispielcode für eine pwm in C zu finden.
    Scheinbar ist ja Assembler wesentlich beliebter aber da hab ich noch weniger ahnung als in C.
    Also ich habe mir das Tutuorial bei mikrocontroller.net durchgelesen und meine es auch verstanden zu haben aber mir fehlt halt noch so nen Beispiel wo ich vergleichen kann was ich scheinbar übersehen habe.

    Ich will nen Atmega8 verwenden. So habi ch leider nichts gefunden über die Suche auch nicht wirklich bei Google.
    würde mich freuen wenn mir einer nen denkansatz gebeen könnte.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    33
    Beiträge
    685
    Hallo Apfeldieb,

    hier mal ein Code für einen Atmega32:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    /*------------------------------------------------------------------------------------------------*/
    
    volatile unsigned char buffer;
    int i,a;
    
    /*------------------------------------------------------------------------------------------------*/
    
    void uart_init(void);
    void port(void);
    void Motor (void);
    
    /*------------------------------------------------------------------------------------------------*/
    /*------------------------------------------------------------------------------------------------*/
    
    
    int main(void)
    {
         port();
    	 uart_init();
    	     while (1){
    			 Motor();
             }
    }
    
    
    /*------------------------------------------------------------------------------------------------*/
    /*------------------------------------------------------------------------------------------------*/
    
    void uart_init(void)
    {
    	/* Baudrate: 115200*/
    	UBRRH  = 0;                               
        UBRRL  = 7;
    	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); 
    	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    
    /*------------------------------------------------------------------------------------------------*/
    
    
    /* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
    SIGNAL(SIG_UART_RECV)
    {
    	buffer = UDR;
    }
    
    /*------------------------------------------------------------------------------------------------*/
    
    void port(void)
    {
        DDRD =0x30;
    	DDRB =0x17;
    }
    
    
    /*------------------------------------------------------------------------------------------------*/
    
    void Motor (void)
    {
    		 while(1){
    		 sei();
    		 
    		 /*-----3600------*/
    		 
    		 if (buffer=='1') {
    		     buffer =0;
    			 PORTD =0x30;
    			 TCCR1A = 0xA1;
    	         TCCR1B = 0x02;
    			 PORTB =0x11;
    			 for (i=0;i<255;i++)
    			 {
    			 OCR1A =i++;
    	         OCR1B =i++;
    			 for (a=0;a<11;a++){
    			 _delay_ms (10);}
    			 }
    			 OCR1A =0;
    	         OCR1B =0;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =255;
    	         OCR1B =255;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =0;
    	         OCR1B =0;
    			 }
    			 
    		 
    		  /*-----7200------*/
    		 
    	     if (buffer=='2'){
    		     buffer =0;
    			 PORTD =0x30;
    			 TCCR1A = 0xA3;
    	         TCCR1B = 0x01;
    			 PORTB =0x11;
    			 for (i=0;i<1023;i++)
    			 {
    			 OCR1A =i++;
    	         OCR1B =i++;
    			 for (a=0;a<3;a++){
    			 _delay_ms (10);}
    			 }
    			 OCR1A =0;
    	         OCR1B =0;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =1023;
    	         OCR1B =1023;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =0;
    	         OCR1B =0;
    			 }
    			 
    			 
    		 /*-----14400------*/
    			 
    		 if (buffer=='3') {
    		     buffer =0;
    			 PORTD =0x30;
    			 TCCR1A = 0xA2;
    	         TCCR1B = 0x01;
    			 PORTB =0x11;
    			 for (i=0;i<511;i++)
    			 {
    			 OCR1A =i++;
    	         OCR1B =i++;
    			 for (a=0;a<6;a++){
    			 _delay_ms (10);}
    			 }
    			 OCR1A =0;
    	         OCR1B =0;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =511;
    	         OCR1B =511;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =0;
    	         OCR1B =0;
    			 }
    			 
    		 /*-----28800------*/
    			 
    		 if (buffer=='4') {
    		     buffer =0;
    			 PORTD =0x30;
    			 TCCR1A = 0xA1;
    	         TCCR1B = 0x01;
    			 PORTB =0x11;
    			 for (i=0;i<255;i++)
    			 {
    			 OCR1A =i++;
    	         OCR1B =i++;
    			 for (a=0;a<11;a++){
    			 _delay_ms (10);}
    			 }
    			 OCR1A =0;
    	         OCR1B =0;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =255;
    	         OCR1B =255;
    			 for (a=0;a<100;a++){
    			 _delay_ms (10);}
    			 OCR1A =0;
    	         OCR1B =0;
    			 }
    			 
    		 }
    }
    Dabei werden bei untersch. PWM-Frequenzen die OCR1 Werte in einer for-Schleife hochgezählt, danach auf null gesetzt und nochmal kurz auf volldampf.
    War mal für ein Motortest.

    Die Interrupt-Sache habe ich selbst nur aus dem Netz zurecht gestückelt, das andere mit Hilfe des Forums und des Datenblattes.

    Hier noch eine kleine Übersicht über die Frequenzeinstellung.
    http://www.deviantart.com/deviation/49689249/

    Gruß
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2007
    Beiträge
    5
    danke
    das hilft glaub sehr gut weiter
    werd mich gleich an die arbeit machen

Berechtigungen

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