همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

blog
۱۳۹۶-۰۲-۰۳
7 دقیقه

مقدمه

در مقاله‌ی پیشین (فایل MP3 چیست و از کجا آمده است)، به چگونگی پیدایش فایل های MP3  ، مزیت‌ها و قابلیت‌های آن پرداختیم. در این مقاله قصد داریم که ساز و کار و نحوه دکد و پخش فایل های MP3 را تشریح کنیم. همانطور که در مقاله‌ی قبلی اشاره شد، فایل mp3 بر خلاف فایل های wav جهت کاهش حجم فایل صوتی، دست به فشرده‌سازی و رمزگذاری صدا می‌زند و آن را به بخش‌ها‌ی کوچکی که فریم نام دارد می‌شکند.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

برای این که بتوانیم خروجی مناسب صوتی داشته باشیم؛ باید قادر باشیم که فریم‌های مجزا را در زمان مناسبی از حالت فشرده خارج کنیم و برای پخش به واحد دیجیتال به آنالوگ بفرستیم و هیچ وقفه‌ای هم نباید وجود داشته باشد تا قعطی و پرش در صوت ایجاد نشود. با توجه به قابلیت‌ها‌ی میکروکنترلر‌ها‌ی قدیمی، این امکان وجود نداشت؛ چرا که به دلیل محدودیت‌ها‌ی حافظه و پردازشگر، سرعت تبدیل فریم‌ها به فایل خام، پایین‌تر از بیت‌ریت پخش صوت بود و همین امر باعث می‌شد که این نوع میکروکنترلر‌ها قادر به پخش این‌گونه فایل ها نباشند. برای رفع این نقص، شرکت‌ها‌ی تولید کننده چیپ، دست به کار شدند و دکدر سخت افزاری خود را وارد بازار کردند. اغلب استفاده کننده‌ها برای پخش فایل‌های صوتی با فرمت MP3 دست به دامن این گونه چیپ‌ها می شدند.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

یکی از شرکت‌های شناخته‌شده در خصوص تولید چیپ های دکدر، شرکت VLSI است که به واسته چیپ VS1003 در ایران محبوبیت زیادی پیدا کرد. با استفاده از این چیپ، پخش‌کننده همراه و غیرهمراه بسیاری طراحی شد.

به عنوان نمونه عکس زیر که به کمک همین چیپ و میکروکنترلر AVR ، یک پخش‌کننده MP3 قابل‌حمل ساخته شده است.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

با این وجود، این گونه طراحی، مشکلات خاص خودش را به همراه داشت. از جمله حجیم شدن مدار، مصرف انرژی بیشتر، بالا رفتن قیمت تمام‌شده و ….. اما چاره‌ی دیگری وجود نداشت و استفاده از این نوع چیپ ها اجتناب‌ناپذیر بود.

تا این که میکروکنترلرهای ARM معرفی شدند که علاوه بر مصرف پایین، سرعت پردازشی به مراتب بالاتر داشتد. میزان حافظه و سرعت پردازش بالای این خانواده از میکروکنترلر، امکان دکد و پخش مستقیم فایل mp3 را ایجاد کرد؛ به نحوی که برای دکد و پخش، نیاز به هیچ المان خارجی نباشد و تمام فرایندها در درون خود میکروکنترلر میسر باشد.

استخراج فریم‌ها

تا اینجا با ساختار کلی فایل MP3 آشنایی پیدا کردیم. برای شروع فرایند دکد و پخش، اولین قدم پیدا کردن فریم‌ها و استخراج آن‌ها از فایل است. همان‌طور که می‌دانید یک فایل MP3 از مجموعه‌ای از فریم‌های صوتی تشکیل شده است.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

همان‌طور که در عکس بالا مشاهده می‌کنید، هر فریم داده دارای هدری است که علاوه بر مشخص کردن شروع یک فریم، مجموعه‌ای از اطلاعات در خصوص آن فریم را نیز دارد. برای روشن‌تر شدن موضوع به عکس زیر دقت کنید:

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

هر فریم دارای جزئیات فوق است که 32 بیت (4 بایت) اول اطلاعات سینک و هدر را در خود دارد. 16 بیت (2 بایت) بعد، حاوی اطلاعات اعتبار سنجی است که به صورت اختیاری است، یعنی ممکن است وجود نداشته باشد.  136/256 بیت بعدی حاوی اطلاعات مربوط به کانال صوتی است؛ (همان‌طور که میدانید یک فایل صوتی ممکن است منو یا استریو باشد) و مابقی داده‌ها مربوط به داده‌های صوتی است.

برای این که بتوانیم داده‌های صوتی را از حالت فشرده و رمز شده خارج کنیم، لازم است اول اطلاعات مربوط به فریم را از هدر استخراج کنیم و بر اساس داده‌های به دست آمده، رمزگشایی داده‌های صوتی را شروع کنیم.

دکد Mp3 – رمز‌گشایی هدر MP3

همان‌طور که قبلاً اشاره کردیم، هدر حاوی 32 بیت است که هر بیت معنی و مفهوم خاص خود را دارد. اگر بیت‌ها را به تفکیک و رنگ مرتبط با معنی آنها دسته‌بندی کنیم، نتیجه به شکل زیر خواهد بود:

AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

  •  11 بیت (A)  (از بیت 21 تا 31) : بیت‌های شناسایی (همه 1 هستند) که برای تشخیص شروع یک فریم به کار برده می‌شوند.
  • 2 بیت (B) (بیت 20 و 19) : ورژن هدر که حاوی 4 حالت است:
    • 00 – MPEG Version 2.5
    • 01 – reserved
    • 10 – MPEG Version 2
    • 11 – MPEG Version 1
  • 2 بیت (C) (بیت 18 و 17): توضیح دهنده لایه:
    • 00 – reserved
    • 01 – Layer III
    • 10 – Layer II
    • 11 – Layer I
  • 1 بیت (D) (بیت 16): بیت اعتبار‌سنجی
    • 0 : قسمت CRC وجود خواهد داشت.
    • 1 : قسمت CRC وجود نخواهد داشت.
  • 4 بیت (E) (از بیت 12 تا 15) : بیت‌ریت خروجی (مطابق جدول زیر)

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

  • دو بیت (F) (بیت 10 و 11) : سمپل‌ریت مطابق جدول زیر.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

  • بیت (G) (بیت شماره 9) : Padding bit
    • 0 – frame is not padded
    • 1 – frame is padded with one extra slot
  • بیت (H) (بیت 8) : Private bit. This one is only informative.
  • 2 بیت (I) (بیت 6 و 7) : Channel Mode
    • 00 – Stereo
    • 01 – Joint stereo (Stereo)
    • 10 – Dual channel (2 mono channels)
    • 11 – Single channel (Mono)
  • 2 بیت (J) (بیت 4 و 5) : Mode extension (Only used in Joint stereo)
  • بیت (K) (بیت 3) : Copyright
    • Audio is not copyrighted
    • Audio is copyrighted
  • بیت (L) (بیت 2) : Original
    • 0 – Copy of original media
    • 1 –  Original media
  • 2 بیت (M) (بیت 0 و 1) : Emphasis

 

بعد از چهار بایت توصیف‌کننده هدر، بنا به وضعیت بیت D در این توصیف‌کننده، ممکن است که یا 2 بایت CRC وجود داشته باشد یا نه. بعدازاین دو بایت اختیاری، طبق فریم که تک کانال باشد یا دو کانال (دو بیت 6, 7)، 17 یا 32 بایت اطلاعات مربوط به کانال‌ها وجود خواهد داشت و بعدازآن داده‌های صوتی قرار خواهند داشت. دقت داشته باشید در شرایط خیلی نادر ممکن است که فریم دارای داده‌های صوتی نباشد. در عکس زیر یک فریم را درون یک فایل MP3 مشخص کرده‌ایم که 4 بایت قرمزرنگ، هدر و 32 بایت آبی‌رنگ، اطلاعات کانال می‌باشد. بقیه‌ی بایت‌ها هم داده‌های صوتی هستند. توجه داشته باشید که بایت‌های مربوط به خطایابی وجود ندارند.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

 

دکد Mp3 – رمز‌گشایی داده‌ها‌ی صوتی

برای رمزگشایی داده‌های موجود در این قسمت اول لازم است با الگوریتم هافمن آشنایی داشته باشیدِ؛ روش کدگذاری هافمن یک روش فشرده‌سازی داده است که توسط دیود هافمن پایه‌گذاری شد. در روش هافمن داده‌ها 20 الی 90 درصد فشرده می‌شوند. در الگوریتم هافمن از ساختمان داده‌ی صف اولویت استفاده می‌شود. توضیح نحوه‌ی عملکرد الگوریتم هافمن در این مقاله نمی‌گنجد و علاقه‌مندان جهت یادگیری می‌توانند به وب‌سایت های مربوطه مراجعه کنند.

