راه اندازی واحد DAC میکروکنترلر stm32f4xx  و تولید سیگنال سینوسی

در این آموزش به معرفی و راه اندازی واحد DAC میکروکنترلر stm32f4xx  و تولید سیگنال سینوسی با فرکانس مشخص مثلا، 1KHz به کمک آن می‌پردازیم.

معرفی واحد DAC میکروکنترلر stm32f4xx

واحد DAC به معنای Digital to Analog Converter است، به این معنا که داده های دیجیتال را به ولتاژ آنالوگ تبدیل می کند. برای مثال میکروکنترلر stm32f4xx دارای یک واحد DAC است که دو خروجی DAC1 و DAC2 را دارد که می توانند به صورت 12Bit و 8Bit تنظیم شوند در این پروژه ما قصد داریم به کمک واحد DAC یک موج سینوسی با فرکانس 1KHz تولید کنیم، پس در ابتدا باید داده های دیجیتال یک موج سینوسی را داشته باشیم تا به واحد DAC بدهیم و آنها را به آنالوگ تبدیل کنیم که برای این کار دو روش داریم یکی استفاده از فرمول موج سینوسی و دیگری استفاده از یک آرایه شامل تعداد مشخصی نقطه که یک موج سینوسی را تشکیل می دهند که هر چه تعداد نقطه ها بیشتر باشد شکل موج نهایی با تقریب بهتری شبیه موج سینوسی است. که من برای به دست آوردن این نقاط از نرم افزار متلب استفاده کردم:

t=linspace(0,2*pi,512); % a sin wave with 512 point

x=sin(t);

x=x+1; % DAC output is positive

%x=(x*(2^12-1))/2;  %DAC 12Bit

x=(x*(2^8-1))/2;    %DAC 8Bit

x1=round(x);

plot(x1)

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

شکل 1: نمودار سینوسی رسم شده در متلب

که نهایتا اعداد به دست آمده به این صورت است که چون DAC ما 8Bit بود ، اعداد بین 0 تا 255 هستند.

x1={ 128,129,131,132,134,135,137,138,140,142,143,145,146,148,149,151,152,154,155,157,159,160,162,163,165,166,168,169,171,172,173,175,176,178,179,181,182,184,185,186,188,189,190,192,193,195,196,197,198,200,201,202,204,205,206,207,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,235,236,237,238,239,239,240,241,242,242,243,244,244,245,245,246,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,253,253,254,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,254,254,253,253,253,252,252,252,251,251,251,250,250,249,249,248,248,247,247,246,246,245,244,244,243,243,242,241,240,240,239,238,237,237,236,235,234,233,232,231,231,230,229,228,227,226,225,224,223,222,221,219,218,217,216,215,214,213,212,210,209,208,207,205,204,203,202,200,199,198,196,195,194,192,191,190,188,187,186,184,183,181,180,179,177,176,174,173,171,170,168,167,165,164,162,161,159,158,156,155,153,152,150,149,147,145,144,142,141,139,138,136,135,133,131,130,128,127,125,124,122,120,119,117,116,114,113,111,110,108,106,105,103,102,100,99,97,96,94,93,91,90,88,87,85,84,82,81,79,78,76,75,74,72,71,69,68,67,65,64,63,61,60,59,57,56,55,53,52,51,50,48,47,46,45,43,42,41,40,39,38,37,36,34,33,32,31,30,29,28,27,26,25,24,24,23,22,21,20,19,18,18,17,16,15,15,14,13,12,12,11,11,10,9,9,8,8,7,7,6,6,5,5,4,4,4,3,3,3,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,8,8,9,10,10,11,11,12,13,13,14,15,16,16,17,18,19,20,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,48,49,50,51,53,54,55,57,58,59,60,62,63,65,66,67,69,70,71,73,74,76,77,79,80,82,83,84,86,87,89,90,92,93,95,96,98,100,101,103,104,106,107,109,110,112,113,115,117,118,120,121,123,124,126,127}

