-         

Ergebnis 1 bis 7 von 7

Thema: Stufenlos PWM-Frequenz einstellen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.07.2004
    Alter
    31
    Beiträge
    67

    Stufenlos PWM-Frequenz einstellen

    Anzeige

    Hallo! Ich baue gerade eine Countdown-Uhr und bin ein bisschen am ausprobieren mit einem Piezo-Piepser. Nun folgende Frage:

    Mit welchen Bits kann ich die Tonhöhe stufenlos variieren (will eine Art amerikanische Polizeisirene realisieren)?
    Gut, ich kann mit der relativ groben Vorteiler-Einstellung meines Timers den Rahmen vorgeben. Dann kann ich noch mit dem OCR1A das Puls-Pause-Verhältnis ändern, was jedoch nichts an der eigentlichen Tonhöhe ändert.
    Nun habe ich noch gelesen, dass TCNT1L / TCNT1H die Überlaufgrenzen festlegt. Doch auch hier höre ich keinen Unterschied... hier mal mein Test-Code

    Code:
    #include <avr/io.h>
    #include <avr/delay.h>
    
    
    
    
    int main ()
    {
    	DDRD=0xFF;
    	
    	TCCR1A |= (1<<COM1A1)|(1<<PWM10)|(1<<PWM11); //nicht invertierte 10Bit-PWM
    	TCCR1B |= (1<<CS11); //clk/8 Timerfrequenz
    	uint16_t i;
    
    OCR1A=128; //Puls-Puase-Verhaeltnis 1:1 (Output Comp. Reg.)
    
    TCNT1L=1;
    	
    
    	
    
    
    for(;;){
    
    for(i=0;i<=1023;i++){
    	
    	TCNT1H=i;  //da ändert sich nichts hörbares?
    	
    	_delay_ms(20);
    	
    	}
    }
    
    }
    Gruß,
    Sebastian

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    04.07.2004
    Alter
    31
    Beiträge
    67
    Hmm ist das so ein exotisches Problem? Ich habe noch mal hier http://www.mikrocontroller.net/artic...WM-Betriebsart geschaut, und habe mit den genannten Bits OCR1AH /*L und dem TCNT1H/*L gespielt, aber man hört keine Unterschiede .

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Hi,

    Eventuell mit dem PWM-Mode, bei dem man TOP variieren kann ?
    Gruß,
    Franz

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    04.07.2004
    Alter
    31
    Beiträge
    67
    So, ich habs nun . Im PWM-Mode kann man generell nur das Puls/Pause-Verhältnis regeln (sprich die effektiv herauskommende Gleichspannung). Stufenlose Frequenzänderung ist NICHT vorgesehen. Das macht man am besten im CTC1-Mode und normalem Timer z.B. so
    (PP-Verhältnis ist dabei fest 1:1)
    Code:
    #include <avr/io.h>
    #include <avr/delay.h>
    #include <avr/interrupt.h>
    
    
    
    
    int main ()
    {
    	DDRD=0xFF;
    	
    	TCCR1A |= (1<<COM1A0); //nicht invertierte 10Bit-PWM
    	TCCR1B |= (1<<CS11)|(1<<CTC1); //clk/8 Timerfrequenz
    	uint16_t i;
    
    
    cli();
    
     	
    
    
    
    for(;;){
    
    for(i=10;i<=5000;i++){
    	OCR1A=i;
    	
    	_delay_ms(1);
    	if (i==4990)
    		i=0;
    	
    	}
    }
    
    }

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von Sebastian132
    So, ich habs nun . Im PWM-Mode kann man generell nur das Puls/Pause-Verhältnis regeln (sprich die effektiv herauskommende Gleichspannung). Stufenlose Frequenzänderung ist NICHT vorgesehen.
    Das ist so nicht richtig.

    Es gibt durchaus PWM Modi, in denen man den maximalen Zählerstand selbst definieren kann.

    Grüße,

    da Hanni.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    04.07.2004
    Alter
    31
    Beiträge
    67
    Hm, so wurde mir das zwar erzählt, aber muss ja nicht stimmen . Aber rein interessehalber, wie gehts denn? CTC1 hat laut MC.net-Tutorial keine Wirkung im PWM-Mode. Und wiegesagt, das selberdefinieren diverser Überlaufgrenzen brachte bei mir 0 .

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    09.06.2006
    Ort
    Siegen
    Alter
    43
    Beiträge
    9
    Hallo Sebastian!

    Welchen Prozessor verwendest du denn?
    Beim AT90s8515 ist der Überlaufwert der Timer/Zähler z.B nicht einstellbar.
    Beim ATmega8 un anderen 'megas' aber kannst du die obere Grenze in einigen Modi im Register ICR1H/ICR1L einstellen. Um dabei ein Tastverhältnis von 1 zu erreichen sollte OCR1 immer mit ICR1 geteilt durch zwei geladen werden.

    Alternativ könntest du den TimerOverflow-Interrupt dazu benutzen, um bei jedem Durchlauf den Zähler/Timer auf einen definierten Startwert zu schreiben.
    Viel Erfolg!

    Gruß, Claus

Berechtigungen

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