برای دکدینگ این قسمت همان‌طور که در عکس مشخص شده است، باید از درخت هافمن استفاده کنید.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

 

نحوه ساخت یک ماژول MP3 Player

توضیح سخت‌افزار

همان‌طور که در تصویر زیر مشخص شده است، سخت‌افزار مورداستفاده جهت دکد فایل MP3، یک سخت‌افزار بسیار ساده است که جزء اصلی آن را یک میکروکنترلر STM32F103RET تشکیل داده است. تمام اتفاقات درون میکروکنترلر رخ می‌دهد.

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

برای تبدیل داده‌های دیجیتال از مبدل‌های دیجیتال به آنالوگ (DAC) داخلی میکروکنترلر استفاده شده که قادر است نرخ یک مگاسمپل بر ثانیه و دقت 12 بیت را ارائه نماید. کارت حافظه هم با استفاده از رابط SPI به میکروکنترلر وصل شده است. درواقع تلاش شده که تا جای ممکن مدار، ساده و قابل‌فهم باشد.

نرم‌افزار

نرم‌افزار توسط کامپایلر کیل نوشته شده و قادر است فایل‌های MP3 تا بیت ریت 320 کیلو و فایلهای Wav را تا بالاترین بیت‌ریت ممکن پخش نماید. برای سرعت عمل بیشتر در دکد فایل‌های MP3، بخشی از کد به زبان اسمبلی نوشته شده است. تا حد ممکن سعی شده که از منابع موجود بهترین استفاده برده شود. برای انتقال داده‌های صوتی به مبدل‌های DAC، از واحد DMA استفاده شده تا CPU کمترین درگیری را در این انتقال داشته باشد.

مطابق برنامه‌ی فوق، بعد از نصب و پیکربندی کارت حافظه، برنامه ابتدا به دنبال فایل start.mp3 درون کارت حافظه می‌گردد. در صورت وجود چنین فایلی آن را اجرا کرده و بعد از اتمام، به دنبال فایل start.wav می‌گردد تا آن را پخش نماید.

شما به‌راحتی با اضافه کردن توابع و بخش‌های موردنظر خود، می‌توانید این کد را تبدیل به یک Mp3 Player  همراه کنید.

 

دانلود سورس کد دکدر MP3

Sisoog_STM32_Mp3Player

دانلود فایل PDF این متن

MP3_Player


 

اطلاعات
137
0
لینک و اشتراک
profile

Zeus ‌

متخصص الکترونیک

زئوس هستم ساکن المپ

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

profile
مجید گفت :
۱۴۰۳-۰۳-۰۳ ۱۵:۱۶

سلام.
آیا خروجی این مدار رو میشه مستقیم به کارت صدا وصل کرد؟

profile
Zeus ‌ گفت :
۱۴۰۳-۱۰-۰۲ ۱۰:۳۴

سلام بله میشه 🙂

profile
حسین گفت :
۱۴۰۲-۰۳-۳۰ ۱۷:۵۹

سلام.. اگه خروجی میکرو رو نخوایم به اسپیکر وصل کنیم و بخوایم با چند تا شیپور آهنگ رو پخش کنیم امکانش هست؟ به این صورت که هر شیپور رو برای مدت خاص سوئیچ کنیم و همین طور ریتم آهنگ رو درست کنیم. خروجی صفر و یک نیاز دارم برای سوئیچ کردن شیپورها

profile
Zeus ‌ گفت :
۱۴۰۲-۰۷-۰۷ ۱۵:۰۳

بله چرا که نه
امکانش هست و فکر کنم نمونه مشابه دیدم البته با آردوینو

profile
سعید گفت :
۱۴۰۲-۰۲-۰۸ ۱۰:۱۵

با چه مدار واسطی می توان dac خروجی را به میکروفن m66 متصل کرد که در صورت زنگ زدن به ماژول میکرو فایل صوتی را پخش کند.

profile
Zeus ‌ گفت :
۱۴۰۲-۰۷-۰۷ ۱۶:۲۴

چون بحث نوز مطرح میشه توصیه نمیکنم که این کار رو انجام بدبد
بهتره فایل صوتی رو داخل خود ماژول قرار بدید روب حافظه داخلی یا sd کارت و از اونجا فایل رو پلی کنید که دستور هم برای کار داره

profile
Omid Azadeh گفت :
۱۴۰۰-۰۹-۲۸ ۱۰:۳۱

سلام و خسته نیاشی … یه سوال .. از گجای یه فایل mp3 چطوری میشه فهمید زمان اون آهنگ چقدره ….

profile
Zeus ‌ گفت :
۱۴۰۱-۰۲-۰۱ ۱۲:۳۴

سلام دوست عزیز
باید زمان هر بلاک رو محاسبه کنید فکر نمی‌کنم توی هدرش باشه

profile
Omid Azadeh گفت :
۱۳۹۹-۱۲-۲۶ ۲۳:۴۹

با سلام و خسته نباشید و تشکر بابت این همه زحمات … یه سوال فرض‌کنید روی همین ۱۰۳ یه. Rtos دارید … با توجه به اینکه دیکد فایل نرم افزاریه چقدر از سی‌پی‌یو اسغال میسه … منظورم cpu usage هستس … ممنون

profile
zeus گفت :
۱۴۰۰-۰۳-۰۵ ۰۸:۱۹

سلام و متشکرم
باید بگم خوب با توجه به بیت ریت مورد دیکد احتمالا جواب متفاوت خواهد بود
چیزی که یادم هست حدود 70 تا 80 درصد قدرت پردازشی یک چیپ 103 مورد استفاده قرار میگیره

profile
Omid Azadeh گفت :
۱۴۰۰-۰۳-۱۷ ۱۲:۵۷

چقدر زیاد … هیچی از میکرو نمیمونه … هرچند روی F4 احتمالا این عدد روی 30 تا 40 و روی یه چیزی مثل H7 روی 5 تا 10 باشه …. به هر حال ممنون بابت جوابتون …

profile
م.الهی گفت :
۱۳۹۹-۱۰-۱۷ ۱۲:۳۴

سلام، وقتتون بخیر، ممنون میشم اگر سوالم رو جواب بدین
من میخوام به دیتایی که داره به DAC میره دسترسی داشته باشم…
چیزی که داره به تابع DAC میره که از DMA ارسال بشه (uint32_t*)((s8 *)AudioBuffer هستش…
این آرایه به اندازه 4608 تعریف شده،
ایا توی هر لحظه کل این ارایه پر هستش؟ و ایا به ترتیب پر شده یعنی مکان اول با دیتایی که اول میاد پر میشه و همین طور میره جلو…
به طور کلی اگر بخوام به دیتای که در هر لحظه به DAC میره دسترسی داشته باشد باید چه کار کنم؟
ممنونم

profile
زئوس Zeus گفت :
۱۳۹۹-۱۰-۱۷ ۱۶:۴۲

سلام دوست عزیز
خوب راه حل اول اینه که خود dma رو تنظیم کنید که داده ها رو جایی که دوست دارید منتقل کنه – مثلا میخواید از dac خارجی که spi هست استفاده کنید میتونید به dma بگید که به جای dac داخلی داده ها رو به spi تحویل بده مثلا
راه دوم اینه که داده ها موقع دکد توی بافری که دوست دارید بریزید – یه حلقه داریم که داده ها رو دیکد میکنه – اونجا میتونید به جای آدرس این بافر آدرس بافر دلخواه تون رو بدید.
ساز و کار هم اینطوری که همیشه کل این بافر حاوی داده درست نیست – این بافر به دو قسمت پایین و بالا تقسیم میشه وقتی قیمت پایین در حال پخش هست (داره به dac ) منتقل میشه داده های جدید که در حال دیکد هستند توی قسمت بالا کپی میشن تا اختلالی توی پخش پیش نیاد (وقفه نیفته) و این سیکل تا تمام شده کل آهنگ ادامه پیدا میکنه.

profile
م.الهی گفت :
۱۳۹۹-۱۰-۱۷ ۲۲:۰۴

ممنون، میخوام در حقیقت هم به DAC بره هم من بتونم بهش دسترسی داشته باشم و از طریق usart ارسال کنمش، یعنی میخوام هر لحظه دیتایی که داره به DAC میره همون دیتا رو بعد از یک انالیز با از طریق سریال انتقال بدم

profile
زئوس Zeus گفت :
۱۳۹۹-۱۰-۲۰ ۱۳:۵۳

سلام خوب پس شما با توجه به وضعیت dma ببینید که الان کدوم تیکه از بافر فعال هست (تیکه پایین یا بالا) و اون تیکه رو به پورت سریال ارسال کنید.
شاید ساده تر باشه که یه بافر دیگه درست کنید و بعد از استخراج اطلاعات از اون دو تا کپی بگیرد یکی برای dac و یکی برای پورت سریال

profile
م.الهی گفت :
۱۳۹۹-۰۸-۱۷ ۰۹:۲۱

سلام مجدد
میدونم خیلی سوال میپرسم 🙁 اما متاسفانه کارم گیر کرده و نمیدونم مشکل از کجاست
من میخوام همین پروژه رو با stm32f429 دیسکاوری انجام بدم و خوب دارم پله پله میروم جلو… ( چون کل برنامه رو که تغییر دادم جواب نگرفتم)
الان میخوام یک فایل صوتی ویو رو از حافظه میکرو با استفاده از DMA پخش کنم؛ تنظیماتم به این صورت هستش:
تنظیمات DMA:
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* DMA IRQ Channel configuration */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* DMA1 channel7 configuration */
DMA_DeInit(DMA1_Stream5);
DMA_InitStructure.DMA_Channel = DMA_Channel_7;

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) data;
DMA_InitStructure.DMA_BufferSize = sizeof(data);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &DAC->DHR8R1; // 8Bit Reg
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
// DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA1_Stream5->CR = (0UL << 14) ; // Memory to memory mode

