در بخش سوم به معرفی و راه اندازی واحد UART میکروکنترلر stm32f4xx و ارسال داده های نمونه برداری شده توسط ADC به کامپیوتر و نمایش بر روی صفحه کامپیوتر میپردازیم.
قبل از مطالعه این نوشته باید دو جلسه قبلی این آموزش را در لینک های زیر بخوانید:
معرفی واحد UART میکروکنترلر stm32f4xx :
UART به معنای Universal asynchronous receiver-transmitter که یک پروتکل ارتباط سریال است و از طریق آن داده ها بین دو میکروکنترلر و یا یک میکروکنترلر و کامپیوتر جا به جا می شوند انتقال داده به صورت سریال و از طریق دو سیم انجام می شود که یکی برای دریافت داده (RX) و دیگری برای ارسال داده (TX) هستند. و داده های 8 بیتی پشت سرهم ارسال می شوند و برای تمایز داده ها از یک دیگر در این پروتکل بیت های start bit و stop bit استفاده می شوند که در شکل زیر نمایش داده شده است.
پروتکل UART میکروکنترلر stm32f4xx
اطلاعات کاملتر در مورد پروتکل UART : ارتباط سریال – پروتکل UART
برقراری ارتباط UART بین دو میکروکنترلر :
برای این که داده ای را بین دو میکروکنترلراز طریق یوارت جا به جا کنیم لازم است که مطابق شکل زیر، TX یک میکروکنترلر به RX میکروکنترلر دیگر متصل شود چون که داده ارسالی یکی درواقع داده دریافتی دیگری است و همچنین برای هم مبنا کردن دو میکروکنترلر زمین های آنها را به یکدیگر متصل کنیم و در نهایت هم باید Baud Rate دو میکروکنترلر یکسان باشد.
اتصال دو میکروکنترلر با UART
برقراری ارتباط UART بین میکروکنترلر و کامپیوتر:
برای اتصال میکروکنترلر و کامپیوتر لازم است که از یک ماژول میانی به نام USB-to-Serial Module استفاده کنیم که به شکل های مختلفی وجود دارد. و پس ازاتصال آن به کامپیوتر قسمت Device Manager کامپیوترتان را بررسی کنید که این ماژول را شناخته باشد و اگر نشناخته بود به صورت آنلاین یا با دانلود درایور از لینک زیر و نصب آن ماژول را به کامپیوترتان بشناسانید تا به آن یک پورت اختصاص دهد که داده ها از طریق همین پورت بین کامپیوتر و میکروکنترلر جا به جا شوند.
سه نوع از ماژول های USB-to-UART
و پس از نصب درایور بر روی کامپیوتر برای نمایش داده های ارسالی می توانید از نرم افزار هایی مثل Realterm و یا Serialplot استفاده کنید که در Realterm داده ها به صورت هگز ، Uint_8 و… قابل نمایش هستند و در SerialPlot داده ها به صورت عدد های پشت سر هم رسم می شوند و ما چون که می خواهیم شکل موج سینوسی را که به وسیله ی مبدل دیجیتال به آنالوگ (DAC) ساخته ایم و با مبدل آنالوگ به دیجیتال (ADC) نمونه برداری کرده ایم نمایش دهیم پس از نرم افزار SerialPlot استفاده می کنیم که می توانید آن را از لینک زیر دانلود کنید.
نرم افزار Stm32CubeMX :
برای تنظیمات UART به شکل زیر عمل می کنیم :
ابتدا در قسمت Pin Configuration یکی از یوارت ها را انتخاب می کنیم :
Pin Configuration
سپس برای تنظیمات یوارت لازم داریم که Baud Rate آن را مشخص کنیم و DMA آن را در Normal Mode فعال کنیم . لازم به ذکر است که با توجه به فرکانس کاری پردازنده کامپیوتر ها و محدودیت های ماژول های USB-to-Serial، برخی از Baud Rate های استاندارد در سمت کامپیوتر عبارتند از:
bit/sec 9600،115200،230400،460800،921600
USART3 configuration
DMA for UART
با انجام همه تنظیمات بالا ازابتدا تا اینجا ، configuration نهایی به صورت شکل زیر است.
configuration نهایی
کامپایلر Keil :
بررسی عملکرد درست UART به تنهایی:
پس از generate کردن کد در نرم افزار Stm32CubeMX و باز کردن نرم افزار Keil برای این که از عملکرد صحیح یوارت مطمئن شویم در ابتدا همان 512 داده سینوسی را به طور مستقیم به کامپیوتر ارسال می کنیم و پس از reset کردن برد STM32f4xx باید در نرم افزار SerialPlot نمایش داده شود البته باید PORT و Bound Rate به درستی انتخاب شوند. قطعه کدی که در تابع main برای بررسی عملکرد صحیح یوارت استفاده می شود:
پس از پروگرم کردن بردمان یعنی Stm32f4xx باید ، پایه TX میکرو کنترلر(PB10) را به پایه RX ماژول USB-to-UART و پایه RX میکروکنترلر (PB11) را پایه TX ماژول متصل کنیم، تا اتصالات بردمان درست باشد و سپس ماژول را به کامپیوتر متصل کنیم :
Device Manager
مشاهده درستی عملکرد UART در نرم افزار Serial Plot
با مشاهده ی شکل بر روی صفحه کامپیوتر از عملکرد صحیح UART مطمئن می شویم.
برنامه نهایی در کامپایلر Keil :
اکنون که از عملکرد صحیح یوارت مطمئن شدیم، زمان آن رسیده است که داده های نمونه برداری شده توسط ADC را با UART به کامپیوتر منتقل کنیم و نمایش دهیم. برای این کار دو آرایه جدید تعریف می کنیم تا زمانی که بافر buffin را با داده های ADC پر می کنیم، بافر buffout را توسط UART به کامپیوتر بفرستیم و پس از این که این ارسال انجام شد، بافر buffout را با داده های ADC مقدار دهی کنیم و بافر buffin را با UART ارسال کنیم تا داده های روی هم نوشته نشوند و خراب نشوند، البته لازم به ذکر است که سرعت انتقال داده توسط UART نیز باید بیشتر از سرعت نمونه برداری ADC باشد. پس برنامه نهایی به صورت زیر خواهد بود:
متغیر های برنامه نهایی
مقدار دهی و شروع به کار timer2,timer4,DAC,ADC,USART3
تابع HAL_ADC_ConvCpltCallback
برای پیاده سازی الگوریتم ذکر شده لازم است که از تابع HAL_ADC_ConvCpltCallback استفاده کنیم، این تابع بدین صورت عمل می کند که وقتی نمونه برداری ADC به همان تعداد داده مشخص شده در تابع HAL_ADC_Start_DMA انجام شد، نمونه برداری از ADC متوقف می شود و این تابع اجرا می شود. پس ما به کمک این تابع می توانیم بین بافرهای buffin و buffout جا به جا شویم تا به طور پیوسته و کامل داده های نمونه برداری شده توسط ADC با UART به کامپیوتر منتقل شوند و مطابق شکل در نرم افزار SerialPlot نمایش داده شوند. البته لازم است که پایه های ADC و DAC را به یکدیگر متصل کنیم یعنی برطبق شکل ، PA4 و PA0 را با سیم به یکدیگر وصل کنیم تا اتصالات بردمان کامل شود.
نمایش شکل موج سینوسی خروجی DAC و نمونه برداری شده باADC که با UART به کامپیوتر منتقل شده است، بر روی صفحه کامپیوتر
تصویر شکل موج سینوسی بر روی کامپیوتر
با مشاهده شکل بر روی صفحه کامپیوتراز عملکرد صحیح مدار مطمئن می شویم چون که می دانیم که فرکانس موج سینوسی 1kHz است و نرخ نمونه برداری ADC هم 30KHz است یعنی با سرعتی 30 برابر فرکانس موج سینوسی از آن نمونه برداری شده است، بنابراین داده نمایش داده شده بر روی صفحه کامپیوتر باید موج سینوسی ای باشد که با 30 نقطه رسم شده است که همینطور هم هست.
نویسنده مطلب : مهسا مهدیه نجف آبادی
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
مشتاقانه منتظر ادامه آموزشتون هستم.