حالا برای این که در خروجی DAC موج سینوسی داشته باشیم باید به صورت پیوسته  اعداد آرایه بالا را با فاصله زمانی مشخص به DAC بدهیم تا آنها را به ولتاژ آنالوگ بین 0 تا 3.3 ولت تبدیل کند و در خروجی قرار دهد. برای این کار می توانیم از تایمر کمک بگیریم یعنی تایمر در فاصله های زمانی مشخص اینتراپت تولید کند و در هر اینتراپت تایمر داده جدید به DAC فرستاده شود و تبدیل انجام شود که این عملیات در نرم افزار Stm32CubeMx به تبدیل با تحریک شمارنده و یا  DAC with timer trigger  نامیده می شود که تنظیمات و کد آن به صورت زیر است:

مطلب پیشنهادی:  پروگرم کردن میکروکنترلر STM32F103C8 با استفاده از Keil uVision و STM32CubeMX

نرم افزار Stm32CubeMx

راه اندازی واحد DAC میکروکنترلر stm32f4xx 

شکل 2: Stm32f4xx Pinout

شکل 3: Stm32f4xx clock configuration

نرم افزار Stm32CubeMx

شکل 4: Stm32f4xx DAC and Timer4 configuration

DMA for DAC configuration

شکل 5:DMA for DAC configuration

چگونگی تنظیم فرکانس سیگنال سینوسی :

با مراجعه به دیتاشیت Stm32f407 متوجه می شویم که تایمر 4 بر روی باس APB1 قرار دارد که ما فرکانس آن را 42MHz تنظیم کرده ایم (مطابق شکل 3 ) و هدف ما این است که فرکانس موج سینوسی خروجی DAC که باهمان  512 عدد ساخته می شود، 1KHz باشد بنابراین باید هر تناوب 1 میکروثانیه باشد و فاصله ی هر دو نقطه برابر است با  و در رابطه با تنظیمات تایمر باید گفت که هدف ما در استفاده از تایمر ایجاد اینتراپتی است که در آن داده ی بعدی به DAC داده شود و به همین ترتیب ادامه دهیم تا به داده 512 ام برسیم و ادامه دهیم پس ما باید تنظیم کنیم که هر اینتراپت چه زمانی رخ دهد برای این منظور داریم:

چگونگی تنظیم فرکانس سیگنال سینوسی

چیستی و چگونگی عملکرد و تنظیمات DMA :

DMA به معنی Direct Memory Access یعنی دسترسی مستقیم به حافظه است و در مواردی که حجم زیادی داده می خواهد از حافظه به یک جانبی (peripheral) مثل DAC در اینجا منتقل شود و یا برعکس از یک جانبی به حافظه منتقل شود مثل ADC در بخش بعدی استفاده می شود که این کار باعث می شود در انتقال داده بین حافظه و جانبی ها CPU (پردازنده اصلی) درگیر نشود و به بقیه ی وظایفش رسیدگی کند و این انتقال توسط واحد DMA controller انجام شود وعملکرد میکروکنترلر بهبود یابد. این قابلیت در میکروکنترلر های AVR  وجود نداشت ولی به دلیل فرکانس کاری بالای میکروکنترلر های ARM این قابلیت در آنها اضافه شده است.

مطلب پیشنهادی:  آموزش ARM LPC1768 (قسمت اول)

نکته ای که خوب است در رابطه با تنظیمات DMA بدانیم این است که دو Mode کاری برای آن در نرم افزار Stm32CubeMx تعریف شده است یکی Circular و دیگری Normal  که در حالت Circular وقتی که داده ها (در اینجا 512  نقطه ی نمودار که گفته بودیم) به ترتیب منتقل شدند دوباره نشانگر به ابتدای آرایه بر می گردد و آنها را به طور متناوب منتقل می کند ولی در حالت Normal تنها یکبار این انتقال صورت می گیرد و چون ما در اینجا می خواستیم که به طور متناوب موج سینوسی را داشته باشیم از Circular Mode استفاده کردیم.

کامپایلر Keil :

پس از تنظیمات فوق در نرم افزار Stm32CubeMX مطابق  شکل 6 با فشردن گزینه Generate source code پنجره ای نمایش داده می شود که با مشخص کردن محل ذخیره فایل ها، اسم پروژه و همچنین کامپایلر مورد نظر که برای من نرم افزار Keil V5 بود و فشردن کلید OK پروژه مورد نظر در نرم افزار Keil ایجاد و باز می‌شود ولی اگر هنوز کتابخانه مربوط به stm32f4xx را در keil نصب نکرده باشید به شما پیام می‌دهد و از شما می خواهد که کتابخانه مورد نظر را دانلود و نصب کنید که برای این کار باید به اینترنت متصل شوید و مراحل دانلود و نصب به ترتیب در خود نرم افزار انجام می شوند.