DMA_Init(DMA1_Stream5, &DMA_InitStructure);
/* Enable DMA21 Channel7 */
DMA_Cmd(DMA1_Stream5, ENABLE);
/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
که خوب DMA1Stream5 Channel7 برای DAC1 هستش
تنظیمات DAC:
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* DAC channel2 Configuration */
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
/* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
automatically connected to the DAC converter. */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is
automatically connected to the DAC converter. */
DAC_Cmd(DAC_Channel_2, ENABLE);
و تنظیمات تایمر:
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;

TIM_DeInit( TIM2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_BaseInitStructure.TIM_Period = 3600;
TIM_BaseInitStructure.TIM_Prescaler = 1-1;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);

// TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//
// TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

TIM_Cmd(TIM2, ENABLE);
که خوب البته من بدون استفاده از DMA یعنی با استفاده از وقفه تایمر و همین تنظیمات تایمر، فایل رو پخش کردم، اما نمیدونم مشکل از کجاست که با استفاده از DMA نمیتونم….
خیلی خیلی ممنون میشم راهنمایم کنید

profile
م.الهی گفت :
۱۳۹۹-۰۸-۱۰ ۰۹:۰۷

سلام ممنون که پاسخگوی سوالات هستید
من به یه سوال اساسی برخوردم توی کد، عملکرد تایمر 2 که در زیربرنامه DAC_Set_Reat فعال شده چیه؟ میدونم که این تایمر داره زمان پخش هر سکشون رو مرتب میکنه براساس فرکانسی که از دیکود اول هر آهنگ میخونه؛ اما درست متوجه نشدم چطور اینکار رو میکنه، چون اینتراپ براش تعریف نشده، از طرف دیگه DAM هم برای ADC تعریف شده، این تایمر کجا خودشون نشون میده…
همین طور سوال دیگم اینه، توی اینتراپ DMA چه اتفاقی داره می افته؟
if(DMA_GetITStatus(DMA2_IT_HT4)) /* LOW_EMPTY */
{
DMA_ClearITPendingBit(DMA2_IT_GL4|DMA2_IT_HT4);
audio_buffer_fill |= LOW_EMPTY;
}

if(DMA_GetITStatus(DMA2_IT_TC4)) /* HIGH_EMPTY */
{
DMA_ClearITPendingBit(DMA2_IT_GL4|DMA2_IT_TC4);

audio_buffer_fill |= HIGH_EMPTY;
}
ممون

profile
زئوس Zeus گفت :
۱۳۹۹-۰۸-۱۱ ۰۹:۰۶

سلام دوست عزیز
عملکرد این تایمر دقیقا همین چیزی هست که گفتید اما چرا تایمر نداره – خوب مساله ساده است – چون برای انتقال داده ها از توی رم به واحد dac از cpu استفاده نشده بلکه از dma استفاده شده برای همین نیازی به وقفه نبوده.
وقتی تایمر و فعال میکنیم – بهش میگیم موقع سر ریز به جای وقفه یه تریگر برای dma ایجاد کنه که dma یک ردیف داده ای از داده ها رو منتقل کنه با استفاده از این روش دیگه cpu درگیر نمیشه.
اما در مورد وقفه dma ، ما دوتا وقفه از dma رو فعال کردم – یکی وقتی که dma به وسط بافری که داره منتقل میکنه رسید و یکی وقتی به آخر بافر رسید. عملکرد dma رو هم به شکل گردشی گذاشتیم. یعنی وقتی به اخر بافر رسید برگیر به اول بافر.
خوب حالا چرا این کار رو کردیم ؟ ساده است، ما در شروع کل بافر رو پر میکنیم و منتظر میشیم (یا هر کار دیگه ای لازمه انجام میدیم) تا dma به وسط بافر برسه وقتی این انتراپت آمد یکی بخش اول داده ها پخش شده و لازمه اطلاعات جدید رو توش قرار بدیم تا اماده پخش باشه بعد که وقفه انتهای بافر آمد یعنی اون بخش از اطلاعات پخش شده و لازمه داده جدید رو توش قرار بدیدم – این عمل رو تا تمام شدن فایل صوتی انجام میدیم.
این کار باعث میشه موقع دکد کردن فایل mp3 که زمانبر هم هست وقفه ای توی شنیدین اون نداشته باشیم چون بخش دیگه ای که قبلا آماده کردم داره پخش میشه به همین خوشمزگی

profile
م.الهی گفت :
۱۳۹۹-۰۸-۱۱ ۱۰:۳۲

یه سوال دیگه، توی تنظیمات DMA کجا این تریگر تایمر تعیین شده؟
برای DAC :
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
هست اما برای DMA متوجه نمیشم..
باز هم از پاسختون ممنون کلی سوال های ذهنم جواب داده شد.

profile
زئوس Zeus گفت :
۱۳۹۹-۰۸-۱۳ ۱۰:۱۷

سلام
خوب این یه سیکله
dma به dac وصل شده و وقتی دک تریگش کنه یک بایت در اختیارش میذاره و خود دک هم توسط تایمر تریگ میشه 🙂
خواهش میکنم

profile
م.الهی گفت :
۱۳۹۹-۰۸-۱۱ ۱۰:۰۸

خیلی خیلی ممنون

profile
م.الهی گفت :
۱۳۹۹-۰۷-۲۸ ۰۹:۵۸

سلام وقتتون بخیر
ببخشید من اگر بخوام همین برنامه رو برای stm32f429 تغییر بدم، با توجه به اینکه پایه های dac در دو میکرو یکسان هستش و همین طور پایه های SPI(MISO,MOSI,NSS,SCK) (B12,B13,B14,B15) .
باید توی برنامه تغییراتی بدم؟ به چه صورت؟
چون متاسفانه نتونستم، و اینکه برنامه جایی که باید فایل رو از SD کارت open کنه گیر میکنه
ممنون میشم راهنمایی کنید…

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۳۰ ۱۳:۰۴

سلام دوست عزیز
فکر میکنم بله باید تغییراتی بدید چون احتمالا رجیسترها متفاوت هستند و کانفیگ هم احتمالا متفاوت برای همین لازمه که کل کتابخانه استفاده شده برای رابط سخت افزاری رو باید جایگذین کنید!

profile
محمد گفت :
۱۳۹۹-۰۷-۱۴ ۰۰:۲۱

درود
من این پروژه رو با استفاده از حافظه spi flash و با cubeMX انجام دادم و آهنگ ها با استفاده از usart و نرم افزار Realterm به حافظه spi flash انتقال داده شد .
توابع مربوط به FATFS کلا تو این پروژه حذف شد و آهنگ ها بایت به بایت توی تابع اصلی fill_buffer() از روی spi flash خونده میشد.
البته با با نرخ باود 115200 و DMA حدود بیست دقیقه زمان برد که یک آهنگ از کامپیوتر روی حافظه spi flash ریخته بشه. :-/ که این از معایب اصلی این پروژه بود.

profile
Sisoog Os گفت :
۱۳۹۹-۰۷-۲۲ ۱۰:۲۸

خیلی هم عالی تمایل داشتید میتونید سورس این را هم با دوستانتون به اشتراک بگذارید

profile
سعید گفت :
۱۳۹۹-۰۷-۱۳ ۱۳:۵۳

سلام
من هرکاری کردم نشد با stmcubeMX‌و توابع HAL راش بندازم
کسی کار نکرده با این ؟ خیلی رو مخه که نمیشه

profile
زئوس Zeus گفت :
۱۳۹۹-۰۸-۲۳ ۱۰:۳۴

من با HAL کار نکردم اگر نه کمک میکردم
ولی به نظرم چیز چنین پیچیده ای نداره

profile
م.الهی گفت :
۱۳۹۹-۰۷-۰۷ ۱۲:۱۹

