برای تبدیل سیگنال دیجیتال به آنالوگ از DAC یا مبدل دیجیتال به آنالوگ استفاده میشود.در میکروکنترلر LPC1768 یک واحد DAC پیش بینی شده است که در در این جلسه یاد راه اندازی اونو یاد میگیریم.
مشخصات مبدل دیجیتال به آنالوگ میکروکنترلر LPC1768
- دارای دقت 10 بیتی
- دارای حالت کاهش توان
- DAC از نوع آرایه مقاوتی
- خروجی بافر شده حداکثر 700 میلی آمپر
- حداکثر سرعت 1مگاهرتز
- سرعت قابل تنظیم نسب به توان
راهاندازی مبدل دیجیتال به آنالوگ میکروکنترلر LPC1768
- تنظیم کلاک با استفاده از بیتهای 22و23 رجیستر PCLKSEL0 یا از Configuration Wizard بصورت دستی.
- تنظیم پین AOUT بعنوان خروجی
- گذاشتن مقادیر دیجیتال در رجیستر DACR
- نکته : اطلاعات DAC را با GPDMA مستقیم میتوان روی حافظه نوشت که در مباحث پیشرفته آموزش LPC1768 اینا را برسی میکنیم.
- نکته : برای دسترسی به Configuration Wizard روی فایل system_LPC17xx.c که بهمراه فایلهای CMSIS روی پروژه اضافه کردین یا بطور خودتار توسط KEIL اضافه شده کلیک کنید تا باز بشه. اگر فایل متنی را آورد در زیر فایل متنی روی نوشته Configuration Wizard کلیک کنید.ایجاد تغییرات هم که خیلی راحته کمی کنجکاوی کنید یاد میگیرید.
توابع CMSIS مبدل دیجیتال به آنالوگ میکروکنترلر LPC1768
تابع DAC_Init
void DAC_Init(LPC_DAC_TypeDef *DACx);
- ورودی تابع باید LPC_DAC باشه.
تابع DAC_SetBias
void DAC_SetBias (LPC_DAC_TypeDef *DACx,uint32_t bias);
- ورودی اول تابع باید LPC_DAC باشه.
- ورودی دوم نسبت توان مصرفی با عملکرد DAC تنظیم میکنه. اگر صفر باشه 700uA و اگر یک باشه 350uA البته میتونید بجای صفر و یک بترتیب DAC_MAX_CURRENT_700uA یا DAC_MAX_CURRENT_350uA بنویسید.
نکته : زمان تنظیم شده در فیلد BIAS در صورتی معتبر است که بار خازنی روی پایه AOUT نباید از 100Pf بیشتر نباشه.
تابع DAC_UpdateValue
void DAC_UpdateValue (LPC_DAC_TypeDef *DACx, uint32_t dac_value);
- ورودی اول تابع باید LPC_DAC باشه.
- ورودی دوم مقدار دیجیتال 10 بیتی میباشد که باید به آنالوگ تبدیل بشه.
مثال اول
#include "inc/lpc17xx.h" #include "inc/lpc17xx_dac.h" #include "inc/lpc17xx_pinsel.h" int main(void){ /* * Init DAC pin connect * AOUT on P0.26 */ PINSEL_CFG_Type PinCfg; PinCfg.Funcnum = 2; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 26; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); DAC_Init(LPC_DAC); DAC_SetBias(LPC_DAC,DAC_MAX_CURRENT_350uA); DAC_UpdateValue (LPC_DAC,1000); return 1; }
خروجی مثال اول ولتاژ ثابت تقریبا 3 ولت است.
مثال دوم
#include "inc/lpc17xx.h" #include "inc/lpc17xx_dac.h" #include "inc/lpc17xx_pinsel.h" //cpu clock = 100Mhz void delay(uint32_t j){// j us uint32_t i=0; for(i=0;i<(100*j);i++); } int main(void){ uint16_t i; /* * Init DAC pin connect * AOUT on P0.26 */ PINSEL_CFG_Type PinCfg; PinCfg.Funcnum = 2; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 26; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); DAC_Init(LPC_DAC); DAC_SetBias(LPC_DAC,DAC_MAX_CURRENT_700uA); while(1){ for(i=0;i<1023;i++){ DAC_UpdateValue (LPC_DAC,i); delay(100); } } return 1; }
خروجی مثال دوم : یک سیگنال دندانه ارهای است که در شکل زیر میتونید مشاهده کنید.
منبع: میکرودیزاینرالکترونیک