logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega32 - częstotliwość dźwięku

droyy 01 Cze 2010 15:23 957 3
REKLAMA
  • #1 8141877
    droyy
    Poziom 2  
    Witam.

    Mam program który generuję dźwięk na zestawie ZL3AVR.
    Chciałbym generować dźwięk o określonej częstotliwości, a nie
    tak jak jest teraz, czyli w postaci mikrosekund.
    Wiem, że 1hz to 1/1s ale już gdy liczę na mikrosekundach, coś jest źle.

    Pomoże ktoś ?

    #include <avr/io.h>             
    #include <util/delay.h>			 
    
    
    void voice(unsigned int frequency)
    {  
    unsigned char x=0; 
    while(x<200) 
    {
       
    PORTD |= _BV(7);			
    _delay_us(frequency);		
    PORTD &= ~_BV(7);			
    _delay_us(frequency);		
    x++;
    }
    
    }
    
    
    
    
    int main(void)                     
    {
    
    			
    
    
    
    DDRD |= _BV(7);    					
    DDRD &=~_BV(0);						
    DDRD &=~_BV(1);						
    DDRD &=~_BV(2);
    DDRD &=~_BV(3);   					
    
    
    PORTD |= _BV(0)|_BV(1)|_BV(2)|_BV(3);		
    
    PORTD |= _BV(7); 
      
      while(1)                       
      {
    
      
      if(!(PIND & 0b00000001))		
      	voice(1);						
    	else							
    	PORTD |= 0b00000001;			
    	
    
      		if(!(PIND & 0b00000010))
      		voice(100);
      		else
    		PORTD |= 0b00000010;
    
    
    			if(!(PIND & 0b00000100))
      			voice(500);
    			else
    			PORTD |= 0b00000100;
      	
                   
    
    			if(!(PIND & 0b00001000))
      			voice(1000);
    			else
    			PORTD |= 0b00001000;
       
        
      }
    }
    
  • REKLAMA
  • #2 8141964
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Zastanów się nad tym dobrze. Jeśli chcesz generować 500Hz, a pełen okres trwa 1ms (1kHz), to chyba coś niezbyt Ci wyszło. Pozatym chcąc generować 100Hz pełen okres trwa 0.2ms, czyli masz 5kHz.

    f = 1 / T

    4\/3!!
  • REKLAMA
  • #3 8142822
    droyy
    Poziom 2  
    dzięki, czyli powiedzmy 50hz to 20.000μs. Dobrze liczę ?
  • #4 8142902
    sulfur
    Poziom 24  
    Jeśli to jest 20 tysięcy mikrosekund, czyli 20 milisekund, to dobrze.
REKLAMA