سلام وقتتون بخیر، ممنون بابت اطلاعات و کدی که گذاشتید
من میخوام وقتی داره اهنگ پخش میشه، به یک برد دیگه با استفاده از rs485 دیتا ارسال کنم، اما وقتی دستور ارسال دیتا رو توی While اجرای اهنگ میزارم، صدا کاملا خراب میشه و دیگه اصلا هیچی معلوم نیست از اهنگ، ممنون میشم راهنماییم کنید..

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۱۳ ۰۹:۱۱

احتمالا دلیلش اینه که پردازنده رو خیلی درگیر میکنید و فرصت لازم برای دیکد آهنگ رو از دست میده – بهترین راه حل استفاده از اینتراپت هست – به نحوی که پردازنده منتظر خالی شدن بافر uart برای ارسال نشده
احتمالا از این روش استفاده کنید مشکل حل میشه

profile
سعید گفت :
۱۳۹۹-۰۷-۰۵ ۱۳:۱۸

سلام
ممنون از پست خوبتون
دو تا سوال:
1. این کد رو چجوری میشه برای میکرو STM32f103VET6 استفاده کرد؟
2. میشه از یک DAC استفاده کرد؟

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۰۶ ۰۹:۴۰

سلام خوشحالم که از مطلب خوشتون اومده 🙂
۱. به سادگی فقط با تغییر نوع میکروکنترلر میتونید انجامش بدید – اگر این میکرو قسمت dac داخلی رو نداره که باید تنها کد اون قسمت رو عوض کنید توی برنامه
۲. اگر منظورتون اینه که به شکل منو پخش بشه صدا – بله میشه – داده های کانال دیگه رو باید در نظر نگیرید.

profile
سعید گفت :
۱۳۹۹-۰۷-۰۶ ۱۰:۴۸

ببخشید یک سوال دیگه:
1. تنظیمات تایمر ها و DMA که در کتابخونه استفاده شده رو خود کتابخونه انجام میده یا ما باید کاری بکنیم جایی؟
2. قابلیت ساخت mp3 پلیر رو داره؟ منظورم اینه آهنگ که پخش شد میره تو پخش آهنگ گیر میکنه یا میشه در حین پخش کار دیگه هم (مثلا استپ کردن در حین پخش) میشه انجام داد؟

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۰۶ ۱۱:۳۰

امم – بله دیگه خودش انجام میده – فقط چک کنید تایمر ها و کانال های مورد استفاده dma روی میکروی جدید در دسترس باشند
۲. خوب تا اونجا که خاطرم میآد دکد یه فایل با بیت ریت ۳۲۰ حدود ۸۰ درصد پردازنده رو درگیر میکنه – از اون ۲۰ درصد دیگه میتونید استفاده کنید موقع پخش که فکر میکنم کفایت خیلی از کارها رو میده

profile
سعید گفت :
۱۳۹۹-۰۷-۰۶ ۱۱:۳۷

بسیار خوب
من سعی میکنم اینو با CubeMX و توابع HAL تست کنم، اگه به نتیجه مثبتی رسیدم همینجا میذارم بقیه هم استفاده کنن، چون سوال بعضیای دیگه هم بود

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۰۶ ۱۱:۴۰

بسیار عالی – متشکرم 🙂

profile
مژده گفت :
۱۳۹۹-۰۷-۰۳ ۱۱:۱۰

سلام ممنون از اطلاعات مفیدی که قرار دادین
ببخشید من طبق همین فرمت مدار رو بستم و برنامه رو کامپایل کردم اما متاسفانه اجرا نشد
ممنون مبشم راهنماییم کنید
فقط میکروی من 103vet هستش که البته فک نمیکنم تفاوتی داشته باشه چون پایه های رو چک کردم و توی هر دو‌میکرو‌ یکسان بودش

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۰۶ ۰۹:۵۹

سلام خواهش میکنم دوست عزیز
میکرویی که استفاده کردید به لحاظ هسته و ساختار هسته تفاوتی با میکروکنترلری که استفاده شده نداره – ممکنه مشکل از جای دیگه ای باشه – مثل شناسایی شدن کارت حافظه یا مسايل این چنینی – اگر برنامه رو دیباگ کنید – فکر میکنم خیلی راحت بتونید مشکل رو پیدا کنید.

profile
مژده گفت :
۱۳۹۹-۰۷-۰۷ ۰۹:۵۰

سلام بله ممنونم مشکل حل شد و تونستم فایل رو با موفقیت پخش کنم 🙂
فقط میخواستم بدونم امکانش هست که خواندن اهنگ از sd هم با استفاه از Dma باشه، یعنی از dma دو جا استفاده بشه هم برای خواندن اهنگ از sd و هم برای پخش اهنگ
اگر امکان پذیر هست چطور باید انجام بدم
ایا کدی در این زمینه ندارید که بتونه راهنمایی کنه
خیلییی خیلیی ممنون

profile
زئوس Zeus گفت :
۱۳۹۹-۰۷-۱۳ ۰۹:۱۸

سلام
خوشحالم که مشکل حل شده – خوب برای این که از واحد dma برای خواندن اطلاعات از روی حافظه sd استفاده کنید شدنی هست ولی به شرط این که از واحد SD میکرو استفاده کرده باشید.
وقتی از spi برای خواندن sd استفاده می کنید نیاز به تبادل بایت های کنترلی زیادی دارید که گاها یکی دو بایت بیشتر نیستند ! البته اینطور هم نیست که نشه هیچ کاری کرد مثلا میتوانید قسمت خواندن اطلاعات سکتور رو با dma انجام بدید به این شکل که بایت های کنترلی رو که ارسال کردید برای خواندن اطلاعات یک یا چند سکتور از dma برای کپی دیتای آن سکتور ها استفاده کنید.
البته بهینه ترین روش استفاده از واحد سخت افزاری sd روی میکرو است

profile
Emid گفت :
۱۳۹۸-۱۲-۲۱ ۲۲:۴۶

سلام، سورس کد قابل دانلود نمی باشد. لطفا اصلاح نمایید.
با تشکر.

profile
زئوس Zeus گفت :
۱۳۹۸-۱۲-۲۲ ۰۹:۳۲

سلام دوست عزیز
لینک بررسی شد مشکلی نداشت

profile
موسوی گفت :
۱۳۹۸-۰۸-۰۵ ۱۴:۲۰

ممنون از مطلب مفیدتون. فکر کنم بعد از مدت ها این مطلب بهترین پاسخ و راه کار برای انتقال صوت بی سیم در بستر NRF24L01 باشه.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۸-۰۵ ۱۵:۲۳

خواهش میکنم دوست عزیز
اگر به دنیال انتقال صوت از بستر nrf هستید شاید این بهترین راه نباشه –
پروژه ای در دست دارم (واکی تاکی) که اگر صبر کنید منتشر بشه خواهید دید راه بهتری نیز هست 🙂

profile
حمید گفت :
۱۳۹۸-۱۱-۱۸ ۰۶:۲۰

سلام و خسته نباشید خدمت شما دوست عزیز.
واقعا اموزش هاتون عالی و بی نظیر هستن. پروژه واکی تاکی تون اماده نشده؟
اگه اماده شد به ما هم یه ندایی بدین ببینیم چه کردین.
تشکر
پیروز باشید

profile
زئوس Zeus گفت :
۱۳۹۸-۱۱-۳۰ ۱۵:۲۱

سلام خواهش میکنم دوست عزیز
نظر لطف شماست
آماده بشه منتشرش میکنیم 🙂

profile
نسا گفت :
۱۳۹۸-۰۷-۲۶ ۱۹:۲۲

ممنون از راهنمایی تون دقت نکرده بودم در همون تابع همه توابع استفاده شدند .
شرایط پروژه طوری هست که نمی تونم فایل فایل اجرا کنم یک فایل با قسمت های مختلف ریخته میشه و هر سخت افزاری که اتفاق می افته بخشی از فایل mp3 اجرا میشه ممنون میشم اگر روش های دیگری هم برای این کار وجود داشت من رو راهنمایی کنید.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۳۰ ۰۹:۵۵

سلام خواهش میکنم
خوب با توجه به محدودیتی که دارید کارای متفاوتی میشه کرد
اولین روش همونی هست که توی کامنت قبل توضیح دادم
روش دیگه اینه که مثلا طول فایل های رو یکی در نظر بگیرید،مثلا هر فایل صد کیلو بایت باشه – بعد فایل ها رو کپی کنید پشت سر هم اگر ۱۰ تا فایل مختلف باشه میشه یک فایل ۱ مگابایتی !
در صورتی که شما میدونید ۱۰ تا فایل صد کیلو بایتی دارید 🙂
اگر نمیشه طول یکسان داشت میتونید اول فایل یه جدول گذاشت که طول قسمت ها رو توش نوشته باشه – قبلا این کارو من کردم چون میخواستم اطلاعات رو از روی یه spi flash بخونم و فایل سیستم نداشتم برای همین مجبور شدم این کار رو انجام بدم.

