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

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

පළමුව, ඒ සියල්ල ක්‍රියාත්මක වන ආකාරය පිළිබඳ කෙටි වීඩියෝවක්:

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

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

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) අමතන්න.

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

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

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

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

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

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

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

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

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

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

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

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

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

ශබ්ද සංශ්ලේෂණයේ මූලධර්මය 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,50 0x9 5, 0x95, 0x95, 0x94 , 0x93, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7E, 0x7C, 0x70, x70, x70, x78, x7 1, 0x70, 0x6F, 0x6D, 0x6D, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x70, 0x78, x78, x78, ;

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 ලබා ගැනීම සඳහා, ඔබ විසින් වගුවේ දර්ශකය වැඩි කළ යුතුය:
එකතු කරන්න = F / 1000 * 64

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

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

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

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

දුර්වල වීම

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

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

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

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

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

ස්ථිතික 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 සංඛ්‍යාතය ලබා ගත හැක:
එකතු කරන්න = F / 8000 * 0x10000

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

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

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

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

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

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

AVR වෙතින් ශබ්දය ප්‍රතිදානය කිරීම

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

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

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

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

PORTB = නියැදිය;

අඩුපාඩු:
1) R2R matrix හි ප්‍රතිදානය ද වේ දුර්වල සංඥාව, ඇනලොග් ඇම්ප්ලිෆයර් භාවිතා කිරීම අනිවාර්ය වේ;
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, අල්ෙපෙනති දෙකක්, 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 ප්රතිදානය අපේක්ෂිත තත්වයට බලහත්කාරයෙන් මාරු කිරීමයි. OCR2 ලේඛනයට ලිවීම PWM දෝෂ ඉවත් කිරීම සඳහා බෆර කර ඇත. කාලය අවසන් වන තෙක් බලා නොසිට, අපි වහාම PWM ප්රතිදානය මාරු කළ යුතුය.

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

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

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

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

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

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

MIDI ආකෘතිය

ඔබ ප්‍රතිඵලය වන තනු කේතය දෙස බැලුවහොත්, අරාව කුඩා පරාසයකින් පුනරාවර්තන සංඛ්‍යා භාවිතා කරන බව ඔබට පහසුවෙන් දැක ගත හැකිය. මෙය තේරුම් ගත හැකි ය: තනු නිර්මාණය අෂ්ටක 1-2 ක් තුළ සීමිත නෝට්ටු ගණනක් භාවිතා කරයි, තනු tempo ස්ථාවර වේ - සමාන ප්‍රමාදයන්, නාලිකා ගණන 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 synthezer channels - එකවර ක්‍රියාකාරී සංස්ෙල්ෂක නාලිකා උපරිම සංඛ්‍යාව;
- උපරිම ක්රියාකාරී බෙර නාලිකා - "බෙර" ප්රතිනිෂ්පාදනය කරන එකවර ක්රියාකාරී සංස්ෙල්ෂක නාලිකා උපරිම සංඛ්යාව;
- උපරිම ක්‍රියාකාරී ස්ටීරියෝ සටහන් - එකම සටහන ප්‍රතිනිෂ්පාදනය කරන උපරිම නාලිකා ගණන (පහත බලන්න);
- ඇස්තමේන්තුගත ප්‍රමාණය, බයිට් - තනු ප්‍රමාණය බයිට් වලින්. “අභිරුචි සාම්පල” මාදිලියේ, ප්‍රමාණය A+B ලෙස පෙන්වනු ලැබේ, A යනු තනු ප්‍රමාණය, B යනු නියැදි ප්‍රමාණයයි. ක්‍රීඩක කේතයේ ප්‍රමාණය මෙහි සඳහන් කර නොමැත.

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

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

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

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

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

- තරංග ආකෘතිය - තරංග ආකාරය:
- හතරැස් තරංගය - වංගුව;
– සයින් – සයින්;
– සයින් + ලියුම් කවරය – දුර්වල වීම සහිත සයින්;
– Waveform * + Envelope – දුර්වල වීම සහ රහිතව 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 අර්ථ දක්වන්න

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

උදාහරණ ව්යාපෘති

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

මතක අවශ්‍යතා

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

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

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

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

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

Sine සහ decay note tables 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, Sine+Envelope, Pitch+12, සම්පීඩනය, තනු එකින් එක වාදනය කරයි (අන්තිම එක EEPROM හි ගබඩා කර ඇත)
2) යිරුමා - ගංගාව ඔබ තුළ ගලා යයි
3) Franz Schubert - Serenade
4) පී.අයි. චයිකොව්ස්කි "ඔක්තෝබර්"

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

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

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

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

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

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

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

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

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

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

ස්ථිරාංග ක්‍රියා කිරීම සඳහා, 23.2 පාඩමෙන් PetitFat lib භාවිතා කරමින් ෆ්ලෑෂ් ධාවකය 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) ( අත්සන් නොකළ 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" ); //නූලක් අරින්න 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; /* ෆ්ලෑෂ් ඩ්‍රයිව් වෙතින් තොරතුරු පිටපත් කරන බෆරය */ වාෂ්පශීලී අත්සන් නොකළ ඉන්ට් ගණන; //පිටපත් කරන ලද දත්තවල කවුන්ටරය බාධාව කාලසීමාව 2_comp_isr (නිෂ්ප්‍රභ) // අගයන් ආදේශ කර ඇති බාධාව (OCR1A = බෆරය; //ප්‍රතිදාන ශබ්දය ස්පීකරයට නම් (++ගණනය >= 512) // කවුන්ටරය ගණන වැඩි කරන්න = 0; //512 යළි සකසන්නේ නම්) ප්‍රධාන (නිෂ්ප්‍රභ) (අත්සන් නොකළ int br; /* ගොනු කියවීම/ලියන කවුන්ටරය */ අත්සන් නොකළ char buf = 0; //FATFS fs කියවනු ලබන්නේ බෆරයේ කුමන කොටසදැයි විචල්‍ය නිර්වචනය කරයි; /* වැඩ කිරීම තාර්කික ධාවකයන් සඳහා ප්‍රදේශය (ගොනු පද්ධති වස්තුව) */ PORTB=0x00; DDRB=0x02; //shim ocr1a // ටයිමර්/කවුන්ටරය 1 ආරම්භ කිරීම // ඔරලෝසු මූලාශ්‍රය: පද්ධති ඔරලෝසුව // ඔරලෝසු අගය: 8000,000 kHz // ප්‍රකාරය: වේගවත් PWM top=0x00FF // OC1A ප්‍රතිදානය: ආගන්තුක නොවන 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") Timer(s)/Counter(s) Interrupt(s) initialization if(disk_initialize()==0) //flash drive එක initialize (pf_mount(&fs); //ගොනු පද්ධතිය සවි කරන්න pf_open ("1.wav"); //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 ධාරිත්‍රකයක් හරහා, “+” ක්ෂුද්‍ර පාලක පින් එකට, “-” ස්පීකරයට සම්බන්ධ කරමු. “-” ස්පීකරය බිමට, “+” ධාරිත්‍රකයට.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

IAR `a සඳහා - වැඩ ඉඩ කවුළුවෙහි දකුණු-ක්ලික් කර 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 අර්ථ දක්වන්න

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

# 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 අනුව වැඩසටහන් ක්‍රියාත්මක කිරීමේදී සටහන් වල කාලසීමාව ගණනය කෙරේ. SOUND_BPM ප්‍රකාශ කර නොමැති නම්, මෙම නියතයේ අගය මත පදනම්ව, සම්පාදන අදියරේදී සටහන් වල කාලසීමාව ගණනය කරනු ලබන අතර, සියලුම තනු එකම වේගයකින් වාදනය කෙරේ. මෙය ක්‍රියාකාරීත්වය සීමා කරයි, නමුත් කේත බයිට් කිහිපයක් ඉතිරි කරයි.

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

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

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

n2 - අර්ධ සටහන

n4 - කාර්තුව

n8 - අටවෙනි

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

n16 - දහසයවන

n6 - සෙක්ස්ටෝල්

n32 - තිස් දෙවන

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

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

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

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

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

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

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

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

SOUND_SetSong(2);

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

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

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

SOUND_PlaySong(2);

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

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

ගොනු

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

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

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

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

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

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

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

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

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

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

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

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

විචල්ය ගත වූ_කාලය 32-බිට්, සහ අරා මූලද්රව්ය සටහන්_කාලසීමාව 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 Ohms නාමික අගයක් සහිත ප්රතිරෝධක, අංක. 2,
    D2,D3-LED, නො. 2,
    LS1-ස්පීකරය, නො. 1,
    S1-සංවේදකය.

    තවද Attiny2313 හි සංඥා පරිපථයේ MK පමණක් වෙනස් කර ඇත.
    U1- Microcontroller AVR 8-bit ATtiny2313-20PU, ප්‍රමාණය. 1.

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

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

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

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

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

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

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

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





ඉහල