راه اندازی DAC در STM32

توسط | 25 آذر, 1400 | STM32, میکروکنترلر | 0 دیدگاه

راه-اندازی-dac-stm32

آموزش STM32 یوبرد

شروع بازی ST

آموزش های رایگان STM32

فیلم های آموزش STM32

آموزش خصوصی STM32

راه اندازی 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+).

راه اندازی ADC در STM32

فیلم آموزش میکروکنترلرهای AVR مقدماتی

فیلم آموزش ARM STM32 مقدماتی

فیلم آموزش آردوینو مقدماتی

بلوک-دیاگرام-stm32f1

تصویر 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، در پیوست قرار دارند.

تایمرهای میکروکنترلرهای STM32

ساخت پروژه در Keil و نصب آن

برد-stm32f1-یوبرد

تصویر 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 ولت را نتیجه می دهد.

GPIO در STM32

(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 به صورت تصویر زیر است.

تنظیمات-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 */
}

 

راه-اندازی-عملی-hal

تصویر 6 – نتیجۀ راه اندازی DAC در STM32 با توابع HAL

نتایج راه اندازی DAC در STM32

  1. در برخی میکروکنترلرهای STM32 سری F1 واحد DAC وجود دارد و در برخی دیگر وجود ندارد.
  2. واحد DAC در STM32 سری F1 دو کانال خروجی دارد.هر یک از کانال های خروجی، مبدل جداگانه دارند.
  3. واحد DAC در میکروکنترلرهای STM32 می تواند توسط خروجی تایمرهای میکروکنترلر تحریک شود.
  4. DAC در میکروکنترلرهای STM32F1 می تواند در مد 12 بیتی یا 8 بیتی کار کند. در مد 12 بیتی، دادۀ DAC می تواند چپ چین یا راست چین باشد که می توان آن را تعیین کرد.
  5. می توان با تنظیم رجیسترهای DAC در STM32، روی خروجی شکل موج مثلثی و یا نویز ایجاد کرد.
  6. برای این که DAC کار کند، باید تغذیۀ آنالوگ و همچنین ولتاژ مرجع VREF+ را تأمین کرد.
  7. در راه اندازی DAC در میکروکنترلرهای STM32، باید مد پایۀ خروجی را روی مد آنالوگ تنظیم کرد.
  8. اگر تحریک DAC، تحریک نرم افزاری باشد، با هر بار یک کردن بیت SWTRIG، یک تبدیل شروع می شود.
  9. برای تولید شکل موج با STM32و واحد DAC آن، می توان مقدار رجیستر دادۀ DACرا طبق یک الگوی خاص تغییر داد.
  10. راه اندازی مبدل دیجیتال به آنالوگ میکروکنترلرهای STM32 با توابع HAL، به سادگی با چند تیک در STM32CubeMX انجام می شود.
  11. برای قرار دادن مقدار در رجیستر دادۀ DAC، از تابع HAL_DAC_SetValue استفاده می شود.
  12. تابع HAL_DAC_Start برای تحریک نرم افزاری واحد DAC است.
رضا بداغی

رضا بداغی

عضو هیئت مدیره یوبرد، طراح و برنامه نویس سیستم های دیجیتال مبتنی بر میکروکنترلر، طراح PCB و مدرس آموزش های میکروکنترلر، طراحی PCB و برنامه نویسی میکروکنترلر

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

زیرساخت مطمئن صنعت

جدیدترین تاپیک های STM32

راه-اندازی-usart-stm32

راه اندازی UART در STM32، رجیستری و HAL

راه اندازی UART در STM32، اتصالات و نرم افزار مورد نیاز، نمونه کد USART در STM32 به صورت رجیستری، نمونه کد رجیستری USART با وقفۀ دریافت، نمونه کد HAL برای راه اندازی USART در STM32، نمونه کد HAL با وقفۀ دریافت، نحوه محاسبه Baud rate در USART میکروکنترلرهای STM32F1

برنامه-نویسی-میکروکنترلر-ویژوال-استودیو

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

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

راه-اندازی-adc-stm32

راه اندازی ADC در STM32، رجیستری و HAL

راه اندازی ADC در STM32، استفاده از پیکربندی Independent، کانال تکی، تبدیل Discontinuous و کانال Regular، اتصالات لازم برای راه اندازی واحد ADC در STM32، نمونه کد رجیستری، نمونه کد ADC میکروکنترلر STM32 با HAL، خواندن از چند کانال ADC با توابع HAL، توابع HAL راه اندازی ADC

راه-اندازی-stm32-آردوینو-arduino

راه اندازی STM32 با آردوینو

راه اندازی STM32 با آردوینو، راه اندازی STM32 در آردوینو، اضافه کردن میکروکنترلرهای STM32 به Arduino IDE، برنامه نویسی میکروکنترلرهای STM32 و بردهای Nucleo-F103RB و Blue pill در Arduino ، پروگرام کردن STM32 با Arduino IDE، بوت لودر USB برد Blue pill، بوت لودر STM32 HID

0 دیدگاه

یک دیدگاه بنویسید

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

دیگر آموزش های یوبرد

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش زبان C و MISRA-C یوبرد

گام نخست دنیای میکروکنترلر

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

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

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

آموزش های شاخص

ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است