profile
نسا گفت :
۱۳۹۸-۰۷-۲۶ ۱۱:۴۶

سلام امکان داره کاربرد توابع موجود در فایل mp3.cرو مختصر توضیح بدید .یک تابع که استفاده کردید ۵ تابع دیگه باقی می مونه .ممنون

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۶ ۱۷:۴۱

بگید کدوم تابع مدنظرتونه تا بیشتر توضیح بدم ولی احتمالا باقی توابع تو اون یک تابع استفاده شده اند 🙂

profile
نسا گفت :
۱۳۹۸-۰۷-۲۳ ۲۰:۳۷

سلام در پخش mp3از روی sdکارت ها به نظرتون چگونه میتونیم با هر دستور(مثلا فعال شدن یک سخت افزار ) بخشی از این فایل رو پخش کنیم؟

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۶ ۱۷:۴۸

فکر میکنم بهتره باشه برای این موضوع فایل های جداگانه داشته باشید – یعنی ساده ترین روش ممکن همین هست
اگر بخواید دقیقه خاصی رو پلی کنید باید فایل رو دکد کنید و میکروفیم ها رو برید جلو تا به اون دقیقه خاص برسید.

profile
نسا گفت :
۱۳۹۸-۰۷-۱۹ ۱۶:۵۸

سلام چرا از هردو dacبرای اتصال استفاده کردید اگر من بخوام به بلند گو وصل کنم ایا یک dacکافیه ؟ممنون می شم داهنمایی کنید

profile
زئوس Zeus گفت :
۱۳۹۸-۰۷-۲۰ ۰۹:۰۶

سلام دوست عزیز
خوب وقتی قرار باشه که موزیک های stereo رو پخش کنیم نیاز به دو کانال صوتی داریم ِ برای همین هم هست که توی این کد از دو کانال dac استفاده شده
اگر نه به راحتی میتونید یکی از کانال ها رو بی خیال بشید و فقط از یک کانال استفاده کنید.

profile
reza گفت :
۱۳۹۸-۰۵-۰۲ ۱۹:۳۵

عرض سلام وخسته نباشید خدمت جناب زئوس
من سعی کردم این برنامه رو با توابع HAL پیاده سازی کنم اما ارور گرفت،شمابا توابعHAL این برنامه رو پیاده دسازی نکردین.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۵-۰۷ ۱۶:۰۱

سلام – دوست عزیز
خوب این برنامه مروبط به 5 سال پیش است حدودا و اون موقع خبری از HAL نبود – هرچند اگر میخواستم دوباره این برنامه رو بنویسم فطعا از HAL استفاده نمی کردم یا با همین SPL رو استفاده میکردم یا از LL استفاده میکردم
HAL سربار زیادی میذاره روی پردازنده باری به هر جهت ؛ فکر نمیکنم برای استفاده از HAL مشکلی وجود داشته باشه ؛ فقط کافیه توایع رو بازنویسی کنید.

profile
سام گفت :
۱۳۹۸-۰۴-۳۰ ۰۹:۴۰

سلام لطفا لینک را تصحیح کنید تا 26% دانلود میشه بعد ارور data corruption میده!

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۳۰ ۱۰:۵۳

سعی کنید بدون استفاد از دانلود منیجر دانلود کنید با کمک خود مرورگر

profile
سام گفت :
۱۳۹۸-۰۴-۳۰ ۱۰:۰۲

درست شد با IDM مشکل داشت !

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۳۰ ۱۰:۵۴

ممنون برای اطلاع رسانی تون ؛ IDM همیشه دردسر ساز بوده :/

profile
مهدی گفت :
۱۳۹۸-۰۴-۲۵ ۱۹:۱۷

سلام و سپاسگزاری از نوشته های خوبی که به اشتراک می گذارید
لینک دانلود “سورس کد دکدر MP3” مشکل دارد و کامل دانلود نمی شود .

profile
Sisoog OS گفت :
۱۳۹۸-۰۴-۲۵ ۲۲:۳۴

سلام و ممنون از شما
لینک مشکلی نداره بررسی شد
البته دو بار زیپ شده که لازمه دوبار باز بشه و با نرم افزار 7zip میتونید باز کنید

profile
rezanaghshiy گفت :
۱۳۹۸-۰۴-۲۵ ۰۹:۱۹

سلام ممنون میشم در مورد استفاده از DMA و نحوه استفادش در این مثال بیشتر توضیح بدین.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۲۹ ۱۰:۳۸

در واقع DMA بایت های صدا رو از حافظه RAM برمیداره و توی DAC قرار میده ؛ ریت کپی دیتا هم توسط یه تایمر مشخص میشه !
برای شروع لازم نیست که از dma استفاده کنید و این کار رو میتونید توسط یه تایمر و اینتراپت اون انجام بدید ؛ من از DMA استفاده کرد تا لود روی CPU کاهش پیدا کنه ولی خوب برای شروع میشه ازش صرف نظر کرد.

profile
rezanaghshiy گفت :
۱۳۹۸-۰۴-۲۱ ۱۹:۴۲

سلام،با تشکر از مطالب مفیدتون
می خواستم در مورد ارسال فایل صوت به واحدDACتوضیحی بدین، وچرا داخل پروژه فایل STM32 Cube mx نیست
تا بدونم چه پایه هایی رو استفاده کردین.
واین که صوت رو به چه صورت به کد تبدیل کردین ونحوه استفاده از این کد ها به چه صورته.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۲۳ ۱۰:۳۹

سلام و درود
کتابخانه های مورد استفاده در این پروژه SPL هست که احتمالا دیگه توسط st پشتیبانی نمیشه ؛ البته من این پروژه رو بدون استفاده از Cube Mx نوشتم برای همینه که توابع مورد نظرتون رو نمیتونید پیدا کنید.
صوت بعد از دکد توی یه بافر توی رم نگه داری میشه و با ریت مشخصی به DAC توسط DMA ارسال میشه ؛ یعنی یه بافر الاکلنگی توی رم داریم که متناوبا داره توسط dma به dac منتقل میشه و با خالی شدن هر بخش ؛ اون بخش توسط CPU و دکدر صوت مجددا پر میشه

profile
rezanaghshiy گفت :
۱۳۹۸-۰۴-۱۱ ۲۱:۰۹

یه دار تقویت صوت با lm386گذاشتم به پایه دک ولی میکروم سوخت.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۱۶ ۰۹:۵۰

😐 ؛ نمیتونه دلیل سوختن میکرو اتصال آمپلی فایر باشه ؛ آمپلی فایر روی ورودی خودش خازن داره !
احتمالا مشکل از جای دیگه ای باشه ؛ مدارتون رو قرار بدید تا بتونم نظر بهتری بدم

profile
rezanaghshiy گفت :
۱۳۹۸-۰۴-۱۱ ۲۱:۰۷

سلام،ممنون میشم یه مدار پخش صوت مناسب بهم معرفی کنید وبه چه صورت به میکرو وصل بشه که خروجی صدا داشته باشم.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۱۶ ۰۹:۴۹

الان ماژول های پخش صوت زیادی به صورت آماده در بازار موجود است که ابعاد کوچکی دارند
البته به شخصه باهاشون کار نکردم ولی فکر نمیکنم کار کردن باشون خیلی سخت باشه
مثلا ماژول DFPlayer

profile
احمد ربانی گفت :
۱۳۹۸-۰۴-۱۱ ۰۰:۱۱

سلام
با توجه به این که dac در lpc1768 فقط یک خروجی دارد و حداکثر update rate آن ۱مگاهرتز است و همچنین ۱۰بیتی است مشکلی در کدگشایی و پخش صدا به وجود نمی‌آید؟

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۱۶ ۰۹:۴۴

نه ریت 1 مگ که ریت بالایی است ؛ ولی احتمالا برای صوت استریو دچار مشکل بشید ؛ مگر این که از pwm برای ساخت کانال دیگه اسنفاده کنید
ده بیت هم اوکیه و کیفیت قابل قبولی رو ارائه میکنه.

profile
rezanaghshe گفت :
۱۳۹۸-۰۳-۰۶ ۰۹:۴۶

وچرا سر مدار بلند گو تعبیه نشده

profile
زئوس Zeus گفت :
۱۳۹۸-۰۳-۰۹ ۱۰:۴۲

طرح برای جایی بوده که خودش آمپلی فایر داشته ؛ اینطور به نسبت توانی که لازمه میتونید آمپلی فایر رو طراحی کنید.

profile
rezanaghshe گفت :
۱۳۹۸-۰۳-۰۶ ۰۹:۴۴

سلام
سوالی برام پیش اومده
ممنون میشم در مورد قسمت بوت بیشتر توضیح بدید.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۳-۰۹ ۱۰:۴۳

