Atmega8 තනු. MK AVR හි සරල ශබ්ද සයිරන්. ශබ්ද මොඩියුලය භාවිතා කිරීම

ලිපිය AVR මත සංගීත සංශ්ලේෂණ මූලධර්ම විස්තර කරයි. ඇතුළත් මෘදුකාංගය ඔබට ඕනෑම මිඩි ගොනුවක් බවට පරිවර්තනය කිරීමට ඉඩ සලසයි මූලාශ්රය AVR ක්ෂුද්‍ර පාලක සඳහා C හි සංගීත කොටස් නිමි සංවර්ධනයට නැවත ධාවනය එක් කිරීමට. සංගීත පෙට්ටියක මෘදුකාංග භාවිතා කිරීමේ උදාහරණයක් ලෙස සැලකේ.

පළමුව, එය ක්‍රියා කරන ආකාරය පෙන්වන කෙටි වීඩියෝවක්:

මෘදුකාංගය ඉඩ දෙන දේ

PC මෘදුකාංගය ඔබට තෝරාගත් midi ගොනුව ධාවනය කරන CodeVision AVR සඳහා C මූලාශ්‍රයක් ලබා ගැනීමට ඉඩ සලසයි:

1. අපි අපගේ ව්‍යාපෘතියට පොදු\hxMidiPlayer.h, common\hxMidiPlayer.c ඇතුළත් කරන්නෙමු. ATMega8Example\melody.h, ATMega8Example\melody.c, ATMega8Example\hxMidiPlayer_config.h හිස් තැන් පිටපත් කර සම්බන්ධ කරන්න.
2. MidiToC.exe ධාවනය කරන්න
3. Midi ගොනුව පූරණය කරන්න.
4. ප්ලේයරය සකසන්න: නියැදි අනුපාතය, නාලිකා ගණන, තරංග ආකෘතිය, ආදිය. මෘදුකාංගය AVR වාදනය කරන ආකාරයටම තනු වාදනය කරයි.
5. "Create player config" ක්ලික් කර මූලාශ්‍රය hxMidiPlayer_config.h වෙත අලවන්න.
6. "Create melody code" ක්ලික් කර මූලාශ්‍රය melody.c වෙත අලවන්න
7. අපගේ ව්‍යාපෘතියේදී, අපි PWM හෝ බාහිර DAC හරහා ශබ්දය ප්‍රතිදානය කිරීමට Player_Output() ක්‍රමය ක්‍රියාත්මක කරමු.
8. ටයිමරය නියැදි අනුපාතයට සකසන්න, බාධාවෙන් Player_TimerFunc() අමතන්න.
9. Player_StartMelody (&s_melody, 0) අමතන්න.

තනු වාදනය වන්නේ ටයිමර් බාධාවෙන්. මෙයින් අදහස් වන්නේ නැවත ධාවනය අතරතුර, ක්ෂුද්ර පාලකයට ප්රයෝජනවත් කාර්යයක් කළ හැකි බවයි.

එය ක්රියා කරන ආකාරය

ලිපියේ ඉතිරි කොටසින් මම මේ සියල්ල ක්‍රියාත්මක කරන්නේ කෙසේද යන්න කෙටියෙන් පැහැදිලි කිරීමට උත්සාහ කරමි. අවාසනාවකට, එය ඉතා කෙටියෙන් ක්රියා නොකරනු ඇත - ද්රව්ය ගොඩක් තිබේ. ඔබ උනන්දුවක් නොදක්වන්නේ නම්, ඔබට වහාම "මෘදුකාංගයේ විස්තරය" සහ "API ප්ලේයර්" යන කොටස් වෙත යා හැකිය.

සංගීතය යනු කුමක්ද

සංගීතය යනු විවිධ සංඛ්‍යාත සහ කාලසීමාවේ ශබ්ද අනුපිළිවෙලකි. ශබ්දයේ මූලික හරයේ සංඛ්‍යාතය යම් සටහනක සංඛ්‍යාතයට අනුරූප විය යුතුය. ශබ්දවල කම්පන සංඛ්‍යාතය ස්වරවල සංඛ්‍යාතවලට වඩා වෙනස් නම්, අපට පෙනෙන්නේ සංගීතඥයා “තාලයෙන් පිටවී” ඇති බවයි.

වගුව. සටහන සංඛ්යාත, Hz.

සියලුම සටහන් ඔක්ටේව් වලට බෙදා ඇත, සටහන් 7 බැගින් + සෙමිටෝන 5 (පියානෝවේ කළු යතුරු). අසල්වැසි අෂ්ටකවල සටහන් වල සංඛ්‍යාත හරියටම 2 ගුණයකින් වෙනස් වේ.

සරලම සංගීත වාදකයෙහි තනුවක සටහන් අනුපිළිවෙලක් (සටහන + කාලසීමාව) සහ සටහන් සංඛ්‍යාත සහිත වගුවක් අඩංගු වේ. ශබ්දය සංස්ලේෂණය කිරීම සඳහා, ටයිමර් නාලිකා වලින් එකක් භාවිතා කරනු ලැබේ, එය මැන්ඩරයක් සාදයි:

අවාසනාවකට, එවැනි ප්‍රාථමික ක්‍රීඩකයෙකුට ස්ථාවර තරංග ආකෘතියක් (මැන්ඩර්) ඇත, එය සැබෑ සංගීත භාණ්ඩවලට බෙහෙවින් සමාන නොවන අතර වරකට එක් සටහනක් පමණක් වාදනය කළ හැකිය.

සැබෑ තනුවක අවම වශයෙන් කොටස් දෙකක් (ඒකල + බාස්) අඩංගු වේ, ඊට අමතරව, පියානෝව වාදනය කරන විට, පෙර සටහන ඊළඟ එක ආරම්භ වන විට තවමත් ශබ්ද වේ. පියානෝවේ ව්‍යුහය මතක තබා ගැනීම මෙය තේරුම් ගැනීමට පහසුය - එක් එක් සටහන වෙනම නූලකට අනුරූප වේ. යතුරු මත අත ධාවනය කිරීමෙන් අපට එකවර නූල් කිහිපයක් ශබ්ද කළ හැකිය.

සමහර ක්ෂුද්‍ර පාලකයන්ට එකවර සටහන් කිහිපයක් වාදනය කිරීමට භාවිත කළ හැකි බහු ටයිමර් නාලිකා ඇත. නමුත් සාමාන්යයෙන් මෙම නාලිකා වටිනා සම්පතක් වන අතර, ඒවා සියල්ලම භාවිතා කිරීම නුසුදුසු ය. ඇත්ත වශයෙන්ම, අපි සංගීත පෙට්ටියක් සාදන්නේ නම් මිස.
සමස්තයක් වශයෙන්, බහු ශබ්ද සහ විවිධ සංගීත භාණ්ඩ ලබා ගැනීම සඳහා, ඔබ ශබ්ද සංශ්ලේෂණය භාවිතා කළ යුතුය.

AVR මත ශබ්ද සංශ්ලේෂණය

hxMidiPlayer ශබ්ද සංස්ලේෂණය භාවිතා කරන අතර විවිධ තරංග ආකෘති සමඟ බහුශ්‍රැත වාදනය කළ හැක. ක්‍රීඩකයා 8-22KHz සංඛ්‍යාතයකින් (ප්‍රොසෙසර බලය ප්‍රමාණවත් වන තාක්; එය තරංග ආකෘතිය සහ නාලිකා ගණන මත ද රඳා පවතී) ටයිමරයෙන් බාධා හසුරුවන්නෙහි නිමැවුම් සංඥාවේ විස්තාරය ගණනය කරයි.

ශබ්ද සංශ්ලේෂණයේ මූලධර්මය sinusoid සංස්ලේෂණයේ උදාහරණයෙන් පැහැදිලි කළ හැකිය.

අපි 64 ප්‍රමාණයේ වගුවක් ගනිමු, එහි සෑම සෛලයකම සයින් හි විස්තාරයේ අගයන් * 2 * PI / 64 ලක්ෂ්‍යයේ (එක් කාල පරිච්ඡේදයක්) අඩංගු වේ:

ස්ථිතික const flash uint8_t s_sineTable[ 64 ] = ( 0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8D, 0x8F, 0x90, 0x31,090,90,900 5, 0x95, 0x95, 0x95, 0x94, 0x93, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7E, 0x7C, 0x70,70, 70, 70, x71, 0x70, 0x6F, 0x6D, 0x6D , 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x76, 0x70A, x70A);

128 (0x80) ශුන්‍යයට, 255 (0xff) විශාලතම ධන ලක්ෂ්‍යයට, 0 විශාලතම සෘණ ලක්ෂ්‍යයට අනුරූප වේ.

දැන් අපි කියමු අපි වගුවේ සිට බාහිර DAC එකකට අගයන් 1000 Hz සංඛ්‍යාතයකින් හැඳින්වෙන ටයිමරයකින් බාධාවකින් ප්‍රතිදානය කරන්නෙමු:

ස්ථිතික uint8_t s_index = 0; // Timer1 ප්‍රතිදානය සංසන්දනය කරන්න බාධා සේවා සාමාන්‍ය බාධාවක් void timer1_compa_isr(ශුන්‍ය) (SetDac(s_sineTable[s_index]); නම් (s_index == 63) (s_index = 0; ) වෙනත් (s_index++; ) )

එහි ප්‍රතිඵලයක් වශයෙන් අපට ලැබෙන්නේ කුමක්ද? අපි 1000/64 Hz සංඛ්යාතයක් සහිත sinusoidal උච්චාවචනයන් ලබා ගනිමු.

දැන් අපි interrupt එකේ index එක 1කින් නෙවෙයි දෙකකින් වැඩි කරමු.
නිමැවුම් දෝලනයන්හි සංඛ්යාතය දැනටමත් 1000/64 * 2 Hz වනු ඇති බව පැහැදිලිය.

සාමාන්යයෙන්, සංඛ්යාතය F ලබා ගැනීම සඳහා, ඔබ විසින් වගුවේ දර්ශකය වැඩි කළ යුතුය:
add=F/1000*64

මෙම සංඛ්‍යාව භාගික විය හැක, නමුත් අධි වේගය ලබා ගැනීම සඳහා ස්ථාවර ලක්ෂ්‍ය අංක ගණිතය භාවිතා වේ.

වගුවේ ඇතුළත් කිරීම් ගණන සහ ටයිමරයේ සංඛ්යාතය සංස්ලේෂණය කරන ලද ශබ්දයේ ගුණාත්මක භාවයට බලපායි. අපගේ නඩුවේදී, එක් කාල පරිච්ඡේදයකට වගුවේ ඇතුළත් කිරීම් 64 ක් ප්රමාණවත් වන අතර, ටයිමර් සංඛ්යාතය 12kHz වේ. අවම පිළිගත හැකි ටයිමර් සංඛ්‍යාතය 8kHz වේ, කදිම 44kHz වේ.

පැහැදිලිවම, 12kHz ටයිමර් සංඛ්‍යාතයක් සමඟින්, අපට උපරිම වශයෙන් 6kHz වර්ග තරංගයක් ජනනය කළ හැකිය, මන්ද එක් කාල පරිච්ඡේදයකට අවම වශයෙන් මාරුවීම් දෙකක් සිදු කළ යුතු බැවිනි. කෙසේ වෙතත්, ටයිමරයේ සෑම ටික් එකකදීම නිමැවුම් තත්ත්වය නිවැරදිව ගණනය කළහොත් ඉහළ සංඛ්‍යාත තවමත් හඳුනාගත හැකිය.

