Nybörjargrej:

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Bestäm en frekvens f så att f * 12/144 = 440Hz => f=5280Hz

Detta ger A = f * 12/144, vi vill ha A = f * 1/x

Detta ger x = 144/12 = 12 och A = f * 1/12

#A Blir då f * 13/144 (440 + 440 * 1/12), skrivet på A = f * 1/x

blir x = 144/13 => #A ca f * 1/11



Nogranheten i detta blir inte särskilt bra.



Vi förlänger istället allt med 100:

f = 528Khz,



Första oktaven

A = 12/14400 * f, x=14400/12=1200 och f=528Khz * 1/1200 = 440Hz

A# = 13/14400 * f, x=14400/13=1108 1/2 = 554

B = 14/14400 * f, x=14400/14=1029 1/2 = 514

c = 15/14400 * f, x=14400/15=960 1/2 = 480

C# = 16/14400 * f, x=14400/16=900 1/2 = 450

D = 17/14400 * f, x=14400/17=847 1/2 = 424

D# = 18/14400 * f, x=14400/18=800 1/2 = 400

E = 19/14400 * f, x=14400/19=758 1/2 = 379

F = 20/14400 * f, x=14400/20=720 1/2 = 360

F# = 21/14400 * f, x=14400/21=686 1/2 = 343

G = 22/14400 * f, x=14400/22=655 1/2 = 327

G# = 23/14400 * f, x=14400/23=625 1/2 = 313



Andra oktaven



A = 12/14400 * f, x=14400/24=600 1/2 = 300

A# = 13/14400 * f, x=14400/25=1108 1/2 = 288

B = 14/14400 * f, x=14400/26=1029 1/2 = 276

c = 15/14400 * f, x=14400/27=960 1/2 = 267

C# = 16/14400 * f, x=14400/28=900 1/2 = 257

D = 17/14400 * f, x=14400/29=847 1/2 = 248

D# = 18/14400 * f, x=14400/30=800 1/2 = 240

E = 19/14400 * f, x=14400/31=758 1/2 = 232

F = 20/14400 * f, x=14400/32=720 1/2 = 225

F# = 21/14400 * f, x=14400/33=686 1/2 = 218

G = 22/14400 * f, x=14400/34=655 1/2 = 212

G# = 23/14400 * f, x=14400/35=625 1/2 = 206
Quotar mig själv här ;) x är värdet räknaren ska räkna till för att skapa önskad ton. Dvs, om du klockar räknaren i 528Khz och börjar med låg utgång ska du sätta utgången hög efter halva tiden för att generea en period av den önskade signalen.
Måste erkänna att jag inte är helt haj på hur jag räknade men tonerna lät hyffsat bra i alla fall, spelade top gun temat med den....

Känns som att när jag väl kom till slutsatsen att använda en mycket högre frekvens kunde jag kanske löst det på något simplare sätt, vissa uträkningar verkar lite överflödiga, men nu har du något att jobba med.

edit
Hm, andra oktaven ser konstig ut när man kollar på ½ värdet... har inte tid att kolla upp det nu...

Källkoden till tongeneratorn i vhdl:

Kod: Markera allt

--******************************************************************
-- Projekt i Digitalkonstruktion HT-03 - Melodigenerator			
-- Av: Fredrik Johansson & Marcus Bohman							
-- Beskrivning: tongenerator.vhd delar ner ingående klocksignal		
-- från 528Khz till olika hörbara toner. Vilken ton som spelas styrs		
-- från player.vhd.
--******************************************************************

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity tongenerator is
	port(clock, reset: in std_logic;
	-- ton in från player.vhd
	ton: in std_logic_vector(4 downto 0);
	-- utsignalen
	u: buffer std_logic);
end entity tongenerator;

architecture beteende of tongenerator is
-- Används till att dela frekvensen
signal q: integer range 0 to 600 := 0;
begin
process(clock, reset)	   
variable i: integer range 0 to 600 := 0;

begin					  
	
if rising_edge(clock) then
	
	if (u = 'U') then
		u <= '0';
	else null;
	end if;
	
	if (i = q) then
		u	<=	not u;
		i := 0;
	else	
		i := i + 1;
	end if;
	
	-- reset fungerar här som en "mute" knapp
	case (reset) is
		when '0'	=>	null;
		when '1'	=>	u 	<= '0';
		when others	=>	null;
	end case;
	
end if;	
end process;

process(ton)
begin
	case (ton) is
		-- delar frekvensen vid olika värden
		-- beroende på vilken ton som ska spelas
		when "00000"	=>	q <= 600; -- 1A	
		when "00001"	=>	q <= 554; -- 1A#
		when "00010"	=>	q <= 514; -- 1B
		when "00011"	=>	q <= 480; -- 1C	
		when "00100"	=>	q <= 450; -- 1C#
		when "00101"	=>	q <= 424; -- 1D
		when "00110"	=>	q <= 400; -- 1D#
		when "00111"	=>	q <= 379; -- 1E
		when "01000"	=>	q <= 360; -- 1F
		when "01001"	=>	q <= 343; -- 1F#
		when "01010"	=>	q <= 327; -- 1G
		when "01011"	=>	q <= 313; -- 1G#
		
		when "01100"	=>	q <= 300; -- 2A
		when "01101"	=>	q <= 288; -- 2A#
		when "01110"	=>	q <= 276; -- 2B
		when "01111"	=>	q <= 267; -- 2C
		when "10000"	=>	q <= 257; -- 2C#
		when "10001"	=>	q <= 248; -- 2D
		when "10010"	=>	q <= 240; -- 2D#
		when "10011"	=>	q <= 232; -- 2E
		when "10100"	=>	q <= 225; -- 2F
		when "10101"	=>	q <= 218; -- 2F#
		when "10110"	=>	q <= 212; -- 2G
		when "10111"	=>	q <= 206; -- 2G#
		when "11111"	=>	q <= 0; -- paus
		
		when others	=>	q <= 0;
   	end case;
end process;
end architecture beteende;
Förstår att VHDL är lite overkill för er men det kanske är intressant att se en annan lösning på samma problem.
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Lite frågor kring 555:
Om man nu skulle använda 555 för att göra tex fyrkantsvåg, och om man använder den kopplingen som visas under rubriken Astable Operation i databladet här Vilka värden ska man ha för att göra det så bra som möjligt? Höga eller låga resistanser och kapacitanser? Ska Ra vara mindre än Rb? Om man sätter Ra till samma resistans som Rb blir signalen osymetrisk, altså att den negativa halvperioden blir kortare än den positiva, och sätter man Ra lägre än Rb blir den mer symmetrisk.

Använder man 555:an till att skapa ljudet får man nog istället för ett av motstånden sätta en cermet trimmer för att kunna stämma till varje ton pga alla toleranser
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Just ja, 555:an är ju inte särskilt dyr, enklaste och billigaste lösningen blir kanske med en 555:a för varje ton, finns ju kapslar med dubbla räknare.
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Har kommit fram till att sågtandsvåg låter bäst. Hittade inte riktigt någon tillämpning på det med 555:an så om ni hittar det får ni gärna posta.. Däremot hittade jag en sågtandsgenerator som såg ut [såhär Frågan är bara om det klarar att hålla sig inom en +-1Hz. Annars kunde man ju använda den istället. Någon som vet? Man får ju istället för ett av motstånden sätta en cermettrimmer och "stämma" in tonen. Frågan är bara om den är tillräckligt stabil :|
Skriv svar