بوت ، تنها کاربردش پروگرام کردن میکروکنترلر STM32 هست اگر بخوایم از پروگرارم SWD استفاده نکنیم و از طریق پورت سریال پروگرام رو انجام بدیم

profile
rezanaghshiy گفت :
۱۳۹۸-۰۲-۳۰ ۱۱:۱۳

سلام
ممنونم از مطالب خوبتون،می خواستم بپرسم قسمت بوت برای چه کاریه،مگه پایه بوت به زمین وصل نمیشه،هدر بوت چه کاربردی داره.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۲-۳۰ ۱۱:۴۰

نه لذوما ؛ این کار باعث میشه شما قادر باشید برنامه رو از طریق Uart هم آپلود کنید برای مواقعی که نخواید از SWD استفاده کنید یا در دسترستون نباشه

profile
محمد گفت :
۱۳۹۸-۰۲-۱۲ ۱۹:۴۰

درود
من سورس این mp3 player رو با آی سی dac به شماره pt8211 که یه مبدل r2r ladder هستش تست کردم با i2s و dma … بعد تو فایل mp3.c این خط باید حذف میشد تا برنامه به درستی کار میکرد
AudioBuffer[j]=(unsigned short)AudioBuffer[j] ^ (unsigned short)0x8000;
در کل کیفیتش از dac خود میکرو بهتر هست ولی اگه راهی بود که نمونه های خروجی تابع mp3decode از 16 بیت بیشتر میشد اون موقع با یه dac با رزولوشن 24 بیت میشد ازش خروجی با کیفیت بالا گرفت .

profile
زئوس Zeus گفت :
۱۳۹۸-۰۲-۱۵ ۱۱:۱۰

بسیار عالی 🙂
خوب البته خیلی بهتر میشد ولی کیفیت 16 بیت هم کیفیت بالایی هست 🙂 ؛ متاسفانه میکروی 103 دیگه توان پردازشی لازم برای دکد صوت 24 بیت رو نداره البته فکر میکنم ram لازم رو هم نداشته باشه.
متشکر برای اطلاع رسانیتون ^_^

profile
احمد ربانی گفت :
۱۳۹۸-۰۱-۰۹ ۲۲:۴۲

سلام
چطور میتونم از این کد برای lpc1768 استفاده کنم؟

profile
زئوس Zeus گفت :
۱۳۹۸-۰۱-۱۱ ۱۱:۳۲

سلام دوست عزیز
با سادگی تمام ! تنها کافیه که قسمت های ارتباط با سخت افزار رو تغییر بدید ؛ مثل قسمت خوندن از کارت حافظه و البته پخش فایل های صوتی که از DMA و DAC استفاده شده ؛ باقی قسمت ها به سادگی فایل کامپایل هستند و جای نگرانی نیست

profile
احمد ربانی گفت :
۱۳۹۸-۰۴-۰۲ ۱۹:۳۳

سلام
میشه کد lpc1768ش را هم بگذارید؟
اگر نمیشه لطفا دقیق تر توضیح دهید که کدام قسمتها را باید تغییر بدهم. (فقط قسمت DAC.c را باید تغییر بدهم؟) با stm32 هم آشنایی ندارم.

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۰۵ ۱۰:۵۱

سلام ، اگر بتونم یه برد راه انداز برای LPC1768 پیدا کنم ؛ تبدیلش کاری نداره
شما باید تمام قسمت هایی که با سخت افزار در ارتباط هست رو باز نویسی کنید
ولی هسته دکدر نیاز به تغییر خاصی نخواهد داشت و به شکل کامل کار خواهد کرد.

profile
احمد ربانی گفت :
۱۳۹۸-۰۴-۰۵ ۱۶:۵۳

میشه دقیقتر توضیح بدید؟
دقیقا از کجا شروع کنم و چطوری برم جلو؟
لطفا جوری توضیح بدید که من هم که مبتدی هستم بتونم در عمل پیاده کنم…

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۰۹ ۱۴:۲۱

خوب شما باید شروع کنید تا متوجه منظورم بشید ؛
ببیند بخش هایی که به وابسته به سخت افزار هست توی کد به خوبی مشخص هست ؛ یخش هایی مثل راه اندازی کارت حافظه – مبدل های دیجیتال به آنالوگ – تایمر ها و کنترل پورت ها مثل سریال و GPIO این بخش ها رو که تغییر بدید کلید کد به خوبی کار خواهد کرد و احتمالا دغدغه ای نمی مونه 🙂

profile
احمد ربانی گفت :
۱۳۹۸-۰۴-۰۲ ۱۲:۰۱

میشه کد lpc1768ش را هم بگذارید؟

profile
زئوس Zeus گفت :
۱۳۹۸-۰۴-۰۵ ۱۰:۴۷

والا برد راه انداز برای LPC1768 ندارم اگر نه تبدیلش کار چندانی نداره.

profile
محمد گفت :
۱۳۹۷-۱۱-۱۲ ۱۷:۱۰

درود
برنامه روی میکروی stm32f105rbt6 اجرا شد و کیفیتش در حد قابل قبول هست البته اگه از یک dac به دقت 16 بیت با dma استفاده میشد با ارتباط i2s کیفیت خیلی بالاتر از این بود.امکانش هست که این کدها رو روی سری stm32f207 که cortex m3 هم هستن اجرا کرد یا کد اسمبلی باید تغییر کنه.
با تشکر

profile
زئوس Zeus گفت :
۱۳۹۷-۱۱-۱۳ ۱۲:۴۸

خیلی هم عالی 🙂 ؛ خوب بله البته همینطوره که میگید ولی سعی کردم تا جای ممکن از امکانات خود میکرو استفاده کنم تا ساخت نمونه اولیه خیلی ساده بشه
در مورد این که روی میکروی مورد نظرتون بخواید ران کنید ؛ باید بگم که هیچ مشکلی نیست چون هسته ها یکی هستند مشکلی پیش نمیآد

profile
میثم رستم زاده گفت :
۱۳۹۷-۱۰-۲۴ ۱۵:۰۶

سلام با تشکر از مطالب خوبتون. بنده هم با دو اینترنت مختلف ایرانسل و adsl چک کردم سورس کد دانلود نمیشد لطفا بررسی کنید با تشکر فراوان…

profile
Sisoog OS گفت :
۱۳۹۷-۱۰-۲۴ ۲۰:۴۶

دوست عزیز من بررسی کردم هیچ مشکلی نداره
اگر حل نشد به تلگرام سیسوگ مراجعه کنید تا مورد شما به دقت بررسی بشه

profile
دانیال گفت :
۱۳۹۷-۰۸-۰۷ ۰۸:۲۶

سلام وقت بخیر ، ظاهرا لینک دانلود سورس کد خرابه

profile
زئوس Zeus گفت :
۱۳۹۷-۰۸-۰۷ ۰۹:۱۰

سلام دوست عزیز
هم اکنون دو لینک موجود در پست چک شد و مشلی مشاهده نشد.

profile
احسان عسگری گفت :
۱۳۹۷-۰۶-۲۳ ۱۷:۱۲

سلام
با تشکر از مطالب خوب و کاربردیتون
من پروژه رو مطابق شماتیک بستم
اما پیغام زیر رو میده
àZeus@sisoog.com
Play:start.mp3
–Faild
Try Play:start.wav –Faild
فرمت میکرو اس دی fat32 هستش
و داخل اون هم فرمت wav هستش و هم mp3

profile
زئوس Zeus گفت :
۱۳۹۷-۰۶-۲۳ ۱۷:۱۸

سلام دوست عزیز
اول این که اسم فایل ها رو باید start.mp3 و start.wav بگذارید
فایل های mp3 تا بیت ریست 128 کیلو پشتیبانی میشه
به غیر از این دو مساله – نکته دیگه ای وجود نداره ، فقط ممکنه قسمت sd کارت درست نباشه و فایل sd رو نشناسه

profile
علی گفت :
۱۳۹۸-۱۰-۲۷ ۲۰:۰۲

سلام . ممنونم بابت پست خوبتون .
من هم همین مشکل رو دارم ، اسم فایل ها درست هستن ، هرکاری کردم جواب نگرفتم.
ممنون میشم راهنمایی کنید

profile
زئوس Zeus گفت :
۱۳۹۸-۱۰-۲۹ ۱۰:۲۳

فکر کنم برنامه رو دیباگ کنید زودتر به نتیجه میرسید – خیلی دلیل میتونه وجود داشته باشه و حدس زدنش کار سختیه

profile
علی گفت :
۱۳۹۸-۱۰-۲۹ ۱۰:۵۳

دقت نکرده بودم که تابع init_DAC در تابع wave کامنت هست ، اون رو برداشتم mp3 رو پلی کردم ، ولی بازم تو پلی کردن wave مشکل هست … ممنون از پاسخگوییتون ، موفق باشید.

profile
زئوس Zeus گفت :
۱۳۹۸-۱۰-۲۹ ۱۵:۰۶