ඔබට සයිනාකාර නොවන ආකෘතියක දෝලනය වන කාලය සඳහා අගයන් මේසයට ඇතුළත් කර වෙනස් ශබ්දයක් ලබා ගත හැකිය.

දුර්වල වීම

සංගීත භාණ්ඩයක් නූල් මත පදනම් වී ඇත්නම් (උදාහරණයක් ලෙස, පියානෝව), යතුරක් එබීමෙන් පසු, ශබ්දය සුමටව මැකී යයි. සංස්ෙල්ෂකයේ වඩාත් ස්වාභාවික ශබ්දයක් ලබා ගැනීම සඳහා, නෝට්ටුවේ ආරම්භයෙන් පසු දෝලනය වීමේ විස්තාරය ක්‍රමයෙන් අඩු කිරීම අවශ්‍ය වේ (දිරාපත්වීමේ ස්වරූපයෙන් දෝලනයන් “එතන්න” - “ලියුම් කවරය”).

සටහන ආරම්භ වන මොහොතේ සිට සයින් (හෝ වෙනත් තරංග ආකාරය) විස්තාරය අඩු කිරීමට භාවිතා කරන ක්‍රීඩකයා ක්ෂය වීමේ වගුවක් අඩංගු වේ.
එවැනි කවචයක "සයින්" "ඔතා" යාන්ත්රික සංගීත පෙට්ටියක ශබ්දයට සමානයි.

මීන්ඩර් සංස්ලේෂණය

මැන්ඩර් තරංගයේ විශේෂ හැඩය සංශ්ලේෂණය බෙහෙවින් සරල කිරීමට හැකි වේ. වගු භාවිතා නොකෙරේ. ටයිමරයේ වත්මන් ටික් එකේ දී ඇති සංඛ්‍යාතයේ ප්‍රතිදානය තිබිය යුත්තේ කුමන තත්වයද (1 හෝ 0) ගණනය කිරීම ප්‍රමාණවත් වේ. මෙය නිඛිල අංක ගණිතය භාවිතයෙන් සිදු කරයි, එය ඉතා ඉක්මනින් ක්‍රියා කරයි, එය බිට් 8 කොන්සෝලවල තනු වාදනය කිරීමට මැන්ඩරයක් භාවිතා කිරීමේ ජනප්‍රියතාවය පැහැදිලි කරයි.

උදාහරණය: කවුන්ටරයක් ​​ප්රකාශ කිරීම:

ස්ථිතික uint16_t s_counter = 0;

අපි ටයිමරයේ එක් එක් බාධාවකින් 0x8000 කින් වැඩි කරන අතර, අපි කවුන්ටරයේ ඉහළ බිට් එක වරායට ප්‍රතිදානය කරන්නෙමු:

// Timer1 ප්‍රතිදානය සංසන්දනය කරන්න බාධාකාරී සේවා සාමාන්‍ය බාධාවක් void timer1_compa_isr(නිෂ්ඵල) ( PORTA.0 = (s_counter >> 15) & 1; s_counter += 0x8000; )

0x8000 + 0x8000 = 0x10000 සිට, s_counter විචල්‍යය පිටාර ගැලීම, බිට් 17 ඉවත දමා 0x0000 විචල්‍යයට සකසයි.
මේ අනුව, 8KHz ටයිමර් සංඛ්යාතයක් සමඟ, ප්රතිදානය 4KHz වර්ග තරංගයක් වනු ඇත.
ඔබ කවුන්ටරය 0x4000 කින් වැඩි කළහොත්, ඔබට 2KHz මැන්ඩර් එකක් ලැබේ.

සාමාන්‍යයෙන්, ඔබට එකතු කිරීමෙන් F සංඛ්‍යාතය ලබා ගත හැක:
add=F/8000*0x10000

උදාහරණයක් ලෙස, 1234Hz සංඛ්යාතයක් සහිත හතරැස් තරංගයක් ලබා ගැනීම සඳහා, ඔබ 0x277C එකතු කළ යුතුය. සැබෑ සංඛ්‍යාතය ලබා දී ඇති සංඛ්‍යාතයට වඩා තරමක් වෙනස් වනු ඇත, මන්ද අපි පදය පූර්ණ සංඛ්‍යාවකට වට කරන බැවිනි. සංස්ෙල්ෂකයක් තුළ, මෙය පිළිගත හැකිය.

සැබෑ උපකරණ ශබ්ද සංස්ලේෂණය කිරීම

ඔබට පියානෝව පෙරාතුව සටහනක ශබ්දය ඩිජිටල්කරණය කළ හැකිය (ADC භාවිතා කරමින්, මතකයේ ශබ්ද විස්තාරයේ අගයන් නියමිත කාල පරාසයන් තුළ ගබඩා කරන්න):
ඉන්පසු ශබ්දය වාදනය කරන්න (DAC ආධාරයෙන්, වාර්තාගත අගයන් නියමිත කාල පරාසයන් තුළ ප්‍රදර්ශනය කරන්න).

සාමාන්යයෙන්, බෙර සංශ්ලේෂණය සඳහා, බෙර ශබ්ද පටිගත කිරීම සහ නියම වේලාවට ඒවා වාදනය කිරීම අවශ්ය වේ. 8-bit කොන්සෝල වල, බෙර ශබ්දය වෙනුවට "සුදු ශබ්දය" භාවිතා වේ. "සුදු ශබ්දය" සඳහා විස්තාරය අගයන් උත්පාදක යන්ත්රයක් භාවිතයෙන් ලබා ගනී අහඹු සංඛ්යා. ඒ අතරම, මතක පිරිවැය අවම වේ.
hxMidiPlayer බෙර සංශ්ලේෂණය සඳහා සුදු ශබ්දය භාවිතා කරයි.

නාලිකා මිශ්ර කිරීම

ටයිමරයේ දී ඇති ටික් එකක ඇති ශබ්ද විස්තාරය එක් එක් නාලිකාව සඳහා වෙන වෙනම ගණනය කෙරේ. අවසාන විස්තාරය අගය ලබා ගැනීම සඳහා, ඔබ සියලු නාලිකා වල අගයන් එකතු කළ යුතුය. සංජානනය කරන ලද ඝෝෂාව ලඝුගණක යැපීමකට අවනත වන බැවින් නිවැරදි ආකාරයෙන්, එකතුව සකස් කිරීම අවශ්‍ය වේ, නමුත් එවැනි සරල සංස්ෙල්ෂකයක දී ඔබට සරල එකතු කිරීමක් කිරීමට සිදුවේ. එබැවින්, එක් එක් නාලිකාවේ උපරිම විස්තාරය 255/N වේ.

AVR වෙතින් ශ්‍රව්‍ය ප්‍රතිදානය

අවශ්ය සියලු ගණනය කිරීම් සිදු කිරීමෙන් පසු, ක්රීඩකයා ඇනලොග් බවට පරිවර්තනය කළ යුතු සංඥා මට්ටම ලබා ගනී. මෙම අරමුණු සඳහා, ඔබට බාහිර DAC හෝ PWM භාවිතා කළ හැකිය.
සංශ්ලේෂණය සහ වටකුරු අඩු සංඛ්යාතය හේතුවෙන් පැන නගින අධි-සංඛ්යාත ශබ්ද ඉවත් කිරීමට - අවස්ථා දෙකේදීම ලැබුණු සංඥාව පෙරීමට යෝග්ය බව මෙහිදී සටහන් කළ යුතුය.

බාහිර සමාන්තර DAC වෙත ප්‍රතිදානය

නිශ්චිත DAC චිප් භාවිතා කිරීම අර්ථවත් නොවන බැවින්, එවැනි ව්‍යාපෘති සාමාන්‍යයෙන් R2R න්‍යාසයකින් ලබා ගනී:

මෙම යෝජනා ක්‍රමය සමඟ, අපි ගණනය කළ විස්තාරය වරායට ප්‍රතිදානය කරන්නෙමු:

PORTB = නියැදිය;

අඩුපාඩු:
1) R2R න්‍යාසයේ ප්‍රතිදානයේදී, එයද හැරෙනවා දුර්වල සංඥාව, ඇනලොග් ඇම්ප්ලිෆයර් භාවිතා කිරීම අනිවාර්ය වේ;
2) අවම වශයෙන් නිගමන 5 ක් භාවිතා කිරීම අවශ්ය වේ (සහ වඩාත් සුදුසු 8);
මෙම ක්රමය සාධාරණීකරණය කරනු ලබන්නේ නොමිලේ PWM නාලිකා නොමැති විට පමණි.

(ප්‍රතිදාන සුරැකීමට, ඔබට SPI අතුරුමුහුණත සමඟ බාහිර ADC භාවිතා කළ හැක).

PWM

නොමිලේ PWM නාලිකාවක් තිබේ නම්, පහසුම ක්රමය වන්නේ මෙම විශේෂිත ක්රමය භාවිතා කිරීමයි.

PWM ආරම්භ කිරීම (ATMega8):

// ටයිමර්/කවුන්ටරය 2 ආරම්භ කිරීම // ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 20000,000 kHz // මාදිලිය: වේගවත් PWM top=0xFF // OC2 ප්‍රතිදානය: ප්‍රතිලෝම නොවන PWM ASSR=0x00; TCCR2=0x69; TCNT2=0x00; OCR2=0x00; සහ නියැදි ප්‍රතිදානය: අවලංගු Player_Output(uint8_t නියැදිය) (OC2 = නියැදිය. )

PWM භාවිතා කිරීම සඳහා වන පොදු භාවිතයක් RC පෙරහනක් සමඟ ප්‍රතිදානය සුමට කිරීම ඇතුළත් වේ:

අවාසනාවකට, පෙරීමෙන් පසු, සංඥාව බොහෝ සෙයින් දුර්වල වන බැවින්, ස්පීකරය සම්බන්ධ කිරීම සඳහා ඔබට ඇනලොග් ඇම්ප්ලිෆයර් සෑදිය යුතුය.

පරිපථය සරල කිරීම සඳහා, ස්පීකරය දක්වාම "ඩිජිටල්" ලෙස සිටීම වඩාත් සුදුසුය. ලාභ ස්පීකරයකට තවමත් 30 kHz ට වැඩි සංඛ්‍යාත ප්‍රතිනිෂ්පාදනය කළ නොහැකි බැවින්, ඒවා පෙරීමට අවශ්‍ය නොවේ. විසරණය විසින්ම PWM හි ඉහළ සංඛ්‍යාත "පෙරහන" කරනු ඇත.

ඔබට වැඩි ධාරාවක් ලබා ගැනීමට අවශ්ය නම්, ඔබට ට්රාන්සිස්ටර ඇම්ප්ලිෆයර් භාවිතා කළ හැකිය. ස්පීකරයට අවශ්‍ය ධාරාව සැපයීමට R1 තෝරා ඇත.

එබැවින් ඔබට සෙල්ලම් බඩු වලින් කුඩා කථිකයන් සම්බන්ධ කළ හැකිය:

විශාල කථිකයන් සඳහා, ට්‍රාන්සිස්ටර 2ක් මත ගොඩ නැගීම සහ ශබ්දය ඉවත් කිරීමට LC ෆිල්ටරයක් ​​තැබීම වඩා හොඳය:

ධාරිත්‍රක C1 PWM ක්‍රියා නොකරන විට ස්පීකරය හරහා ධාරාව සීමා කිරීමට සේවය කරයි. එසේම, ශ්‍රේණියේ ධාරිත්‍රකයක් ඇතුළත් කිරීම හේතුවෙන්, ශුන්‍ය ගැන සමමිතික සංඥාවක් ස්පීකරයට ඇතුළු වේ. මේ අනුව, ස්පීකර් කේතුව මධ්යම "ලිහිල්" ස්ථානයට සාපේක්ෂව චලනය වනු ඇත, එය ශබ්දයේ ගුණාත්මකභාවය කෙරෙහි ධනාත්මක බලපෑමක් ඇති කරයි.
මෙම අවස්ථාවෙහිදී, ට්රාන්සිස්ටර යතුරු මාදිලියේ ක්රියා කරයි, එබැවින් මූලික මාරුව සඳහා වන්දි ගෙවීමට අවශ්ය නොවේ.

PWM, පින් දෙකේ සම්බන්ධතාවය

පළමු පරිපථ දෙකෙහි අවාසිය නම් ස්පීකරය එක් දිශාවකට ධාරාවක් ලබා දීමයි. අපි ධාරාවෙහි දිශාව වෙනස් කරන්නේ නම්, අවසර ලත් බලය ඉක්මවා නොගෙන පරිමාව 2 ගුණයකින් වැඩි කළ හැකිය. මෙය සිදු කිරීම සඳහා, ස්පීකරය ක්ෂුද්‍ර පාලකයේ අල්ෙපෙනති දෙකකට සම්බන්ධ කර ඇත - ප්‍රතිලෝම නොවන සහ ප්‍රතිලෝම, උදාහරණයක් ලෙස OC1A සහ / OC1A. ප්‍රතිලෝම නොවන ප්‍රතිදානයක් නොමැති නම්, ඔබට දෙවන නාලිකාව ප්‍රතිලෝම ආකාරයෙන් (OC1B) භාවිතා කළ හැක:

// ටයිමර්/කවුන්ටරය 1 ආරම්භ කිරීම // ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 24500,000 kHz // මාදිලිය: වේගවත් PWM top=0x00FF // OC1A ප්‍රතිදානය: Inv නොවන. // OC1B ප්‍රතිදානය: ප්‍රතිලෝම // ශබ්ද අවලංගු කරන්නා: ක්‍රියාවිරහිතයි // Falling Edge මත ආදාන ග්‍රහණය // Timer1 පිටාර ගැලීමේ බාධාව: Off // Input Capture Interrupt: Off // තරඟයක් සසඳන්න බාධාවක්: Off // B Match Interrupt: Off TCCR1A =0xB1; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; void Player_Output(uint8_t නියැදිය) ( OCR1A = නියැදිය; OCR1B = නියැදිය; )

PWM, Dual Output, Class D ඇම්ප්ලිෆයර්

යෝජිත යෝජනා ක්‍රමවල අවාසිය නම් නිශ්ශබ්දතාවය තුළ වත්මන් පරිභෝජනයයි.
අපට "නිශ්ශබ්දතාව" 128 සංඥා මට්ටමට අනුරූප වේ, එනම් 50% පිරවීමක් සහිත PWM - ධාරාව සෑම විටම ස්පීකරය හරහා ගලා යයි!

මෘදුකාංග කොටස තරමක් වෙනස් කිරීමෙන්, ඔබට තරමක් බලවත් පන්තියේ D දෘඪාංග-මෘදුකාංග ඇම්ප්ලිෆයර් ලබා ගත හැක:

Void Player_Output(uint8_t නියැදිය) ((නියැදිය >= 128) නම් (TCCR2=0x21; //සාමාන්‍ය, සංසන්දනය කිරීමේදී පැහැදිලිය TCCR2=0x21 | 0x80; //CLEAR OC2 PORTC.0 = 0; TCCR2=0x69; //non -ප්‍රතිලෝම PWM OCR2 = (නියැදිය-128) * 2; ) වෙනත්// නම් (නියැදිය< 128) { TCCR2=0x31; //normal, set on compare match TCCR2=0x31 | 0x80; //SET OC2 PORTC.0 = 1; TCCR2=0x79; //inverting PWM OCR2 = (128-sample) *2; } }

මෙම අවස්ථාවෙහිදී, ට්රාන්සිස්ටර යුගලයක් PWM ප්රතිදානයට සම්බන්ධ වේ, දෙවන - සාමාන්ය ඩිජිටල් ප්රතිදානය වෙත.

කේතයෙන් ඔබට පෙනෙන පරිදි, අපි 128 ට වැඩි සංඥාවක් එක් දිශාවකට ගලා යන ධාරාව ලෙසත්, 128 ට අඩු සංඥාවක් අනෙක් දිශාවට ගලා යන ධාරාව ලෙසත් සලකමු. 128 මට්ටමේ දී, ස්පීකර් නිමැවුම් දෙකම එකම බල සැපයුම් ප්රතිදානයට සම්බන්ධ කර ඇති අතර ධාරාවක් නොමැත. 128 මට්ටමේ සිට අපගමනය වන විට, PWM පිරවීම වැඩි වන අතර, සුදුසු ධ්රැවීයතාවක ධාරාවක් ස්පීකරය හරහා ගලා යයි.

වැදගත් ක්‍රියාත්මක කිරීමේ ලක්ෂ්‍යයක් වන්නේ දෙවන (සාමාන්‍ය ඩිජිටල්) ප්‍රතිදානය (PORTC.0) මාරු කරන මොහොතේ PWM ප්‍රතිදානය අපේක්ෂිත තත්වයට මාරු කිරීමට බල කිරීමයි. PWM දෝෂ ඉවත් කිරීම සඳහා OCR2 ලේඛනයට ලිවීම් බෆර කර ඇත. කාලය අවසන් වන තෙක් බලා නොසිට, අපි වහාම PWM ප්රතිදානය මාරු කළ යුතුය.

අවසාන පරිපථය IMHO සරල බව, බලශක්ති ඉතිරිකිරීම් සහ බලශක්ති ප්රතිදානය අනුව හොඳම විකල්පය වේ.

SquareWave තරංග ආකෘතිය සමඟ ශබ්ද ප්‍රතිදානය

මැන්ඩරයක් සංස්ලේෂණය කරන විට, සරල කළ ඇල්ගොරිතම භාවිතා වේ.

සෑම නාලිකාවක්ම (ඩ්‍රම්ස් ඇතුළුව) 0 හෝ 1 ප්‍රතිදානය කරයි. එබැවින් 3-නාලිකා ප්ලේයරයක් 0..3 පරාසයේ අගයන් ප්‍රතිදානය කරයි. එබැවින්, PWM භාවිතා කරන විට, ප්රතිදාන ක්රියා පටිපාටිය පෙනෙන්නේ:

Void Player_Output(uint8_t නියැදිය) ( OCR2 = නියැදිය * (255 / HXMIDIPLAYER_CHANNELS_COUNT); )

ඔබ PWM භාවිතා නොකරන්නේ නම්, සාම්ප්‍රදායික ඩිජිටල් ප්‍රතිදාන දෙකක් සහ 2-bit R2R න්‍යාසයක් 3-නාලිකා තනුවක් ප්‍රතිදානය කිරීමට ප්‍රමාණවත් වේ.

MIDI ආකෘතිය

ඔබ ප්‍රතිඵලයක් ලෙස ලැබෙන melody code එක දෙස බැලුවහොත්, array එක කුඩා පරාසයක සිට නැවත නැවත අංක භාවිතා කරන බව ඔබට පහසුවෙන් දැක ගත හැක. මෙය තේරුම් ගත හැකි ය: තනු නිර්මාණය අෂ්ටක 1-2 ක් තුළ සීමිත ස්වර සංඛ්‍යාවක් භාවිතා කරයි, තනු නිර්මාණයේ වේගය ස්ථාවර වේ - එම ප්‍රමාදයන්, නාලිකා ගණන 0..15 පරාසයක පවතී.
මේ සියල්ලෙන් අදහස් කරන්නේ යම් සම්පීඩන ඇල්ගොරිතමයක් යෙදීමෙන් ලැබෙන අරාව සැලකිය යුතු ලෙස අඩු කළ හැකි බවයි.
ZIP වැනි ඇල්ගොරිතම හොඳ සම්පීඩනයක් ලබා දෙයි, නමුත් වැඩ කිරීමට විශාල මතකයක් අවශ්‍ය වේ (ZIP ශබ්දකෝෂය - 64Kb). අපට පාහේ මතකයක් අවශ්‍ය නොවන ඉතා සරල සම්පීඩන ක්‍රමයක් යෙදිය හැකිය, එහි සාරය පහත පරිදි වේ.

එක් බයිටයක් තුළ, සියලුම සංඛ්යා 0 ... 255 පරාසය තුළ ඒකාකාරව බෙදා හරිනු ලබන අතර, සෑම අංකයක්ම බිටු 8 කින් නියෝජනය වේ. අපගේ නඩුවේදී, සමහර සංඛ්යා අනෙක් ඒවාට වඩා බෙහෙවින් පොදු වේ. ඔබ නිතර සංඛ්‍යා අඩු බිටු සහිත සහ අඩු පොදු සංඛ්‍යා වැඩි ගණනක් කේතනය කරන්නේ නම්, ඔබට මතක ශක්තියක් ලබා ගත හැක.

අපි ස්ථාවර කේතීකරණ ක්‍රමයක් තෝරා ගනිමු: බිටු 000,001 සහ 010 (දිග - බිටු 3) සංයෝජන වඩාත් පොදු සංඛ්‍යා 3 නියෝජනය කරනු ඇත. බිට් සංයෝජන 0110, 0111 (දිග - බිටු 4) - ඊළඟ වඩාත් පොදු අංක 2, ආදිය:

//000..010 - 0..2 //011 x 3..4 //100 xx 5..8 //101 xxx 9..16 //110 xxx 17..24 //111 වහාම

111 (දිග - බිටු 11) න් ආරම්භ වන සංයෝජනයක් අනෙකුත් සියලුම සංඛ්‍යා කේතනය කරයි.
බිටු කේතනය කර ඇති ආකාරය වෙනස් විය හැක. මම ක්‍රම කිහිපයක් අත්හදා බැලූ අතර එවැනි දත්තවල හොඳම ප්‍රතිඵල ලබා දීම ලෙස මෙය තෝරා ගත්තෙමි.

සම්පීඩන ක්රියා පටිපාටිය මේ ආකාරයෙන් පෙනේ:
1. X = සඳහා ප්‍රවාහයේ ඇති මුළු X සංඛ්‍යාව ගණනය කරන්න.
2. ප්‍රවාහයේ සිදුවන වාර ගණන අඩු කිරීමෙන් වර්ග කරන්න.
3. පළමු අංක 25 ගන්න. ඒවා අඩු බිටු වලින් කේතනය කරනු ලැබේ.
4. ආදාන ධාරාව සංකේතනය කරන්න.

ප්‍රතිදානයේදී, අපට නිතර සිදුවන සංඛ්‍යා 25 ක අරාවක් සහ ටිකක් ප්‍රවාහයක් ලැබේ.
මෙම සම්පීඩනය මඟින් ඔබට 50% ක සම්පීඩනයක් ලබා ගත හැක්කේ ඉතා සුළු මතක ප්‍රමාණයකින් සහ කාර්ය සාධනයෙනි. අවාසනාවකට, මෙය ක්‍රීඩකයාගේ කේතය වැඩි කරයි, එබැවින් කෙටි තනු සඳහා සම්පීඩනය නිර්දේශ නොකරයි.

සටහන් සංඛ්යාත ගබඩා කිරීම

සියලුම සටහන් වල සංඛ්‍යාත මතකයෙන් වගුවක ගබඩා කිරීම තරමක් මිල අධිකය. ඇත්ත වශයෙන්ම, නෝට්ටුවක සංඛ්‍යාතය එහි මධ්‍ය අංකයෙන් තීරණය කිරීම සඳහා සූත්‍රයක් තිබේ:

F = 2^((N - 69)/12) * 440, Hz

නමුත් භාගික බලය ගණනය කිරීම තරමක් අපහසුය. ඒ වෙනුවට, ක්‍රීඩකයා ඉහළ අෂ්ටකයේ සටහන් සංඛ්‍යාත 12 ගබඩා කරයි. පහළ අෂ්ටකවල සටහන් වල සංඛ්‍යාත තීරණය කරනු ලබන්නේ සංඛ්‍යාතය 2^Y වැඩි වාර ගණනකින් අඩු කිරීමෙනි, මෙහි Y යනු අෂ්ටක සංඛ්‍යාවයි.

සම්පීඩනය තවදුරටත් වර්ධනය කිරීම

තනු නිර්මාණය බොහෝ විට පුනරාවර්තන කොටස් ("ගායන", "පද") අඩංගු වේ. පුනරාවර්තන කොටස් සොයා ගැනීමෙන් සහ තනු නිර්මාණය කෑලි ආකාරයෙන් ඉදිරිපත් කිරීමෙන් ඔබට තනු නිර්මාණය තවත් 50% කින් අඩු කළ හැකිය. RAMසහ කාර්ය සාධනය. ව්යාපෘතිය සංකීර්ණ නොකිරීමට මම එවැනි ඇල්ගොරිතමයක් ක්රියාත්මක නොකළෙමි.

මෘදුකාංග විස්තරය

පරිවර්තක වැඩසටහනේ ප්රධාන කවුළුව:

ලෝඩ් මිඩි බොත්තම ඔබට මිඩි ගොනුවක් පූරණය කිරීමට ඉඩ සලසයි. වැඩසටහන වහාම දැනට තෝරාගත් පරාමිති සමඟ ගොනුව වාදනය කිරීමට පටන් ගනී, දෘඪාංගයේ ඇති ශබ්දය අනුකරණය කරයි.

තොරතුරු කවුළුව (4) පෙන්වයි:
- දිග - ms වලින් තෝරාගත් තනු ඛණ්ඩයේ දිග;
- Max Active syntezer channels - එකවර ක්‍රියාකාරී සංස්ෙල්ෂක නාලිකා උපරිම සංඛ්‍යාව;
- උපරිම ක්රියාකාරී බෙර නාලිකා - "බෙර" වාදනය කරන එකවර ක්රියාකාරී සංස්ෙල්ෂක නාලිකා උපරිම සංඛ්යාව;
- උපරිම ක්‍රියාකාරී ස්ටීරියෝ සටහන් - එකම සටහන වාදනය කරන උපරිම නාලිකා ගණන (පහත බලන්න);
- ඇස්තමේන්තුගත ප්‍රමාණය, බයිට් - තනු ප්‍රමාණය බයිට් වලින්. “අභිරුචි සාම්පල” මාදිලියේ, ප්‍රමාණය A+B ලෙස පෙන්වනු ලැබේ, A යනු තනු ප්‍රමාණය, B යනු නියැදි ප්‍රමාණයයි. ක්‍රීඩක කේත ප්‍රමාණය මෙහි සඳහන් කර නොමැත.

ප්‍රගති කවුළුව වත්මන් ධාවන ස්ථානය පෙන්වයි.
ඔබට නිශ්චිත ලක්ෂ්‍යයෙන් නැවත ධාවනය ආරම්භ කිරීමට ප්‍රගති තීරුව මත ක්ලික් කළ හැක.
වම් සහ දකුණු පස ඇති ආදාන කොටු ඔබට ms වලින් තනු ඛණ්ඩයේ ආරම්භය සහ අවසානය සඳහන් කිරීමට ඉඩ සලසයි.

රතු පාටින් ඇති “තනු වාදනය කිරීමට ප්‍රමාණවත් නාලිකා නොමැත” ලකුණෙන් පෙන්නුම් කරන්නේ වත්මන් සැකසුම් තුළ තනු වාදනය කිරීමට ප්‍රමාණවත් සංස්ලේෂක නාලිකා නොමැති බවයි. ක්රීඩකයා නොමිලේ නාලිකාවක් සොයා නොගන්නේ නම්, එය පැරණිතම සටහන නිවා දමයි. බොහෝ අවස්ථාවලදී මෙය හොඳින් ක්රියා කරනු ඇත. නාලිකා ගණන වැඩි කිරීම තේරුමක් ඇත්තේ තනුවක් කනට නොගැලපෙන විට පමණි.

සැකසුම් කොන්දේසි සහිතව ප්ලේයර් සිටුවම් සහ මිඩි ගොනු සැකසුම් සැකසුම් වලට බෙදිය හැක. ප්ලේයර් වින්‍යාසය සහ තනු කේතය එකම වාදක සැකසුම් සමඟ නිර්මාණය කර ඇත්නම් ක්‍රීඩකයාට ලැබුණු තනු කේතය වාදනය කිරීමට හැකි වේ. ඊට අමතරව, ක්‍රීඩකයාට තනුවක් වාදනය කිරීමට හැකි වනු ඇත, එහි කේතය කුඩා (නමුත් වැඩි නොවන) නාලිකා සංඛ්‍යාවක් සහිත ක්‍රීඩකයෙකු සඳහා නිර්මාණය කරන ලදී.

ක්‍රීඩක දෘඪාංග සැකසුම් වලට ඇතුළත් වන්නේ:

- නියැදි අනුපාතය - සංශ්ලේෂණ සංඛ්යාතය. උපරිම සංශ්ලේෂණ සංඛ්යාතය පර්යේෂණාත්මකව තීරණය කරනු ලැබේ. Atmega 16MHz මත පදනම්ව, ඔබට නාලිකා 6ක් සහිත ක්‍රීඩකයෙකු සඳහා 12000Hz වලින් ආරම්භ කළ හැකි අතර, තනුව විකෘති කිරීම දෘඪාංග වාදකයේ කනෙන් පෙනෙන තෙක් අවශ්‍ය පරිදි වැඩි කළ හැක. උපරිම සංඛ්‍යාතය නාලිකා ගණන, තරංග ආකෘතිය සහ තනුවේ සංකීර්ණත්වය මත රඳා පවතී.

- තරංග ආකෘතිය - තරංග ආකෘතිය:
- හතරැස් තරංගය - වංගුව;
– සයින් – සයින්;
- සයින් + ලියුම් කවරය - තෙතමනය සහිත සයින්;
– Waveform * + ලියුම් කවරය – damping සහ තොරව sinusoidal නොවන තරංගවල විවිධ ප්රභේද;
- අභිරුචි නියැදිය - උපකරණ සාම්පලයක් භාවිතා කරන්න.

"Load Sample" බොත්තම ඔබට WAV ගොනුවකින් නියැදියක් පැටවීමට ඉඩ සලසයි. WAV ගොනුව PCM 8-bit mono ආකෘතියෙන්, 4173Hz, C-5 සටහනෙන් විය යුතුය. ඉඟිය: ඔබට සංඛ්‍යාතය ඉහළ නැංවිය හැකි අතර සටහන අඩු කළ හැක, නමුත් ක්‍රීඩක සැකසුම් තුළ Pitch වෙනස් කරන්න. ආකෘති පරීක්ෂාවන් සිදු නොකෙරේ - ආකෘතිය වෙනස් නම්, ශබ්දය නිවැරදිව වාදනය නොවේ.
Pitch - ශබ්දයේ තාරතාව වෙනස් කිරීමට ඔබට ඉඩ සලසයි. උදාහරණයක් ලෙස, අෂ්ටක 1 ක් ඉහළින් ක්‍රීඩා කිරීමට, ඔබ Pitch +12 සැකසිය යුතුය.

සම්පීඩනය භාවිතා කරන්න - melody සම්පීඩනය භාවිතා කරන්න.
ඩ්‍රම් සංස්ෙල්ෂක සක්‍රීය කරන්න - ඩ්‍රම් සංස්ෙල්ෂක සක්‍රීය කරන්න.

ප්ලේයර් නාලිකා: සංස්ෙල්ෂක නාලිකා ගණන (එකම අවස්ථාවේදී ශබ්ද කරන උපරිම සටහන් ගණන).

MIDI ගොනු සැකසුම් සැකසීම් ඇතුළත් වේ:

සාමාන්යයෙන්, එවැනි සියුම් සුසර කිරීම අවශ්ය නොවේ. මෙම සැකසුම් පෙරනිමියෙන් තැබිය හැක.

Player API

ක්‍රීඩක ක්‍රියාත්මක කිරීම Common\hxMidiPlayer.c සහ Common\hxMidiPlayer.h ගොනු තුළ පිහිටා ඇත. මෙම ගොනු ව්‍යාපෘතියට ඇතුළත් කළ යුතුය. ඔබට වින්‍යාසය තැබීමට අවශ්‍ය hxMidiPlayer_config.h ගොනුව ද සෑදිය යුතුය.
ප්ලේයරය එකලස් කිරීමේ ඇතුළු කිරීම් නොමැතිව C වලින් ලියා ඇත, එය වෙනත් ක්ෂුද්‍ර පාලක වෙත ගෙනයාම පහසු කරයි.

Extern void Player_StartMelody (const flash TMelody* _pMelody, uint16_t_delay);

තනු වාදනය ආරම්භ කරන්න. _delay නැවත ධාවනයට පෙර ආරම්භක ප්‍රමාදය සකසයි, ඒකක 255 = තත්පර 1.

Void Player_Stop();

තනු වාදනය නවත්වන්න.

Extern bool Player_IsPlaying();

ගීතය වාදනය කර අවසන් නම් අසත්‍ය වේ.

Extern void Player_WaitFinish();

තනු වාදනය අවසන් වන තෙක් රැඳී සිටින්න.

Extern void Player_TimerFunc();

මෙම ශ්‍රිතය වින්‍යාසයෙහි දක්වා ඇති නියැදි අනුපාතයෙහි කාල ගණක බාධාවකින් හැඳින්විය යුතුය. තනු වාදනය සම්පූර්ණ වූ විට, ඇමතුම් ලබා ගත හැක.

Extern void Player_Output(uint8_t නියැදිය);

පරිශීලකයා විසින් ක්රියාත්මක කළ යුතුය. ඊළඟ නියැදිය ප්‍රතිදානය කිරීමට අවශ්‍ය වූ විට ක්‍රීඩකයා විසින් කැඳවනු ලැබේ.

Extern void Player_Started();

පරිශීලකයා විසින් ක්රියාත්මක කළ යුතුය. ක්රීඩකයා ගීතයක් වාදනය කිරීමට පටන් ගන්නා විට කැඳවනු ලැබේ. ටයිමර් බාධාවන් සැකසීමට භාවිතා කළ හැක.

Extern void Player_Finished();

පරිශීලකයා විසින් ක්රියාත්මක කළ යුතුය. වාදකයා ගීතය වාදනය කර අවසන් වූ විට ඇමතීය. ටයිමර් බාධා කිරීම් අක්‍රිය කිරීමට හෝ වෙනත් ගීතයක් වාදනය කිරීම ආරම්භ කිරීමට භාවිතා කළ හැක.

//#NOTES_TO_EEPROM නිර්වචනය කරන්න //#SINETABLE_TO_EEPROM නිර්වචනය කරන්න //#ලියුම_TO_EEPROM අර්ථ දක්වන්න

සටහන් වගුව, සයින් වගුව සහ damping වගුව eeprom තුළ තැබීමට නම්, මෙම රේඛා hxMidiPlayer_config.h ගොනුව තුළ අදහස් නොදැක්විය යුතුය.

ආදර්ශ ව්යාපෘති

ATMega644උදාහරණ - ATMega644 සඳහා ව්‍යාපෘතිය, 25MHz, PB3 මත PWM ප්‍රතිදානය.

මතක අවශ්‍යතා

වගුව. වාදකයේ ප්‍රමාණය සහ ෆ්ලෑෂ් හි තනු.

*පවතින හිස් නොවන ව්‍යාපෘතියකට ක්‍රීඩකයෙකු එක් කරන විට, කේත ප්‍රමාණය කුඩා වේ

** තනුවේ සාමාන්‍ය වාදනය සඳහා ප්‍රමාණවත් නාලිකා නොමැත

තනු නිර්මාණය 1: bach_minuet_in_g.mid, 35 තත්
තනු 2: යිරුමා-ගඟ_ඔබ තුළට_ගලා යයි.මැද, තත්පර 165
තනු නිර්මාණය 3: Franz Schubert - Serenade.mid, 217 තත්

ඔබට මේසයෙන් පෙනෙන පරිදි, අවම වින්‍යාසය තුළ, ඔබට ATTiny2313 තුළට පවා තරමක් දිගු තනුවක් සවි කළ හැකිය. සම්පීඩනය මගින් තනුවේ දෙගුණයකට වඩා අඩු කිරීමක් ලබා දිය හැක, නමුත් ක්‍රීඩක කේතයේ ප්‍රමාණය බයිට් 600 කින් වැඩි වේ.

සයින් සහ ක්ෂය සටහන් වගු EEPROM තුළ තැබිය හැකි අතර, පිළිවෙළින් ෆ්ලෑෂ් බයිට් 16, 50 සහ 100ක් පමණ ඉතිරි කර ගත හැක.

wav ගොනුවකින් නියැදියක් භාවිතා කරන විට, බයිට් වල නියැදියේ සැබෑ ප්‍රමාණය ක්‍රීඩක කේතයේ ප්‍රමාණයට එකතු කළ යුතුය.

භාවිත උදාහරණය

ප්ලේයරය භාවිතා කිරීමේ උදාහරණයක් ලෙස, සංගීත පෙට්ටියක් නිර්මාණය කිරීමේ ක්රියාවලිය සලකා බලන්න.

අපි නිමි MDF පෙට්ටිය ගනිමු:

ක්ෂුද්‍ර පාලකයක් ලෙස, අපි SO-8 පැකේජයේ ATTiny85 ප්‍රමාණවත් තරම් විශාල මතකයක් සහිත ලාභම එක ලෙස ගනිමු. Sine+Envelope නාලිකා 4ක් සමඟින් 18kHz සංශ්ලේෂණ සංඛ්‍යාතය ලබා ගැනීමට අපි එය 27MHz දක්වා අධිස්පන්දනය කරන්නෙමු.

ඇම්ප්ලිෆයර් බැටරි ඉතිරි කිරීම සඳහා ට්‍රාන්සිස්ටර 4 ක් මත D පන්තියේ වේ.

ට්‍රාන්සිස්ටර යතුරු ආකාරයෙන් ක්‍රියාත්මක වන අතර ඕනෑම එකක් විය හැක. ප්‍රේරක L1 සහ ධාරිත්‍රක C6 අධි-සංඛ්‍යාත ඝෝෂාවකින් තොරව ශබ්දය සඳහා රස බැලීමට තෝරා ගනු ලැබේ. ශබ්දය අඩු කිරීමට සහ ස්පීකරයේ පිම්ම අඩු කිරීමට R1 සහ R2 2K දක්වා වැඩි කළ හැක.

ධාවකයේ සීමාව ස්විචය පෙට්ටිය සඳහා විශේෂයෙන් නිර්මාණය කර ඇති පරිදි හොඳින් ගැලපේ (එය විවෘත කිරීමට ක්‍රියා කරයි - කවරය විවෘත කළ විට, පුවරුවට බලය සපයනු ලැබේ):

ස්ථිරාංග මූලාශ්‍ර ATTiny85MusicBox නාමාවලියෙහි පිහිටා ඇත.

8Kb ගැලපීමෙන්:
1) ක්‍රීඩකයා: 18000Hz, නාලිකා 4, සයින් + ලියුම් කවරය, පිච් + 12, සම්පීඩනය, තනු වාදනය කරයි (අවසාන එක EEPROM හි ගබඩා කර ඇත)
2) යිරුමා - ගංගාව ඔබ තුළ ගලා යයි
3) Franz Schubert - Serenade
4) පී.අයි. චයිකොව්ස්කි "ඔක්තෝබර්"

