راه اندازی DAC در STM32 را هم به صورت رجیستری و هم با توابع و کتابخانه های HAL در این نوشته بررسی می کنیم. در دسته های Connectivity line و High-density سری F1 و XL-density از STM32F101xx و STM32F103xx، یک واحد DAC وجود دارد. واحد DAC در این میکروکنترلرها 12 بیتی است و این قابلیت وجود دارد که به صورت 8 بیتی کار کند. واحد DAC در میکروکنترلرهای STM32F1 دارای دو کانال خروجی است که هر کدام یک مبدل جداگانه دارند. و در زمانی که از هر دو خروجی استفاده می شود، می توانند به صورت همزمان یا مستقل باشند. ویژگی های DAC در میکروکنترلرهای STM32 سری F1 به طور کلی عبارتند از:
- دو مبدل دیجیتال به آنالوگ که هر کدام یک خروجی دارند؛
- داده های راست چین و چپ چین در مد 12 بیتی؛
- قابلیت آپدیت سنکرون شده؛
- قابلیت تولید نویز؛
- قابلیت ساخت شکل موج مثلثی؛
- خروجی های دوگانه که می توانند همزمان یا مستقل باشند؛
- قابلیت DMA برای هر کانال؛
- قابلیت تحریک خارجی؛
- دارای ولتاژ مرجع از ولتاژ مرجع ADC (یعنی VREF+).
فیلم آموزش میکروکنترلرهای AVR مقدماتی
تصویر 1 – بلوک دیاگرام واحد DAC در STM32 سری F1
در تصویر فوق بلوک دیاگرام واحد DAC میکروکنترلرهای STM32F1 را مشاهده می کنید. بخش 1 منابع تحریک DAC را نشان می دهد. رجیستر کنترلی (2)، رجیستر داده (3)، رجیستر خروجی (4)، واحد کنترل منطقی (5) و مبدل دیجیتال به آنالوگ (6) را نیز در آن مشخص کرده ایم. بخش 7 و 8 نیز به ترتیب، پایه های ورودی و خروجی را نشان می دهند. همان طور که از بلوک دیاگرام مشخص است، DAC در میکروکنترلرهای STM32F1 قابلیت های مختلفی دارد. از جمله تحریک با خروجی تایمر، DMA و قابلیت تولید موج مثلثی و نویز. اما در این نوشته تنها می خواهیم عددی را در رجیستر دادۀ DAC قرار دهیم و با تحریک نرم افزاری، آن را به سیگنال آنالوگ تبدیل کنیم. در ادامه به نمونه کدهای راه اندازی DAC در STM32 می پردازیم. توجه داشته باشید که برای راه اندازی واحد DAC باید تغذیۀ آنالوگ میکروکنترلر را تأمین کنیم. ما برای پروژۀ این نوشته برد توسعۀ STM32F10xVxxx یوبرد را با میکروکنترلر STM32F107VC استفاده می کنیم. تغذیۀ این برد 3.3 ولت است و ولتاژ VDDA آن نیز برابر 3.3 ولت است. پایۀ VREF+ را نیز با یک جامپر به VDDA متصل می کنیم (پایۀ 16 و 17 هدر نری روی برد). پایۀ VSSA نیز به زمین برد متصل است. همان طور که در دو نمونه کد DAC در STM32 در ادامه خواهیم دید، واحد DAC را در مد 12 بیتی راست چین با تحریک نرم افزاری راه اندازی می کنیم. فایل های پروژۀ رجیستری با Keil و پروژۀ HAL با نرم افزار STM32CubeMX و Keil، در پیوست قرار دارند.
تصویر 2 – برد STM32F10xVxxx یوبرد و پایۀ VREF+ میکروکنترلر
نمونه کد رجیستری برای راه اندازی DAC در STM32
در نمونه کد زیر، راه اندازی رجیستری DAC در STM32 را مشاهده می کنید. ابتدا کتابخانۀ stm32f10x.h و gpio.h را فراخوانی کرده ایم. در ادامه در تابع main از واحد RCC و رجیستر APB2ENR، کلاک واحد AFIO را فعال کرده ایم. برای مقداردهی به رجیستر MAPR که مربوط به واحد AFIO است، باید کلاک واحد AFIO را فعال کرده باشیم. سپس با مقداردهی به رجیستر MAPR، برای پروگرام کردن میکروکنترلر، JTAG را غیر فعال و SWD را فعال کرده ایم. در ادامه از رجیستر APB1ENR، کلاک واحد DAC را فعال کرده ایم. پس از آن با فراخوانی تابع gpio_config از کتابخانۀ gpio.h، پایۀ PA4 را در مد خروجی آنالوگ تنظیم کرده ایم. پایۀ PA4، خروجی کانال شمارۀ 1 واحد DAC است. در ادامه از رجیستر کنترلی DAC، بیت های TSEL0 تا TSEL2 را یک کرده ایم. با این کار، منبع تحریک DAC، تحریک نرم افزاری انتخاب می شود. با یک کردن بیت TEN1، تحریک کانال 1 فعال و با یک کردن بیت EN1، کانال 1 فعال می شود. با مقداردهی به رجیسترهای DAC در STM32 تا اینجا، واحد DAC پیکربندی می شود. سپس به رجیستر دادۀ DAC مقدار می دهیم. این مقدار به سیگنال آنالوگ تبدیل خواهد شد. در DAC چند رجیستر داده وجود دارد که مربوط به مدهای 12 و 8 بیتی است. برای کانال 1 تعداد سه رجیستر DHR وجود دارد. رجیسترهای DHR12R1 و DHR12L1 و DHR8R1 به ترتیب برای مدهای 12 بیتی راست چین، 12 بیتی چپ چین و 8 بیتی هستند. در ادامه با یک کردن بیت SWTRIG1 از رجیستر SWTRIGR، واحد DAC را تحریک می کنیم. در این لحظه تبدیل شروع می شود. در مد 12 بیتی مقادیر 0 تا 4095، ولتاژهای صفر تا 3.3 ولت را حاصل می شوند. بنابراین مقدار 1000، ولتاژ 0.8 ولت را نتیجه می دهد.
(1000 / 4096) * 3.3v = 0.805v
#include "stm32f10x.h"
#include "Libs/gpio.h"
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
gpio_config(pa_4, output_analog, 2);
DAC->CR |= DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1 | DAC_CR_EN1;
DAC->DHR12R1 = 1000; // 0 ~ 4095 -> vout = 3.3 * (1000 / 4096) = 0.8 v DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1;
while (1)
{
}
}
تصویر 3 – نتیجۀ راه اندازی واحد DAC در STM32 به صورت رجیستری
تولید موج سینوسی با STM32
اگر مقدار رجیستر دادۀ DAC را با توالی خاصی تغییر دهیم، در خروجی DAC، شکل موج خواهیم داشت. مثلاً اگر مقدار رجیستر را با الگوی سینوسی تغییر دهیم، یک شکل موج سینوسی در خروجی به وجود می آید. برای این کار می توانیم از یک آرایه که یک Lookup table سینوسی است، استفاده کنیم. برای به دست آوردن مقادیر این آرایه، می توانیم از سایت های اینترنتی ساخت Lookup table استفاده کنیم. در اینجا اعضای آرایۀ sine_lookup را از سایت daycounter.com به دست آورده ایم. به طوری که تعداد اعضای آرایه را 256 عضو و مقدار حداکثر را نیز 3500 قرار داده ایم. اگر اعضای این آرایه را با تأخیری منظم در DHR12R1 قرار دهیم، در خروجی یک شکل موج سینوسی خواهیم داشت. در حلقۀ while مقدار 298 را با مقدار عضو sine_lookup جمع می کنیم تا به ولتاژ خروجی به اندازۀ 0.25 ولت اضافه شود. پس از هر بار مقداردهی، DAC را با یک کردن بیت SWTRIG1 تحریک می کنیم تا مقدار جدید به آنالوگ تبدیل شود. سپس به متغیر counter یک واحد اضافه می کنیم. تا دفعۀ بعد، عضو بعدی sine_lookup با 298 جمع و نتیجه به آنالوگ تبدیل شود. در نهایت یک if قرار داده ایم تا مقدار counter به 0 تا 255 محدود شود. با اجرای دائم کدهای درون حلقۀ while، خروجی یک شکل موج سینوسی با آفست 1.65 ولت خواهد بود. مقدار آفست به این صورت به دست می آید.
((298 + (3500/2)) / 4096) * 3.3v = 0.5 * 3.3v = 1.65v
می توان با قرار دادن delay در حلقۀ while، فرکانس موج سینوسی خروجی را تغییر داد. در تصویر زیر نتیجۀ این نمونه کد را مشاهده می کنید. در ادامه به راه اندازی DAC در STM32 با توابع و کتابخانه های HAL می پردازیم.
تولید موج سینوسی با AVR و DAC0800
#include "stm32f10x.h"
#include "Libs/gpio.h"
int main(void)
{
unsigned int counter = 0;
unsigned int sine_lookup[256] =
{0x6d6,0x701,0x72c,0x757,0x782,0x7ac,0x7d7,0x801,0x82b,0x855,0x87f,0x8a9,0x8d2,0x8fb,0x924,0x94c,
0x974,0x99b,0x9c2,0x9e9,0xa0f,0xa35,0xa5a,0xa7e,0xaa2,0xac6,0xae8,0xb0b,0xb2c,0xb4d,0xb6d,0xb8d,
0xbab,0xbc9,0xbe7,0xc03,0xc1f,0xc3a,0xc54,0xc6d,0xc85,0xc9c,0xcb3,0xcc9,0xcdd,0xcf1,0xd04,0xd16,
0xd27,0xd37,0xd46,0xd54,0xd61,0xd6d,0xd78,0xd81,0xd8a,0xd92,0xd99,0xd9f,0xda4,0xda7,0xdaa,0xdab,
0xdac,0xdab,0xdaa,0xda7,0xda4,0xd9f,0xd99,0xd92,0xd8a,0xd81,0xd78,0xd6d,0xd61,0xd54,0xd46,0xd37,
0xd27,0xd16,0xd04,0xcf1,0xcdd,0xcc9,0xcb3,0xc9c,0xc85,0xc6d,0xc54,0xc3a,0xc1f,0xc03,0xbe7,0xbc9,
0xbab,0xb8d,0xb6d,0xb4d,0xb2c,0xb0b,0xae8,0xac6,0xaa2,0xa7e,0xa5a,0xa35,0xa0f,0x9e9,0x9c2,0x99b,
0x974,0x94c,0x924,0x8fb,0x8d2,0x8a9,0x87f,0x855,0x82b,0x801,0x7d7,0x7ac,0x782,0x757,0x72c,0x701,
0x6d6,0x6ab,0x680,0x655,0x62a,0x600,0x5d5,0x5ab,0x581,0x557,0x52d,0x503,0x4da,0x4b1,0x488,0x460,
0x438,0x411,0x3ea,0x3c3,0x39d,0x377,0x352,0x32e,0x30a,0x2e6,0x2c4,0x2a1,0x280,0x25f,0x23f,0x21f,
0x201,0x1e3,0x1c5,0x1a9,0x18d,0x172,0x158,0x13f,0x127,0x110,0xf9,0xe3,0xcf,0xbb,0xa8,0x96,
0x85,0x75,0x66,0x58,0x4b,0x3f,0x34,0x2b,0x22,0x1a,0x13,0xd,0x8,0x5,0x2,0x1,
0x0,0x1,0x2,0x5,0x8,0xd,0x13,0x1a,0x22,0x2b,0x34,0x3f,0x4b,0x58,0x66,0x75,
0x85,0x96,0xa8,0xbb,0xcf,0xe3,0xf9,0x110,0x127,0x13f,0x158,0x172,0x18d,0x1a9,0x1c5,0x1e3,
0x201,0x21f,0x23f,0x25f,0x280,0x2a1,0x2c4,0x2e6,0x30a,0x32e,0x352,0x377,0x39d,0x3c3,0x3ea,0x411,
0x438,0x460,0x488,0x4b1,0x4da,0x503,0x52d,0x557,0x581,0x5ab,0x5d5,0x600,0x62a,0x655,0x680,0x6ab};
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
gpio_config(pa_4, output_analog, 2);
DAC->CR |= DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1 | DAC_CR_EN1;
DAC->DHR12R1 = 1000; // 0 ~ 4095 -> vout = 3.3 * (1000 / 4096) = 0.8 v
DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1;
while(1)
{
DAC->DHR12R1 = 298 + sine_lookup[counter];
DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1;
counter++;
if(counter > 255) counter = 0;
}
}
تصویر 4 – راه اندازی مبدل دیجیتال به آنالوگ در STM32، ساخت موج سینوسی با STM32
راه اندازی DAC در STM32 با HAL
راه اندازی مبدل دیجیتال به آنالوگ در STM32 با توابع و کتابخانه های HAL نسبت به راه اندازی رجیستری آن ساده تر است. در نرم افزار STM32CubeMX کافی است در بخش DAC (شمارۀ 1) تیک کانال خروجی مورد نظر را فعال کنیم (2). در بخش Configuration و در قسمت Parameter settings (شمارۀ 3) هم می توانیم Output buffer را فعال کنیم. تحریک DAC را روی تحریک نرم افزاری قرار می دهیم. در این بخش می توانیم موج مثلثی یا نویز را روی پایۀ خروجی داشته باشیم. ما در این نوشته شکل موج مثلثی یا نویز را فعال نمی کنیم. در تنظیمات پایۀ خروجی نیز علاوه بر DAC_OUT1، باید GPIO_Analog را نیز تیک بزنیم (4). تنظیمات DAC در STM32CubeMX به صورت تصویر زیر است.
تصویر 5 – تنظیمات DAC در نرم افزار STM32CubeMX
ما پروژۀ STM32CubeMX را در نرم افزار Keil باز می کنیم. برای راه اندازی DAC در STM32 با توابع و کتابخانه های HAL دو تابع را استفاده می کنیم. تابع HAL_DAC_SetValue و تابع HAL_DAC_Start. ورودی اول تابع HAL_DAC_SetValue آدرس متغیر تعریف شده از استراکچر مربوط به DAC است. این متغیر به صورت خودکار توسط STM32CubeMX تعریف می شود. ورودی دوم، کانال خروجی DAC است. ورودی سوم، تعیین کنندۀ مد DAC است. که می تواند 12 بیتی راست چین، 12 بیتی چپ چین یا 8 بیتی باشد. ورودی چهارم هم مقداری است که می خواهیم به آنالوگ تبدیل شود. تابع HAL_DAC_Start نیز برای تحریک DAC است. با اجرای این تابع، تبدیل آغاز می شود. با اجرای نمونه کد زیر، خروجی DAC تقریباً 3 ولت خواهد بود. زیرا:
(3600 / 4096) * 3.3v = 2.9v
int main(void)
{
...
/* USER CODE BEGIN 2 */
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 3600);
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
تصویر 6 – نتیجۀ راه اندازی DAC در STM32 با توابع HAL
نتایج راه اندازی DAC در STM32
- در برخی میکروکنترلرهای STM32 سری F1 واحد DAC وجود دارد و در برخی دیگر وجود ندارد.
- واحد DAC در STM32 سری F1 دو کانال خروجی دارد.هر یک از کانال های خروجی، مبدل جداگانه دارند.
- واحد DAC در میکروکنترلرهای STM32 می تواند توسط خروجی تایمرهای میکروکنترلر تحریک شود.
- DAC در میکروکنترلرهای STM32F1 می تواند در مد 12 بیتی یا 8 بیتی کار کند. در مد 12 بیتی، دادۀ DAC می تواند چپ چین یا راست چین باشد که می توان آن را تعیین کرد.
- می توان با تنظیم رجیسترهای DAC در STM32، روی خروجی شکل موج مثلثی و یا نویز ایجاد کرد.
- برای این که DAC کار کند، باید تغذیۀ آنالوگ و همچنین ولتاژ مرجع VREF+ را تأمین کرد.
- در راه اندازی DAC در میکروکنترلرهای STM32، باید مد پایۀ خروجی را روی مد آنالوگ تنظیم کرد.
- اگر تحریک DAC، تحریک نرم افزاری باشد، با هر بار یک کردن بیت SWTRIG، یک تبدیل شروع می شود.
- برای تولید شکل موج با STM32و واحد DAC آن، می توان مقدار رجیستر دادۀ DACرا طبق یک الگوی خاص تغییر داد.
- راه اندازی مبدل دیجیتال به آنالوگ میکروکنترلرهای STM32 با توابع HAL، به سادگی با چند تیک در STM32CubeMX انجام می شود.
- برای قرار دادن مقدار در رجیستر دادۀ DAC، از تابع HAL_DAC_SetValue استفاده می شود.
- تابع HAL_DAC_Start برای تحریک نرم افزاری واحد DAC است.
0 دیدگاه