خواهش میکنم – خوشحالم که مشکل حل شده
فکر کنم قسمت ویو رو تغییر دادم – درست حضور ذهن ندارم

profile
علی گفت :
۱۳۹۷-۰۴-۱۹ ۰۰:۳۶

درود بر شما مهندس
من یه مشکلی با رنگ نوشته های سایت دارم خیلی کم رنگ هست وبیشتر وقتها خواندن مطالب سخت هست البته نمیدونم شاید چون با موبایل وارد سایت میشوم اینطوری هست!
در هر صورت مطالب سایت شما واقعا غنی میباشد.

profile
زئوس Zeus گفت :
۱۳۹۷-۰۴-۱۹ ۰۸:۵۶

سلام دوست عزیزم
ممنونم برای نظر سازنده شما ، تا حالا به این موضوع دقت نکرده بودیم ، توی موبایل نوشته های سیاه کامل نیستند و بیشتر خاکستری هستند ، این موضوع رو بررسی و رفع خواهیم کرد.
انتقادات و نظرات شما ، باعث دلگرمی و ارتقاء ما خواهد شد.

profile
محمد گفت :
۱۳۹۷-۰۶-۱۳ ۱۱:۵۷

بله، کلا رنگ متن های اصلی سایت خاکستریه که یه مقدار خواندنو سخت می کنه. چه با موبایل و چه با کامپیوتر. اگر رنکشو مثل رنگ همین کامنت در حین نوشتن مشکی کنید خیلی بهتره.
سپاس بابت زحماتتون در این سایت خوب

profile
زئوس Zeus گفت :
۱۳۹۷-۰۶-۱۵ ۰۹:۲۹

سپاس دوست عزیز – حتما این مساله رو بررسی و رفع خواهیم کرد.

profile
علی گفت :
۱۳۹۷-۰۳-۲۲ ۰۵:۵۵

سلام
خیلی عالی بود اگه میشه لطف کنید درباره ی اینکه چطور mp4 رو میشه دیکد کرد توضیح بدید

profile
زئوس Zeus گفت :
۱۳۹۷-۰۳-۲۳ ۰۹:۱۲

سلام متشکرم
بله حتما توی دستور کار قرار می دیم

profile
اسی گفت :
۱۳۹۷-۰۳-۱۶ ۱۰:۲۰

سلام
من با کیوب کار میکنم . زیاد از برنامه تون سر در نیاوردم راستش . ولی تو شماتیک دیدم که دو تا dacفعال هست . یعنی اینکه دوتا کانال دارید که همزمان میتونه دوتا صدا رو پخش کنه؟
ای کاش وقت داشتید با توابع حال این برنامه رو انجام میدادید.
امیدوارم موفق باشید

profile
زئوس Zeus گفت :
۱۳۹۷-۰۳-۱۹ ۰۹:۰۹

سلام دوست عزیز
بله هر دور DAC فعال است که برای پخش صوت های stereo لازم است که دو کانال چپ و راست را به صورت مجزا پخش نماییم ؛ در واقع یعنی همون دو صوت مختلفی که فرموردید
خوب توابع HAL به لحاظ پرفرمنسی مقداری کند هستند البته نمی دونم سرعت لازم برای این برنامه رو فراهم می کننده یا خیر
متاسفانه فرصت چنین کاری رو فعلا نداریم !

profile
اسی گفت :
۱۳۹۷-۰۳-۱۹ ۲۱:۱۱

من میخوام این برنامه رو با توابع hal بنویسم , اگر موفق بشم در اختیارتون قرار میدهم که در سایت قرار دهید . فقط یه لطفی کنید کتابخانه ها را به ایمیلم بفرستید که من بتونم روش کار کنم ./ البته برنامه رو دانلود کردم کتابخانه ها رو دیدم ولی متوجه نشدم کدوم برای cimsis میباشد . و کدوم برای دیکدmp3نوشته شده است
با تشکر فراوان

profile
زئوس Zeus گفت :
۱۳۹۷-۰۳-۲۳ ۰۹:۱۶

بسیار عالی ، کل سورس کد برنامه توی دسترس قرار داره و به راحتی میتونید از توی سایت دانلود کنید.
از طریق فولدر بندی به راحتی مشخص هست توابعی که مربوط به دکد mp3 هست
اگر سوالی بود – حتما مطرح کنید.

profile
علی زارع گفت :
۱۳۹۶-۱۲-۲۰ ۰۶:۱۲

سلام
میشه لطف کنید یه کم درباره ی دیکد کردن فایل های ویدئویی مثل mp4 h264 توضیح بدید

profile
زئوس Zeus گفت :
۱۳۹۶-۱۲-۲۶ ۱۳:۳۱

کدک h264 یه کدک سنگین هست که فکر نمیکنم دکد اون با ریت بالا از عهده یه پردازنده M4 هم بر بیاد
معمولا برای دکد این کدک های پیچیده ، از واحد های سخت افزاری استفاده می کنند
شاید با سری های M7 چنین امکانی وجود داشته باشه که واحد Jpeg رو به صورت داخلی پشتیابنی می کنند.

profile
سینا ج گفت :
۱۳۹۶-۰۷-۰۲ ۱۹:۰۹

سلام
خیلی ممنون بابت پست های عالی ای که میذارید!
یک سوال داشتم!
من در حال حاضر دارم از لینوکس با توزیع debian استفاده میکنم. تونستم با موفقیت STM32Cube و gcc arm و پکیج های مورد نیاز برای کامپایلر رو نصب کنم. اما نمیدونم از چه IDE برای برنامه نویسی استفاده کنم (طبق پرس و جو هایی که کردم گفتن Eclipse خوبه اما نمیدونم از کجا باید دانلود کنم) و چطور تنظیمش کنم که به کامپایلر لینک بشه. همچنین نمیدونم برای ارتباط STLink با لینوکس باید درایوری نصب کنم یا نه. اگر ممکنه راهنمایی کنید. ممنون.

profile
زئوس Zeus گفت :
۱۳۹۶-۰۷-۰۵ ۰۸:۴۳

سلام و درود خدمت شما دوست عزیز
خوب برای نصب Eclipse دو راه هست یکی این که از مخازن debian استفاده کنید که معمولا ورژن های قدیمی قابل نصب هستند از این طریق ، و یا این که اخرین ورژن رو دانلود کنید و با استفاده از Openjre نصب کنید ، از اونجایی که STM32Cube رو باز کردید پس ابزار Open-jre بر روی سیستمتون نصب هست.
برای دانلود آخرین ورژن Eclispe می تونید به این آدرس مراجعه کنید. فقط دقت داشته باشید اگر با لینوکس برید لینک دانلود لینوکسی بهتون میده و این که حتما ورژن C/C++ رو دانلود کنید.
بعد از حالت فشرده خارج کنید و اجرا کنید به همین راحتی
برای استفاده از ابزار های Programmer می تونید از Openocd استفاده کنید که تقریبا همه پروگرامر های موجود را پشتیبانی میکنه.
اگر سوالی بود باز مطرح کنید حتما

profile
سینا ج گفت :
۱۳۹۶-۰۷-۰۵ ۰۹:۱۱

آهان. ممنون از جوابتون. خودم یکم تحقیق کردم و دیدم شرکت st یه ide برای لینوکس تولید کرده به اسم system workbench که الان آخرین نسخش ۶ هست (البته دقیق نمیدونم خود st تولید و طراحیش کرده باشه یا نه ولی همه جاش لوگوی شرکتشون هست).اون رو نصب کردم و داخل خودش toolchain های آرم رو هم داشت و با موفقیت کد رو کامپاید و با stlink آپلود کرد. احتمالا وقتی رفتم سراغ lpc دوباره بیام دنبال نصب eclipse … بازم ممنون از کمکتون.

profile
زئوس Zeus گفت :
۱۳۹۶-۰۷-۰۵ ۰۹:۳۸

خواهش میکنم ، خوب ادیتور ارائه شده از سمت شرکت ST پایه Eclipse هست و یه سری تنظیمات و شخصی سازی ها برای سادگی کار انجام دادن
فکر کنم شرکت NXP هم همین کارو کرده و اونم ادیتوری با همین شکل داده باشه
ولی اگر از Eclipse استفاده کنید ، قادر به کامپایل برای تمام خانواده آرم هستید.

profile
محمد گفت :
۱۳۹۶-۰۵-۲۶ ۱۵:۲۹

فقط احتمالا برای حمل بر روی میکروی M4 شاید نیاز باشه برخی بخش ها رو که اسمبلی نوشته شده باز نویسی کنید.
=============
درود بر شما
دقیقا مشکل من هم همین قسمت هستش.الان اگه کد اصلی رو از helix دانلود کنم کد اسمبلی دارن یا نه؟ اصلا این کدی که به صورت اسمبلی نوشته شده مربوط به چه قسمتی هستش .
با تشکر