වීඩියෝ ප්රතිඵල:

තවදුරටත් සංවර්ධනය

මූලධර්මය අනුව, ක්රීඩකයා තවදුරටත් "නිමා" කළ හැකි අතර, එය සම්පූර්ණ මිඩි හෝ MOD ක්රීඩකයෙකු වෙත ගෙන එයි. මම පෞද්ගලිකව සිතන්නේ උසස් තත්ත්වයේ තනුවක් ලබා ගැනීම සඳහා, SD කාඩ්පතක් සම්බන්ධ කිරීම සහ එයින් ඕනෑම WAV ගොනුවක් වාදනය කිරීම පහසු වනු ඇති බවයි. හොඳම ගුණාත්මකභාවයමෘදුකාංග සංස්ලේෂණය මගින් සාමාන්‍යයෙන් ලබා ගත හැකි ප්‍රමාණයට වඩා. එවැනි ක්‍රීඩකයෙකු මෘදුකාංග සහ දෘඩාංග වඩා සරල ය. hxMidiPlayer හි නිකේතනය පාද කිහිපයක් ඉතිරිව ඇති විට සහ ෆ්ලෑෂ් හි යම් ඉඩක් ඇති විට සූදානම් කළ ව්‍යාපෘති සඳහා හොඳ ශබ්දයක් එක් කරයි. මෙම කාර්යය සමඟ, ඔහු දැනටමත් එහි වර්තමාන ස්වරූපයෙන් "විශිෂ්ට" සමඟ කටයුතු කරයි.

AVR හි සියලු වර්ගවල සංගීත පෙට්ටි / ඇමතුම් නිර්මාණය කිරීමේ ප්‍රශ්නය මෙයින් වසා දැමිය හැකි යැයි මම සිතමි 🙂

පාඩම දිගටම කරගෙන යාම ප්‍රමාද විය, එය තේරුම් ගත හැකි ය, මට මතක කාඩ්පත් සහ ගොනු සමඟ වැඩ කිරීමට ප්‍රගුණ කිරීමට සිදු විය FAT පද්ධතිය. නමුත් තවමත්, එය සිදු විය, පාඩම සූදානම් - ඇත්ත වශයෙන්ම, අලුත් අවුරුදු ආශ්චර්යයකි.

තොරතුරු සමඟ ලිපිය අධික ලෙස පැටවීම නොකිරීමට, මම wav ගොනු ආකෘතියේ ව්යුහය විස්තර නොකරමි, සෙවුම් යන්ත්රවල ප්රමාණවත් තරම් තොරතුරු තිබේ. ඔබ ඕනෑම Hex සංස්කාරකයකින් ගොනුව විවෘත කරන්නේ නම්, පළමු බයිට් 44 තුළ ගොනු වර්ගය, නියැදීමේ අනුපාතය, නාලිකා ගණන යනාදිය පිළිබඳ සියලු තොරතුරු අඩංගු බව පැවසීම ප්‍රමාණවත්ය. ඔබට ගොනුව විශ්ලේෂණය කිරීමට අවශ්‍ය නම්, මෙම ශීර්ෂකය කියවන්න සහ ඔබ සතුටු වනු ඇත.

පැටවීම බයිට් 44 කින් ආරම්භ වන අතර අවශ්‍යයෙන්ම ශබ්දය සාදන වෝල්ටීයතා මට්ටම් අඩංගු වේ. අපි දැනටමත් පාඩමේ අවසාන කොටසෙහි වෝල්ටීයතා මට්ටම් ගැන කතා කර ඇත. මේ අනුව, සෑම දෙයක්ම සරලයි, ඔබ මෙම පියවර ගොනුවේ නියැදි අනුපාතය සමඟ ස්පීකරයට ගෙන ඒමට අවශ්ය වේ.

කථිකයා භෞතිකව සොලවන්නේ කෙසේද? ඔබ PWM භාවිතයෙන් මෙම වෝල්ටීයතා මට්ටම් ප්‍රතිදානය කළ යුතුය, නැතහොත් R2R භාවිතා කරන්න. ඕනෑම අවස්ථාවක, එය භාවිතා කිරීම ඉතා සරල ය, අංකය කියවීම, එය OCR හෝ PORTx තුළ තබන්න. නිශ්චිත වේලාවකට පසු, ගොනුවේ අවසානය දක්වා ඊළඟ අගය ආදේශ කරන්න.

උදාහරණයක් ලෙස, සමහර wav ගොනු, දත්ත පැමිණෙන්නේ 44=0x2C බයිට් වලින්, 0x80 අංකය එහි ලියා ඇත, අපි ශබ්දය ප්‍රතිනිෂ්පාදනය කරමු, උදාහරණයක් ලෙස, පළමු ටයිමරයේ PWM සමඟ, අපි OCR1A=0x80 ලියන්නෙමු; ආදානයේ නියැදි අනුපාතය 8kHz යැයි කියමු, එබැවින් බාධාව එකම සංඛ්‍යාතයට සැකසිය යුතුය. බාධාවේදී, 1/8000=125µs පසු ඊළඟ අගය 0x85 ආදේශ කරන්න.

බාධා කිරීම් 8kHz ට සකසන්නේ කෙසේද? මතක තබා ගන්න, ටයිමරය 250kHz සංඛ්‍යාතයකින් ක්‍රියා කරයි නම්, බාධා සංසන්දන ලේඛනය ආදේශ කළ යුතුය (250/8)-1=31-1 හෝ 0x1E. PWM සමඟ, සෑම දෙයක්ම සරලයි, එය වැඩ කරන සංඛ්යාතය වැඩි වන තරමට වඩා හොඳය.

ස්ථිරාංග ක්‍රියා කිරීම සඳහා, 23.2 පාඩමෙන් PetitFat භාවිතා කරමින් ෆ්ලෑෂ් ධාවකය FAT32 හි ආකෘතිගත කර ඇති බවට අපි එකඟ වෙමු. wav ගොනුව 8kHz හෝ 22.050kHz, mono වේ. ගොනු නාමය 1.wav. අපි ස්ථිරාංග විශ්ලේෂණය කරමු.

#ඇතුළත් #ඇතුළත් "diskio.h" #ඇතුළත් "pff.h" අත්සන් නොකළ char buffer[ 512 ] ; /* ෆ්ලෑෂ් ධාවකය වෙතින් තොරතුරු පිටපත් කර ඇති බෆරය */වාෂ්පශීලී අත්සන් නොකළ int ගණන; // පිටපත් කළ දත්ත කවුන්ටරයබාධා කරන්න [ TIM2_COMP] void timer2_comp_isr(void ) // අගයන් ආදේශ කර ඇති බාධා කරන්න( OCR1A = බෆරය[ගණනය] ; // ස්පීකරයට ශබ්දය ප්‍රතිදානය කරන්නනම් (++ ගණන් >= 512 ) //වර්ධක කවුන්ටරයගණන් = 0; //512 නැවත සකස් කර ඇත්නම්) void main(void ) ( unsigned int br; /* ගොනු කියවීම / ලිවීමේ කවුන්ටරය */අත්සන් නොකළ char buf = 0 ; //විචල්‍යය මඟින් බෆරයේ කියවන කොටස නිර්වචනය කරයි FATFS fs; /* තාර්කික ධාවක සඳහා වැඩ අවකාශය (ගොනු පද්ධති වස්තුව) */ PORTB=0x00 ; DDRB=0x02 ; //ජම්ප් ෂිම් ocr1a // ටයිමර්/කවුන්ටරය 1 ආරම්භ කිරීම// ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 8000,000 kHz // මාදිලිය: වේගවත් PWM top=0x00FF // OC1A ප්‍රතිදානය: Inv නොවන. TCCR1A=0x81 ; TCCR1B=0x09 ; TCNT1= 0x00 ; OCR1A=0x00 ; // ටයිමර්/කවුන්ටරය 2 ආරම්භ කිරීම// ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 250,000 kHz // මාදිලිය: CTC top=OCR2 TCCR2= 0x0B ; TCNT2= 0x00 ; //OCR2=0x1E; //සැසඳීමේ ලේඛනය 8kHz සඳහා සකසන්න OCR2=0xA ; //22kHz සඳහා #asm("sei") // ටයිමර්(ය)/කවුන්ටරය(ය) බාධා(ය) ආරම්භ කිරීමනම් (disk_initialize() == 0 ) //ෆ්ලෑෂ් ධාවකය ආරම්භ කරන්න(pf_mount(& fs) ; // කන්ද ගොනු පද්ධතිය pf_open("1.wav") ; // wavka විවෘත කරන්න pf_lseek(44) ; //දර්ශකය 44 වෙත ගෙන යන්න pf_read(බෆරය, 512 ,& br) ; // පළමු වතාවට අපි එකවර බයිට් 512 ක් ගිල දමමු TIMSK=0x80 ; //(1) අතරතුර සංගීතය ක්‍රියාත්මක කරන්න ((! buf && count> 255 නම්) //බයිට් 255 කට වඩා වාදනය කර ඇත්නම්,(pf_read(& buffer[ 0 ] , 256 ,& br) ; //එවිට අපි ෆ්ලෑෂ් ඩ්‍රයිව් එකෙන් බෆරයේ පළමු භාගයේ කියවමු buf=1; නම් (br< 256 ) //බෆරයේ අගයන් 256ක් නොමැති නම්, ගොනුවේ අවසානයකඩන්න ; ) නම් (buf && ගණන්< 256 ) { pf_read(& buffer[ 256 ] , 256 ,& br) ; // ෆ්ලෑෂ් ධාවකය වෙතින් බෆරයේ දෙවන කොටස කියවන්න buf = 0 ; නම් (br< 256 ) break ; } } TIMSK = 0x00 ; //глушим все pf_mount(0x00 ) ; // මේදය විසුරුවා හරින්න) අතරතුර (1) ()

#ඇතුළත් #ඇතුළත් "diskio.h" #ඇතුළත් "pff.h" අත්සන් නොකළ char buffer; /* ෆ්ලෑෂ් ඩ්‍රයිව් වෙතින් තොරතුරු පිටපත් කර ඇති බෆරය */ වාෂ්පශීලී අත්සන් නොකළ ඉන්ට් ගණන; //පිටපත් කරන ලද දත්තවල කවුන්ටරය බාධා කිරීම් void timer2_comp_isr(ශුන්‍ය) //අගයයන් ආදේශ කර ඇති බාධාව (OCR1A = බෆරය; //ප්‍රතිදාන ශබ්දය ස්පීකරයට නම් (++ගණනය >= 512) //වර්ධක කවුන්ටර ගණන = 0; //512 යළි පිහිටුවුවහොත්) හිස් ප්‍රධාන(නිෂ්ප්‍රභ) (අත්සන් නොකළ int br; /* ගොනු කියවීම/ලිවීමේ කවුන්ටරය */ අත්සන් නොකළ char buf = 0; // FATFS fs මඟින් බෆරයේ කුමන කොටස කියවා ඇත්ද යන්න නිර්වචනය කරන විචල්‍යය; /* වැඩබිම ( ගොනු පද්ධති වස්තුව) තාර්කික තැටි සඳහා */ PORTB=0x00; DDRB=0x02; // PWM jogging ocr1a // Timer/Counter 1 ආරම්භ කිරීම // ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 8000,000 kHz // මාදිලිය: වේගවත් PWM top=0x00FF // OC1A ප්‍රතිදානය: ආගන්තුක නොවන // මාදිලිය: CTC top= OCR2 TCCR2=0x0B; TCNT2=0x00; //OCR2=0x1E; //8kHz OCR2=0xA සඳහා සැසඳීමේ ලේඛනය සකසන්න; //22kHz සඳහා #asm("sei") // Timer(s) /Counter(s) Interrupt(s) initialization if(disk_initialize()==0) //flash drive එක initialize (pf_mount(&fs); //ගොනු පද්ධතිය සවිකරන්න pf_open("1.wav"); //vac pf_lseek(44) විවෘත කරන්න; //දර්ශකය 44 pf_read වෙත ගෙන යන්න (බෆරය, 512,&br); //පළමු වතාවට අපි බයිට් 512ක් එකවර ගිල දමමු TIMSK=0x80; //සංගීතය සක්‍රිය කරන අතරතුර(1) (if(!buf && count>255) //බයිට් 255කට වඩා වාදනය කර ඇත්නම්, (pf_read(&buffer, 256,&br);//එවිට අපි තොරතුරු කියවන්නෙමු ෆ්ලෑෂ් ධාවකය බෆරයේ පළමු භාගයට buf=1 ; if (br< 256) //если буфер не содержит 256 значений значит конец файла break; } if(buf && count<256) { pf_read(&buffer, 256,&br); // читаем во вторую часть буфера с флешки buf = 0; if (br < 256) break; } } TIMSK = 0x00; //глушим все pf_mount(0x00); //демонтируем фат } while (1) { } }

පරීක්ෂා කිරීම සඳහා, අපි ස්පීකරය OCR1A කකුලට 100uF ධාරිත්‍රකයක් හරහා, “+” ක්ෂුද්‍ර පාලක කකුලට, “-” ස්පීකරයට සම්බන්ධ කරමු. "-" ස්පීකරය බිමට, "+" ධාරිත්‍රකයට.

ඝෝෂාකාරී ප්‍රතිදානයක් බලාපොරොත්තු නොවන්න, එය ශබ්ද කිරීමට ඔබට ඇම්ප්ලිෆයර් අවශ්‍ය වේ. වීඩියෝවෙන් ඔබට එය පැහැදිලිව දැකගත හැකිය. පරීක්ෂණය සඳහා, මම කුකුළා 8kHz සහ ධාවන පථය 22kHz පුරවා ඇත.

කැමති අයට 44kHz ගොනු වාදනය කිරීමට ටයිමර් 2 හි සංඛ්‍යාතය ආරක්ෂිතව වැඩි කළ හැකිය, අත්හදා බැලීම්වලින් පෙනී යන්නේ තරමක් හොඳ ශබ්දයක් ලබා ගත හැකි බවයි. වීඩියෝවේ, ශබ්දය දුර්වල වන අතර ගුණාත්මක භාවය දුර්වලයි, නමුත් ඇත්ත වශයෙන්ම මෙයට හේතුව මම එය කැමරාවකින් වෙඩි තැබීමයි.

මම Apparatchik විසින් කාරුණිකව සපයන ලද ද්‍රව්‍ය ද පළ කරමි - CAVR සඳහා ස්ථිරාංග ලියා ඇති GCC සඳහා මූල කේතය.

සහ 44kHz ප්ලේබැක් සහිත වීඩියෝව.

අලුත් අවුරුද්දේ සැමට සුබ පැතීමට මම මෙය අවස්ථාවක් කර ගනිමි, සියලුම ස්ථිරාංග සහ උපාංග ඔබ වෙනුවෙන් ක්‍රියා කරයි 🙂

Atmega8 හි wav ප්ලේයර් ව්‍යාපෘතිය

AVR ක්ෂුද්‍ර පාලකයේ ඕනෑම ව්‍යාපෘතියකට තනු හෝ ශබ්ද අනුපිළිවෙලවල් වාදනය කිරීමේ කාර්යය එක් කිරීමට ඔබට ඉඩ සලසන මෘදුකාංග මොඩියුලයක් ලියා ඇත.

මොඩියුලයේ විශේෂාංග:

නිමි ව්යාපෘතිය සමඟ පහසු ඒකාබද්ධ කිරීම

8-bit ටයිමරය t2 පමණක් සම්බන්ධ වන අතර, එය ඡන්ද විමසීමට හෝ කාල පරතරයන් සැකසීමට භාවිතා කළ හැකිය.

මොඩියුලය ඔරලෝසු උත්පාදක යන්ත්රයේ ඕනෑම සංඛ්යාතයකට පාහේ සුසර කර ඇත

සටහන් වල තාරතාව සංකේතාත්මක නියතයන් (C0, A2, ආදිය) හෝ හර්ට්ස් වලින් දක්වා ඇත.

කාලසීමාවන් සම්මත ආකාරයෙන් (කාර්තු, අට වැනි) හෝ මිලි තත්පර වලින් දක්වා ඇත

තනු නිර්මාණයේ වේගය සහ පුනරාවර්තන ගණන සැකසිය හැකිය

නැවත ධාවනය අතරතුර, තනු නිර්මාණය විරාම කළ හැක


ශබ්ද මොඩියුලය සම්බන්ධ කිරීම

1. සියලුම මොඩියුල ගොනු (tone.h, sound.h, sound.c) ව්‍යාපෘති ෆෝල්ඩරය වෙත නැවත ලියන්න.

2. sound.c ගොනුව ව්‍යාපෘතියට සම්බන්ධ කරන්න.

IAR `a සඳහා - Workspace කවුළුවෙහි දකුණු-ක්ලික් කර Add > Add Files තෝරන්න ...

WINAVR සඳහා, එය සමාන වේ, makefile වෙත එක් කිරීමට අවශ්‍ය වන්නේ sound.c පමණි:

SRC = $(TARGET).c sound.c

3. සුදුසු මොඩියුලයේ ශීර්ෂ ගොනුව sound.h ඇතුළත් කරන්න. උදාහරණයක් ලෙස, main.c

#"sound.h" ඇතුලත් කරන්න

4. sound.h ගොනුවේ මොඩියුල සැකසුම් සකසන්න

// අදහස් දක්වන්නේ නම් - සටහන් වල කාලසීමාව වනු ඇත

//තනුවෙහි දක්වා ඇති BPM වලින් ගණනය කරන්න

//වමේ නම්, පහත දක්වා ඇති අගයෙන්

//# SOUND_BPM 24 අර්ථ දක්වන්න

// ඔරලෝසු සංඛ්‍යාතය mk

# SOUND_F_CPU 16U නිර්වචනය කරන්න

//ශබ්දය ජනනය වන ක්ෂුද්‍ර පාලකයේ ප්‍රතිදානය

#PORT_SOUND PORTB නිර්වචනය කරන්න

#PINX_SOUND 0 නිර්වචනය කරන්න

// දී ඇති තනු ගණන.

#ශබ්ද_AMOUNT_MELODY 4 නිර්වචනය කරන්න

5. sound.c වෙත ඔබේම තනු එකතු කර තනු අරාවට තනු වල නම් ලියන්න.

තනු එකතු කිරීම

තනු නිර්මාණය බිටු 16 ක අරාවක් වන අතර පහත ව්‍යුහය ඇත

BPM (විනාඩියකට කාර්තු සටහන් ගණන)ස්වරවල කාලසීමාව ගණනය කිරීමට භාවිතා කරන නියතයක් වන අතර තනුවක් වාදනය වන වේගය තීරණය කරයි.

BPM හට 1 සිට 24 දක්වා අගයන් ගත හැක, එය පිළිවෙලින් විනාඩියකට කාර්තු සටහන් 10 සහ 240 ට අනුරූප වේ.

සටහන්/ශබ්දවල කාලසීමාව මිලි තත්පර වලින් දක්වා තිබේ නම්, අරාවෙහි දක්වා ඇති BPM 1 ට සමාන විය යුතුය.

SOUND_BPM නියතය sound.h ශීර්ෂ ගොනුව තුළ විවරණය කර ඇත්නම්, අරාවෙහි දක්වා ඇති BPM `y ට අනුව වැඩසටහන් ක්‍රියාත්මක කිරීමේදී සටහන් වල කාලසීමාව ගණනය කෙරේ. SOUND_BPM ප්‍රකාශ කර නොමැති නම්, මෙම නියතයේ අගය මත පදනම්ව, සම්පාදනය කිරීමේ අදියරේදී සටහන් කාලසීමාව ගණනය කරනු ලබන අතර, සියලුම තනු එකම වේගයකින් වාදනය වේ. මෙය ක්‍රියාකාරීත්වය සීමා කරයි, නමුත් කේත බයිට් කිහිපයක් ඉතිරි කරයි.

පුනරාවර්තන ගණන. 1 ... 254 සහ LOOP (255) අගයන් ගත හැක. LOOP - යන්නෙන් අදහස් වන්නේ SOUND_STOP හෝ SOUND_PAUSE විධානය ලබා දෙන තෙක් තනු නිර්මාණය දින නියමයක් නොමැතිව නැවත නැවත සිදු වන බවයි.

සටහන් කාල සීමාව- දී ඇති ශබ්දයේ ස්වරයක් ජනනය වන හෝ විරාමයක් පවත්වා ගෙන යන කාලය. ms(x) මැක්‍රෝ භාවිතයෙන් හෝ සම්මත සටහන් දිග ලෙස - අටවන, දහසය වැනි, ms හි සඳහන් කළ හැක. පහත දැක්වෙන්නේ සහාය දක්වන කාල සීමාවන් ලැයිස්තුවකි. සමහර විදේශීය කාලසීමාවන් සඳහා අවශ්යතාවයක් තිබේ නම්, ඒවා සෑම විටම tone.h ගොනුවේ එකතු කළ හැක

n1 - සම්පූර්ණ සටහන

n2 - අර්ධ සටහන

n4 - කාර්තුව

n8 - අටවෙනි

n3 - අටවන ත්රිත්ව

n16 - දහසයවන

n6 - sextuple

n32 - තත්පර තිහ

සටහන පිච් tone.h ගොනුවේ විස්තර කර ඇති සංකේතාත්මක නියතයන් භාවිතයෙන් සකසා ඇත, උදාහරණයක් ලෙස C2, A1, ආදිය. F(x) මැක්‍රෝ භාවිතයෙන් හර්ට්ස් හි සටහන් උසද සඳහන් කළ හැක.

වැඩසටහනට අවම සහ උපරිම ශබ්ද සංඛ්‍යාතයේ සීමාවන් ඇත!

Melody end marker.අරාවේ අවසාන මූලද්‍රව්‍යයේ අගය ශුන්‍ය විය යුතුය.

ශබ්ද මොඩියුලය භාවිතා කිරීම

