در این آموزش به معرفی و راه اندازی واحد 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 نامیده می شود که تنظیمات و کد آن به صورت زیر است:
نرم افزار Stm32CubeMx
شکل 2: Stm32f4xx Pinout
شکل 3: Stm32f4xx clock configuration
شکل 4: Stm32f4xx DAC and Timer4 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 این قابلیت در آنها اضافه شده است.
نکته ای که خوب است در رابطه با تنظیمات DMA بدانیم این است که دو Mode کاری برای آن در نرم افزار Stm32CubeMx تعریف شده است یکی Circular و دیگری Normal که در حالت Circular وقتی که داده ها (در اینجا 512 نقطه ی نمودار که گفته بودیم) به ترتیب منتقل شدند دوباره نشانگر به ابتدای آرایه بر می گردد و آنها را به طور متناوب منتقل می کند ولی در حالت Normal تنها یکبار این انتقال صورت می گیرد و چون ما در اینجا می خواستیم که به طور متناوب موج سینوسی را داشته باشیم از Circular Mode استفاده کردیم.
کامپایلر Keil :
پس از تنظیمات فوق در نرم افزار Stm32CubeMX مطابق شکل 6 با فشردن گزینه Generate source code پنجره ای نمایش داده می شود که با مشخص کردن محل ذخیره فایل ها، اسم پروژه و همچنین کامپایلر مورد نظر که برای من نرم افزار Keil V5 بود و فشردن کلید OK پروژه مورد نظر در نرم افزار Keil ایجاد و باز میشود ولی اگر هنوز کتابخانه مربوط به stm32f4xx را در keil نصب نکرده باشید به شما پیام میدهد و از شما می خواهد که کتابخانه مورد نظر را دانلود و نصب کنید که برای این کار باید به اینترنت متصل شوید و مراحل دانلود و نصب به ترتیب در خود نرم افزار انجام می شوند.
شکل 6: تولید کدها برای کامپایلر keil V5
سپس با باز شدن کامپایلر Keil تابع main را باز می کنیم و کد های خودمان را به آن اضافه می کنیم:
شکل 7: تابع main
شکل 8: تعریف متغیری برای 512 نقطه تابع سینوسی
شکل 9: توابع فعال کردن timer وdac و مقدار دهی dac
شکل 10: توابع مختلف مربوط به dac و توضیحات مربوط به هر کدام در stm32f4xx_hal_dac.c
اکنون برنامه این بخش کامل شده است و شما می توانید اگر اسیلوسکوپ دارید سیگنال خروجی را با اسیلوسکوپ مشاهده کنید و در غیر این صورت با یک LED و مقاومت، خروجی DAC را به زمین وصل کنید و برای فرکانس های پایین تر مثلا 1 هرتز کاهش و افزایش متناوب نور LED را مشاهده کنید و فرکانس آن را هم به کمک مولتی متر اندازه بگیرید البته در بخش دوم و سوم این سیگنال سینوسی را بر روی صفحه نمایشگر نشان خواهیم داد.
شکل 11: مشاهده فرکانس 1Hz سیگنال خروجی واحد DAC میکروکنترلر stm32f4xx
نویسنده مطلب : خانم مهسا مهدیه نجف آبادی
دوستان عزیز بزودی قسمت بعدی این آموزش با عنوان « معرفی و راه اندازی واحد ADC میکروکنترلر stm32f4xx و نمونه برداری با نرخ مشخص، (30KHz ) از سیگنال خروجی DAC » منتشر میشود. اگر سوالی داشتین در قسمت #کامنت های سایت بنویسید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
با سلام
این مجموعه جهت استخدام نیروی مهندس برق الکترونیک نیاز به همکاری یک فرد با علاقه مندی بالا در شرکت طیف پردازان واقع در شهرک علمی و تحقیقاتی دارد.
خیلی ممنون بابت اطلاع رسانی برای جذب نیرو ، اگر از دوستان کسی علاقمند بود براتون معرفی میشه.
با سلام و ممنون از سایت خوبتون
میخوام یک متغیری که مقدار دسیمال داره رو در خروجی DAC قرار بدم، چطور میتونم اینکار رو بکنم؟
وقتی در دستور setchannel1date، مقدار 4095 قرار میدم، خروجی ندارم ولی وقتی 0xFFFF قرار میدم خروجی دارم.
تشکر
با سلام، تجربه چنین مشکلی را نداشتم ولی شاید مشکل از کامپایلر باشه یا تابع…ولی یک تابع ساده تبدیل دسیمال به هگزادسیمال بنویسید بعد خروجی تابع را بدید به تابع setchannel1date.
با سلام و تشکر از مطالب مفید سایتتون، میخواستم بدونم این 512 نقطه ای که برای تشکیل نمودار سینوس انتخاب کردید بر چه اساسی بود؟
سلام، از حالات 8 بیتی DAC استفاده میکنه و حداکثر عدد خروجی DAC میشه 255. و برای یک موج کامل به 512 نقطه نیاز داریم از روی نمودار و فرمول متلب اگر دقت کنید متوجه داستان میشید. و برای دقت بالا تمام نقاط را استفاده کرده. و البته با نقاط کم هم میشه سینوسی ایجاد کرد.
سلام و وقت بخیر. ببخشید من میخوام با STM32F103c8t6 یک موج سینوسی با فرکانس 49 مگاهرتز تولید کنم. آیا از نظر سخت افزاری امکان این کار با نسخه میکرو فوق وجود دارد؟ و آیا روشی که توضیح فرموده اید برای این فرکانس نیز جواب می دهد. ممنون…
سلام. ممنون
با سلام خدمت شما که وقت گداشتین برای اموزش اگر امکان دارد من چندین سوال دارم بتوانم از ی طریق بپرسم؟