مطلب پیشنهادی:  واحد کنترل اینتراپت بخش اول(NVIC)

راه اندازی واحد DAC میکروکنترلر stm32f4xx  و تولید سیگنال سینوسی

شکل 6:  تولید کدها برای کامپایلر keil V5

سپس با باز شدن کامپایلر Keil تابع main را باز می کنیم و کد های خودمان  را به آن اضافه می کنیم:

راه اندازی واحد DAC میکروکنترلر stm32 

شکل 7: تابع main

راه اندازی واحد DAC میکروکنترلر stm32

شکل 8: تعریف متغیری برای 512 نقطه تابع سینوسی

راه اندازی واحد DAC میکروکنترلر stm32f4xx 

شکل 9: توابع فعال کردن timer وdac و مقدار دهی dac

راه اندازی واحد DAC میکروکنترلر stm32f4xx 

شکل 10: توابع مختلف مربوط به dac و توضیحات مربوط به هر کدام در stm32f4xx_hal_dac.c

اکنون برنامه این بخش کامل شده است و شما می توانید اگر اسیلوسکوپ دارید سیگنال خروجی را با اسیلوسکوپ مشاهده کنید و در غیر این صورت با یک LED و مقاومت، خروجی DAC را به زمین وصل کنید و برای فرکانس های پایین تر مثلا 1 هرتز کاهش و افزایش متناوب نور LED را مشاهده کنید و فرکانس آن را هم به کمک مولتی متر اندازه بگیرید  البته در بخش دوم و سوم این سیگنال سینوسی را بر روی صفحه نمایشگر نشان خواهیم داد.

راه اندازی واحد DAC میکروکنترلر stm32f4xx 

شکل 11: مشاهده فرکانس 1Hz سیگنال خروجی واحد DAC میکروکنترلر stm32f4xx

نویسنده مطلب : خانم مهسا مهدیه نجف آبادی

دوستان عزیز بزودی قسمت بعدی این آموزش با عنوان « معرفی و راه اندازی واحد ADC میکروکنترلر stm32f4xx و نمونه برداری با نرخ مشخص، (30KHz ) از سیگنال خروجی DAC » منتشر می‌شود. اگر سوالی داشتین در قسمت #کامنت های سایت بنویسید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

9 دیدگاه

  1. طیف پردازان اسپادانا

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

  2. با سلام و ممنون از سایت خوبتون
    میخوام یک متغیری که مقدار دسیمال داره رو در خروجی DAC قرار بدم، چطور میتونم اینکار رو بکنم؟
    وقتی در دستور setchannel1date، مقدار 4095 قرار میدم، خروجی ندارم ولی وقتی 0xFFFF قرار میدم خروجی دارم.
    تشکر

    • میلاد جهاندیده

      با سلام، تجربه چنین مشکلی را نداشتم ولی شاید مشکل از کامپایلر باشه یا تابع…ولی یک تابع ساده تبدیل دسیمال به هگزادسیمال بنویسید بعد خروجی تابع را بدید به تابع setchannel1date.

  3. با سلام و تشکر از مطالب مفید سایتتون، میخواستم بدونم این 512 نقطه ای که برای تشکیل نمودار سینوس انتخاب کردید بر چه اساسی بود؟

    • میلاد جهاندیده

      سلام، از حالات 8 بیتی DAC استفاده میکنه و حداکثر عدد خروجی DAC میشه 255. و برای یک موج کامل به 512 نقطه نیاز داریم از روی نمودار و فرمول متلب اگر دقت کنید متوجه داستان میشید. و برای دقت بالا تمام نقاط را استفاده کرده. و البته با نقاط کم هم میشه سینوسی ایجاد کرد.

  4. سلام و وقت بخیر. ببخشید من میخوام با STM32F103c8t6 یک موج سینوسی با فرکانس 49 مگاهرتز تولید کنم. آیا از نظر سخت افزاری امکان این کار با نسخه میکرو فوق وجود دارد؟ و آیا روشی که توضیح فرموده اید برای این فرکانس نیز جواب می دهد. ممنون…

  5. سلام. ممنون

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