Main`a ආරම්භයේදී, SOUND_Init () ශ්‍රිතය ඇමතීමට අවශ්‍ය වේ. මෙම ශ්‍රිතය ක්ෂුද්‍ර පාලක පින් එක ප්‍රතිදානය කිරීමට සකසයි, T2 ටයිමරය වින්‍යාස කරයි, සහ මොඩියුල විචල්‍යයන් ආරම්භ කරයි.

එවිට ඔබට බාධා සක්‍රීය ධජය - __enable_interrupt() සැකසීමට අවශ්‍ය වේ, මන්ද මොඩියුලය පිටාර ගැලීම සහ අහඹු ලෙස T2 ටයිමර් බාධා කිරීම් භාවිතා කරයි.

ඊට පසු, ඔබට තනු වාදනය කිරීමට පටන් ගත හැකිය.

උදාහරණයක් ලෙස, මේ වගේ:

SOUND_SetSong(2);

SOUND_Com(SOUND_PLAY); //තනුව වාදනය කරන්න

//දෙවන තනුවට දර්ශකය සකසන්න

//සහ නැවත ධාවනය ආරම්භ කරන්න

SOUND_PlaySong(2);

SOUND_STOP විධානය නිකුත් කිරීමෙන් මෙලඩි ප්ලේබැක් ඕනෑම වේලාවක නතර කළ හැක.
එසේම, SOUND_PAUSE විධානය භාවිතයෙන් තනු නිර්මාණය විරාම කළ හැක. SOUND_PLAY විධානය පසුකාලීනව නිකුත් කිරීමෙන් තනු නිර්මාණය නතර වූ ස්ථානයේ සිට නැවත වාදනය වේ.

ප්‍රතිපත්තිමය වශයෙන්, මෙම ක්‍රියාකාරිත්වය විශේෂයෙන් අවශ්‍ය නොවේ (මම එය ඉස්කුරුප්පු කර ඇත) සහ මොඩියුලය සමඟ වැඩ කරන විට, SOUND_PlaySong (අත්සන් නොකළ char numSong) ශ්‍රිතය ප්‍රමාණවත් වේ;

ගොනු

ඔබට පහත සබැඳි වලින් ශබ්ද මොඩියුලය භාවිතා කිරීමේ උදාහරණ බාගත කළ හැකිය. මම රූප සටහනක් ඇන්දේ නැත, මන්ද එහි සියල්ල සරල ය. PB0 පින් එකට සම්බන්ධයි, melody start බොත්තම PD3 පින් එකට සම්බන්ධයි. ව්‍යාපෘතිවල තනු 4ක් අර්ථ දක්වා ඇත. බොත්තම එබීමෙන් සෑම විටම නව තනුවක් ආරම්භ වේ. atmega8535 microcontroller භාවිතා වේ. මුලදී, මට PLAY, STOP, PAUSE සහ NEXT යන බොත්තම් හතරක් සහිත ව්‍යාපෘතියක් සමඟ ව්‍යාකූල වීමට අවශ්‍ය විය, නමුත් පසුව මම සිතුවේ එය අතිරික්ත බවයි.

PS: මොඩියුලය පුළුල් ලෙස පරීක්ෂා කර නොමැති අතර "පවතින පරිදි" ලබා දී ඇත. තාර්කික යෝජනා තිබේ නම් - අපි එය අවසන් කරමු.

මෙම ලිපියෙන් අපි ස්වර වාදනය කරන්නේ කෙසේද සහ මොනොෆොනික් තනුවක් වාදනය කරන්නේ කෙසේදැයි ඉගෙන ගනිමු.

වැඩ සඳහා සූදානම් වීම

වැඩසටහන අරා දෙකක් ප්‍රකාශ කරයි. සටහන් සහිත අරාව සටහන්සරල සටහන් ගණනය කිරීමක් අඩංගු වේ. මෙම සටහන් අරාවේ ශබ්දයේ කාලසීමාව සමඟ සම්බන්ධ වේ පහර දෙයි. සංගීතයේ කාලසීමාව තීරණය වන්නේ මුළු සටහනට සාපේක්ෂව සටහන බෙදීමෙනි. අගය සම්පූර්ණ සටහනක් ලෙස ගනු ලැබේ 255 . මෙම සංඛ්‍යාව බෙදීමෙන් අඩක්, හතරෙන් එකක්, අටෙන් එකක් ලැබේ.
පළමු සටහනේ කාලසීමාව 255 බලයෙන් දෙකකින් බෙදීමෙන් නොලැබෙන බව සලකන්න. මෙහිදී ඔබ සංගීත න්‍යායට මාරු විය යුතුය. මුල් තනු නිර්මාණයේ සටහන් නැරඹිය හැකිය. මෙම සටහන් ත්රිත්ව බවට ඒකාබද්ධ වේ. මෙම සංයෝජනය සමඟ, අටෙන් එකක සටහන් තුනක් හතරෙන් එකකට සමාන වේ. එබැවින් ඔවුන්ගේ සාපේක්ෂ කාලය 21 කි.
එසේම, පරිශීලකයා විධානය භාවිතා කරමින් අනුපිළිවෙලෙහි සටහන් ගණන පැහැදිලිව සඳහන් කළ යුතුය:

# SEQU_SIZE 19 නිර්වචනය කරන්න

ප්‍රධාන වැඩසටහනේදී, ප්‍රථමයෙන්ම, සංඛ්‍යාත සහ කාල පරාසයන් සංඥා කාල පරිච්ඡේද සහ සටහන් කාල සීමාවන් ලෙස නැවත ගණනය කරනු ලැබේ.
සංඥා කාල සීමාවන් සමඟ (අරාව සංඥා_කාලසීමාව) සරලයි. 1000000 සංඥාවේ සංඛ්‍යාතයෙන් බෙදන්න, කාල සීමාව මයික්‍රො තත්පර වලින් ලබා ගන්න.
නෝට්ටු ශබ්දයේ නිරපේක්ෂ කාලසීමාව ගණනය කිරීම සඳහා, සංගීත කොටසෙහි වේගය නියම කිරීම අවශ්ය වේ. මෙය විධානය සමඟ සිදු කෙරේ

# TEMPO 108 නිර්වචනය කරන්න

සංගීතයේ ටෙම්පෝ යනු විනාඩියකට කාර්තු ගණනයි. පෙළට

# සම්පූර්ණ_සටහන_DUR 240000 / TEMPO අර්ථ දක්වන්න

සම්පූර්ණ සටහනක කාලසීමාව මිලි තත්පර වලින් ගණනය කෙරේ. දැන් සූත්‍රය භාවිතයෙන් අරාවෙන් සාපේක්ෂ අගයන් නැවත ගණනය කිරීම ප්‍රමාණවත් වේ පහර දෙයිනිරපේක්ෂ අරාවන් වෙත සටහන්_කාලසීමාව.
ප්රධාන ලූපයේ, විචල්යය ගත වූ_කාලයසටහනේ කාලසීමාව ඉක්මවන තෙක් එම කාලසීමාව අනුව වාදනය වන සංඥාවේ එක් එක් කාල පරිච්ඡේදයෙන් පසුව වැඩි වේ. මෙම ප්රවේශය කෙරෙහි අවධානය යොමු කිරීම වටී:

අතරතුර (ගත වූ_කාලය< 1000 * ((uint32_t) note_duration[ i] ) )

විචල්ය ගත වූ_කාලය 32-bit, සහ අරාවේ මූලද්රව්ය සටහන්_කාලසීමාව 16-බිට්. 16-bit අංකයක් 1000 කින් ගුණ කළහොත්, සහතික පිටාර ගැලීම සිදුවනු ඇත සහ විචල්යය ගත වූ_කාලයකසළවලට සමාන කරනු ඇත. විකරණය කරන්නා (unint32_t)අරා මූලද්‍රව්‍යයක් පරිවර්තනය කරයි සටහන්_කාලසීමාව[i] 32-bit අංකයක් බවට සහ පිටාර ගැලීමක් සිදු නොවේ.
ශ්‍රව්‍ය ප්ලේබැක් ලූපයේ, ඔබට තවත් විශේෂාංගයක් දැකිය හැක. කාර්යය භාවිතා කිරීමට නොහැකි වනු ඇත _ප්‍රමාද_අප(), එහි තර්කය විචල්‍යයක් විය නොහැකි බැවිනි.
එවැනි ප්රමාදයන් නිර්මාණය කිරීම සඳහා, ශ්රිතය භාවිතා කරන්න VarDelay_us(). එහි, 1 μs ප්‍රමාදයක් සහිත චක්‍රය නිශ්චිත වාර ගණනක් අනුචලනය කරයි.

void VarDelay_us(uint32_t takt) ( අතරතුර (takt- - ) (_delay_us(1 ) ; ) )

තනුවක් වාදනය කිරීමේදී තවත් ප්‍රමාද දෙකක් භාවිතා වේ. සටහන් විරාමයකින් තොරව වාදනය කරන්නේ නම්, ඒවා එකකට ඒකාබද්ධ වේ. මෙය සිදු කිරීම සඳහා, විධානය මගින් සකසා ඇති ඒවා අතර 1ms ප්‍රමාදයක් ඇතුළත් කරනු ලැබේ:

# NOTES_PAUSE 1 නිර්වචනය කරන්න

තනු වාදනය කිරීමේ සෑම සම්පූර්ණ චක්‍රයකම පසු, වැඩසටහන තත්පර 1ක් සඳහා විරාමයක් තබා නැවත වාදනය කිරීමට පටන් ගනී.
එහි ප්‍රතිඵලයක් වශයෙන්, අපට ටෙම්පෝ වෙනස් කිරීමට, කාලසීමාව නිවැරදි කිරීමට හෝ තනු නිර්මාණය සම්පූර්ණයෙන්ම නැවත ලිවීමට පහසු කේතයක් ලැබුණි. මෙය සිදු කිරීම සඳහා, විධාන සහ විචල්‍ය ප්‍රකාශන සමඟ වැඩසටහනේ කොටස පමණක් පරිවර්තනය කිරීම පමණක් ප්‍රමාණවත් වේ.

තනි කාර්යයන්

  1. යෝජිත තනු නිර්මාණයේදී, කාර්ය සාධනයේ වේගය වෙනස් කිරීමට උත්සාහ කර පුනරාවර්තන අතර තත්පර 5ක් විරාම කරන්න.
  2. අරා මූලද්රව්ය පහර දෙයිඅගයන් 0 සිට 255 දක්වා පමණක් ගන්න. අරා මූලද්‍රව්‍යවල පළල වෙනස් කර මෙය වැඩසටහනේ මතක ප්‍රමාණයට බලපාන්නේ කෙසේදැයි සම්පාදක ප්‍රතිදානයෙන් බලන්න.
  3. දැන් ඔබම තනු වෙනස් කිරීමට උත්සාහ කරන්න. උදාහරණයක් ලෙස, මෙන්න එම චිත්‍රපටයේම “ඉම්පීරියල් මාර්තු”: int notes = ( A4, R, A4, R, A4, R, F4, R, C5, R, A4, R, F4, R, C5, R , A4, R, E5, R, E5, R, E5, R, F5, R, C5, R, G5, R, F5, R, C5, R, A4, R) ; int පහර = (50, 20, 50, 20, 50, 20, 40, 5, 20, 5, 60, 10, 40, 5, 20, 5, 60, 80, 50, 50, 5 20, 40, 5, 20

    ඔබේ මෝටර් රථයට ශබ්ද සයිරන් නොමැති නම් සහ ඔබ තවමත් මිලදී ගැනීමට සහ ස්ථාපනය කිරීමට තීරණය කර නොමැති නම්, මෙම ලිපිය ඔබ සඳහා වේ. ඔබට ඒ සියල්ල තරමක් සරල ආකාරයකින් එකලස් කළ හැකි විට මිල අධික එලාම් මිලදී ගන්නේ ඇයි?

    මම දෙකක් ඉදිරිපත් කරනවා සරල පරිපථ AVR ATmega8 සහ Attiny2313 ක්ෂුද්‍ර පාලක මත, වඩාත් නිවැරදිව, මෙම ක්ෂුද්‍ර පාලක දෙකෙහි වැඩ කිරීමට එක් පරිපථයක් සරලව ක්‍රියාත්මක වේ. මාර්ගය වන විට, ලේඛනාගාරයේ ඔබට Atmega8 මයික්‍රොකොන්ට්‍රෝලර් සඳහා ස්ථිරාංග අනුවාද දෙකක් හමුවනු ඇත, ඉන් පළමු එක කාර් එලාම් එකකට සමාන ශබ්දයක් ප්‍රතිනිෂ්පාදනය කරන අතර දෙවන ශබ්දය සමාන වේ සොර අනතුරු ඇඟවීමගොඩනැගිල්ල (වේගවත් හා තියුණු සංඥාවක්).

    ඔබට පහත සියලුම ස්ථිරාංග ලේඛනාගාරයේ බාගත කළ හැකිය (ඒවා සියල්ලම අත්සන් කර ඇත), ලේඛනාගාරයේ ඔබට ප්‍රෝටියුස් හි පරිපථ අනුකරණය ද සොයාගත හැකිය, එයින් අදහස් කරන්නේ සියලුම තනු වලට සවන් දීමෙන් පසු ඔබට ලැයිස්තුවෙන් හැකි වනු ඇති බවයි. ඔබ වඩාත් කැමති දේ තෝරා ගැනීමට.

    පහත දැක්වෙන්නේ Atmega8 හි සංඥා රූප සටහනයි

    Atmega8 යෝජනා ක්‍රමයේ භාවිතා වන රේඩියෝ සංරචක ලැයිස්තුව

    U1- AVR ක්ෂුද්‍ර පාලකය 8-bit ATmega8-16PU, qty. 1,
    R1- නාමික අගය 47 ohms සහිත ප්රතිරෝධකය, ගණන් කරන්න. 1,
    R2, R3- නාමික අගය 270 Ohm සහිත ප්‍රතිරෝධකය, ගණන් කරන්න. 2,
    D2,D3-LED, qty. 2,
    LS1-ස්පීකරය, qty. 1,
    S1 - සංවේදකය.

    සහ Attiny2313 හි සංඥා යෝජනා ක්රමය තුළ, මයික්රෝන පමණක් වෙනස් කර ඇත.
    U1- Microcontroller AVR 8-bit ATtiny2313-20PU, qty. 1.

    මුද්රිත පරිපථ පුවරුව Atmega8 සඳහා මේ වගේ:

    ඔබට පෙනෙන පරිදි, පරිපථය ඉතා සරල ය, ඇත්තේ එක් ක්ෂුද්‍ර පාලකයක්, ප්‍රතිරෝධක 3 ක්, LED 2 ක් සහ තවත් ස්පීකර් එකක් පමණි. බොත්තමක් වෙනුවට, ඔබට බට ස්විචයක් හෝ වෙනත් සම්බන්ධතාවක් භාවිතා කළ හැකිය.

    මෙහෙයුමේ මූලධර්මය පහත පරිදි වේ. අපි බලය යොදන වහාම, LED (D3 පරිපථයේ) වහාම දැල්වී හෝ දැල්වීමට පටන් ගනී (ෆර්ම්වෙයාර් මත පදනම්ව), සහ සංවේදකය ස්පර්ශ නොකළහොත්, අනතුරු ඇඟවීම නිශ්ශබ්ද වනු ඇත. දැන්, සංවේදකය අවුලුවනු ලැබුවහොත්, සයිරන් වැඩ කරනු ඇත, LED ද දැල්වෙයි, නමුත් දැනටමත් D2.

    අනතුරු ඇඟවීම අතරතුර මෝටර් රථයේ හෙඩ් ලයිට් ද දැල්වීමට ඔබට අවශ්‍ය නම්, මේ සඳහා ඔබ මයික්‍රොකොන්ට්‍රෝලර් 24 PC1 හි ප්‍රතිදානය ට්‍රාන්සිස්ටරයක් ​​හරහා රිලේ වෙත සම්බන්ධ කළ යුතු අතර, රිලේම හෙඩ් ලයිට් වෙත සම්බන්ධ කළ යුතුය. සයිරන් අක්රිය කිරීම සඳහා, ඔබ අක්රිය කර නැවත උපාංගය සක්රිය කළ යුතුය, නැතහොත් බොත්තම ඔබන්න. ක්ෂුද්‍ර පාලකය ක්‍රියා කිරීමට, 8 MHz අභ්‍යන්තර දෝලකයක් අවශ්‍ය වේ,

    ඔබට කෙසේ හෝ අනතුරු ඇඟවීමේ ශබ්දය විස්තාරණය කිරීමට අවශ්‍ය නම්, ඔබට ට්‍රාන්සිස්ටර සමඟ ඇම්ප්ලිෆයර් එකලස් කර එය පරිපථයට සම්බන්ධ කළ හැකිය. ඒක තමයි මම හරියටම කළේ, මම ඒක මේ රූප සටහනේ පෙන්නුවේ නැහැ.

    අපි Attiny 2313 පරිපථයට යමු, මම කලින් කිව්වා වගේ, එකම විස්තර සහ එකම මෙහෙයුම් මූලධර්මය, MK පමණක් වෙනස් කර ඇත, ප්රතිඵලයක් වශයෙන්, සම්බන්ධිත ප්රතිදානයන්, එවැනි ක්ෂුද්ර පාලකයක් අභ්යන්තර 4MHz උත්පාදක යන්ත්රයකින් ක්රියා කරයි, එය 1MHz දී දැල්විය හැකි වුවද.

    දැනටමත් Attiny2313 හි ඇති සම්බන්ධතා රූප සටහන පහත දැක්වේ

    මෙම MK සඳහා, මම ස්ථිරාංගයේ එක් අනුවාදයක් පමණක් ලිවීය, නියමු කුටියේ පුවරුවේ ඇති සියල්ල එකලස් කර, එය පරීක්ෂා කර, සියල්ල හොඳින් ක්රියා කරයි.
    සහ විලයනය පහත පරිදි සැකසිය යුතුය:





ඉහල