profile
زئوس Zeus گفت :
۱۳۹۶-۰۵-۲۶ ۱۸:۴۹

خوب دوست عزیز ، من کمی اینترنت رو جستجو کردم ، خوشبختانه این همین کتابخونه برای میکروی 407 موجود هست و میتونید از این لینک دانلود کنید.
خوب البته برنامه با GCC نوشته شده 🙂
قسمتی که اسمبلی نوشته شده برای دکد هافمن هست و برای سرعت بالاتر با اسمبلی باز نویسی شده ، فکر کنم سورس اصلی به زبان سی موجود باشه ولی دقت داشته باشید ممکنه سورس سی سرعت لازم برای پخش بدون وقفه رو نداشته باشه ، و باز ممکنه توی میکروی 407 مشکل سرعت وجود نداشته باشه.
اگر موفق شدید دانسته هاتون رو با ما به اشتراک بذارید.

profile
محمد گفت :
۱۳۹۶-۰۵-۲۵ ۱۲:۵۱

درود
کیفیت صدای ایجاد شده از این mp3 پلیر اونهم با dac 12 بیت خود میکرو چطور هست یعنی میتونه آهنگای با کیفیت 320 رو هم پخش کنه.راستی امکانش هست این برنامه رو روی میکروی stm32f205 یا stm32f405 با همین سورس کد اجرا کرد.

profile
زئوس Zeus گفت :
۱۳۹۶-۰۵-۲۶ ۰۹:۰۰

سلام دوست عزیز
دقت 12 بیت ، برای صوت دقت خوبی هست و شاید هر کسی قادر به شناسایی اختلاف بین 16 بیت و 12 بیت نبااشه ، در ضمن بیشتر صوت های موجود 8 بیتی هستند.
این کد با بیت ریت 320 مشکلی نداره و به خوبی کار میکنه ، تا اونجا که خاطرم هست و این که وقتی این کد با میکروی 103 داره کار میکنه به راحتی قادره توی سری های بالاتر اجرا بشه و مشکلی وجود نداره ، فقط احتمالا برای حمل بر روی میکروی M4 شاید نیاز باشه برخی بخش ها رو که اسمبلی نوشته شده باز نویسی کنید.

profile
سجاد گفت :
۱۳۹۶-۰۴-۲۶ ۰۰:۳۵

سلام مجدد ببخشید میخواستم بدونم ممکنه همین پروژه رو با استفاده از توابع هال قرار بدین ؟

profile
زئوس Zeus گفت :
۱۳۹۶-۰۴-۲۶ ۱۰:۰۰

سلام دوست عزیز
با توجه به فشردگی کار ها متاسفانه امکانش برامون فراهم نیست ، ولی اگر قصد دارید از این پروژه توی پروژه ای که از HAL استفاده می کنید بهره ببرید میتونید کتابخونه های مورد نیاز رو به پروژتون اضافه کنید فکر نمیکنم مشکلی پیش بیاد.

profile
سعید حقیقی پور گفت :
۱۳۹۹-۰۴-۲۹ ۰۰:۰۳

سلام مهندس وقت بخیر
برای خروجی dac و اتصالش به اسپیکر درایورخاصی نیازه یا مستقیم وصلش کنم به بلندگو؟

profile
زئوس Zeus گفت :
۱۳۹۹-۰۴-۲۹ ۰۸:۳۶

سلام – dac میکرو قادر نیست که جریان لازم برای راه اندازی یه بلندگو رو تامین کنه – برای همین اگر قصد اتصال اونو به بلندگو دارید بهتره که به یه آمپلی فایر وصلش کنید تا میکرو هم صدمه نبینه

profile
سجاد گفت :
۱۳۹۶-۰۴-۲۳ ۰۳:۳۵

یه سوال اگر بخوام یک دفعه وسط پخش آهنگ پخش قطع شه و یک شماره اعلام کنم و آهنگ رو از ادامه پخش کنم چطوری باید عمل کنم ؟
یعنی مثل توی آسانسور که آهنگ داره میخونه شماره اعلام میشه و بعد دوباره ادامه آهنگ رو میخونه

با سپاس فروان و آرزوی موفقیت برای تیم سیسوگ

profile
زئوس Zeus گفت :
۱۳۹۶-۰۴-۲۳ ۱۱:۰۳

به چند روش میشه انجام داد این کارو !
روش پیشنهادی من اینه که از یه کانال دیگه برای پخش شماره ها استفاده کنید ، بعد خروجی ها رو با هم میکس کنید که صدای اعلام گر بر روی صدای موزیک بیفته
البته راه دیگه ای هم هست و اون این که پخش mp3 رو که با یه تایمر زمان بندی شده متوقف کنید و صوت مورد نظرتون رو پخش کنید بعد دوباره تایمر رو اجرا کنید.
اگر شماره ها به صورت Wav ذخیره شده باشند آسون تره ولی اگه mp3 باشن ، باید موقعیت موزیک در حال رو ذخیره کنید ، بعد دوباره از همون محل شروع به پخش کنید ، قبلا توضیح دادیم که فایل فریم فریم هست ، شماره فریم جاری رو ذخیره می کنید ، فایل مورد نظرتون رو پخش می کنید ، دوباره از همون فریم پخش رو ادامه می دهید.

profile
علی گفت :
۱۳۹۸-۱۱-۱۳ ۱۱:۴۳

سلام
اگر امکانش هست ،روش دومی که گفتین با تایمر زمان بندی شده میشه این انجام داد و…رو بیشتر توضیح بدین .فایل های من همه wav هستن .تشکر بابت وقتی که میذارین

profile
زئوس Zeus گفت :
۱۳۹۸-۱۱-۱۳ ۱۴:۴۳

خوب ببینید ما dac داریم که داده های دیجیتال رو به آنالوگ تبدیل میکنه – برای پخش فایل های wav هم یه تایمر داریم که داده ها رو از روی بافر رم میذاره توی dac – توی کد من تایمر dma رو تریگ میکنه و dma داده رو منتقل میکنه – خوب این تایمر رو که متوقف کنید پخش فایل متوقف میشه و فعالش کنید از همون جا شروع میشه به همین سادگی
حالا وقتی متوقف شد شما dac رو با مقادر مورد نظر خودتون هندل کنید تا صدای مد نظرتون پخش بشه به همین خوشمزگی

profile
بهروز گفت :
۱۳۹۶-۰۴-۰۵ ۰۰:۴۴

ممنون عالی بود

profile
زئوس گفت :
۱۳۹۶-۰۴-۰۵ ۱۲:۴۰

خواهش میکنم دوست عزیز

profile
سجاد گفت :
۱۳۹۶-۰۴-۰۱ ۱۹:۱۳

یه سوال آیا خروجی ما در اینجا فقط حاوی نیم موج مثبته ؟ نمیشه هر دو نیم موج رو داشت ؟

profile
زئوس گفت :
۱۳۹۶-۰۴-۰۲ ۱۱:۰۳

خیر، خروجی به صورت تمام موج هست ، در واقع برای این که تمام موج رو داشته باشیم ما ولتاژ 1.65 رو به عنوان صفر در نظر گرفتیم که ولتاژ خروجی به صورت تمام موج وجود داشته باشه
و برای حذف ولتاژ DC از یک خازن استفاده میکنیم

profile
سجاد گفت :
۱۳۹۶-۰۴-۰۳ ۲۳:۵۸

خوب اگر بخوام نیم موج منفی رو هم داشته باشم باید با یک OPAMP ولتاژ رو شیفت بدم درسته ؟ راه دیگه ای نیست ؟

profile
زئوس گفت :
۱۳۹۶-۰۴-۰۴ ۰۸:۳۵

نه دوست عزیز نیازی نیست ! اگر قصد تقویت سیگنال رو داشته باشید نیاز به آپمپ هست
در غیر این صورت خروجی DAC شکل موج کامل رو خواهد داشت
روی این لینکخروجی DAC موج سینوسی کلیک کنید.

profile
سجاد گفت :
۱۳۹۶-۰۴-۰۴ ۱۱:۳۴

خیلی ممنون من میدونم خروجی نیم موج منفی رو با آفست میبینیم اما من میخوام نیم موج منفی واقعا منفی باشه نمیدونم میتونم درست منظورم رو برسونم

profile
زئوس گفت :
۱۳۹۶-۰۴-۰۴ ۱۱:۴۳

ببینید بعد از خازن همونطور که توی شماتیک هست ، واقعا نیم موج منفی خواهید داشت. یعنی ولتاژ منفی وجود خواهد داشت.
میتونید با اسیلوسکپ چک کنید.

profile
سجاد گفت :
۱۳۹۶-۰۴-۰۱ ۱۶:۵۹

مرسی مرسی عالی بود

profile
زئوس گفت :
۱۳۹۶-۰۴-۰۱ ۱۸:۰۸

خواهش میکنم دوست عزیز

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله