تولید موج سینوسی با AVR و DAC0800

توسط | 10 اسفند, 1398 | AVR, میکروکنترلر, وبلاگ | 49 دیدگاه ها

ساخت-موج-سینوسی-avr

آموزش AVR یوبرد

شاهکار 8بیتی اتمل

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

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

آموزش خصوصی AVR

اخبار جدید یوبرد در اینستاگرام

تولید موج سینوسی با AVR و DAC0800 تنها نیاز به راه اندازی پورت IO و ایجاد وقفۀ زمانی منظم دارد. به این صورت که با وقفۀ زمانی منظم، اعضای یک آرایه را در رجیستر PORTx قرار می دهیم. پایه های یکی از پورت ها به پایه های ورودی DAC0800 متصل اند. و مقادیر قرار گرفته در رجیستر PORTx، توسط آی سی DAC0800 به آنالوگ تبدیل می شوند. با وقفۀ زمانی منظم که می توانیم آن را با تایمر ایجاد کنیم، مقدار PORTx را تغییر می دهیم. بنابراین سیگنال آنالوگ خروجی تغییر می کند و اگر تغییرات با یک الگوی سینوسی باشد، سیگنال خروجی سینوسی است. در این نوشته به روش ساخت موج سینوسی با میکروکنترلرهای AVR و آی سی DAC0800 می پردازیم. این نوشته می تواند برای این کاربردها مفید باشد:

  • ساخت موج سینوسی سه فاز با AVR و DAC0800؛
  • فانکشن ژنراتور با AVR و DAC0800؛
  • اینورتر سینوسی با AVR و DAC0800؛
  • ساخت موج مثلثی با AVR و DAC0800؛
  • ساخت موج دندانه اره ای با AVR و DAC0800؛
  • و … .

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

فیلم آموزش تایمر پیشرفته در STM32

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

فیلم آموزش تایمر پیشرفته در AVR

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

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

نمونه کدی را که در این نوشته بررسی می کنیم، در اتمل استودیو (میکروچیپ استودیو) برای میکروکنترلر ATmega64A نوشته ایم. فایل های پروژۀ اتمل استودیو به همراه فایل شبیه سازی نرم افزار پروتئوس در پیوست قرار دارند. این نمونه کد را در نرم افزار کدویژن نیز نوشته و در فایل پیوست قرار داده ایم. در ادامه ابتدا دربارۀ آی سی DAC0800 و خروجی آن صحبت می کنیم. سپس روش تولید موج سینوسی با آن را تشریح و در نهایت نمونه کد نوشته شده را بررسی می کنیم.

تولید-موج-سینوسی-dac

تصویر 1 – تولید موج سینوسی با AVR و DAC0800

آی سی DAC0800 و ملزومات راه اندازی آن

پیش از ورود به مبحث تولید موج سینوسی با AVR، ابتدا مختصراً آی سی DAC0800 را بررسی می کنیم. DAC0800 یک مبدل دیجیتال به آنالوگ هشت بیتی است. این DAC می تواند ورودی دیجیتال 8 بیتی را به سیگنال آنالوگ معادل تبدیل کند. خروجی DAC0800 دو جریان Sink در جهت مخالف هم است. که با مقاومت های پول آپ آن را به ولتاژ تبدیل می کنیم. مبدل دیجیتال به آنالوگ DAC0800 دارای 16 پایه است. هشت پایۀ آن برای دادۀ دیجیتال ورودی، دو پایه برای خروجی آنالوگ، دو پایه برای ولتاژهای مرجع، دو پایه برای تغذیۀ آی سی و دو پایه به نام های Threshold Control و Compensation است. پایه های مبدل دیجیتال به آنالوگ DAC0800 را در تصویر زیر می بینید.

پایه-پکیج

تصویر 2 – پایه های آی سی DAC0800

با توجه به مدار پیشنهادی دیتاشیت برای راه اندازی DAC0800، اتصالات آن را به صورت زیر برقرار کرده ایم. در این پروژه از ولتاژهای +15 و -15 ولت برای تغذیۀ DAC0800 (پایه های 13 و 3) استفاده کرده ایم. ولتاژ مرجع مثبت (پایۀ 14) و منفی (پایۀ 15) را 5 ولت و صفر در نظر گرفته ایم. این پایه ها را با مقاومت 5 کیلو اهم به 5 ولت و زمین متصل کرده ایم. با دو مقاومت 10 کیلو اهم نیز پایه های خروجی مثبت و منفی (پایه های 4 و 2) را پول آپ کرده ایم. پایه های 5 تا 12 به ترتیب به پایه های PA7 تا PA0 میکروکنترلر متصل می شوند. پایۀ 1 به زمین و پایۀ 16 با خازن 10 نانو فاراد به تغذیۀ منفی متصل می شوند. خازن های 100 نانو فاراد C2 و C3 نیز روی تغذیۀ مثبت قرار می گیرند.

نکته: شمارۀ پایه های ذکر شده بر اساس پکیج DIP این آی سی است.

نکته: خازن C1، سرامیکی و خازن های C2 و C3، الکترولیتی هستند.

مدار-راه-اندازی

تصویر 3 – مدار راه اندازی DAC0800 با AVR

محاسبۀ دامنۀ ولتاژ خروجی DAC0800

در دیتاشیت DAC0800 برای محاسبۀ جریان خروجی فرمولی آورده شده است. حداکثر جریانی که خروجی می کشد برابر است با:

Ifs = (Vref/Rref) * (255/256)

 

Ifs به معنای جریان حداکثر پایۀ خروجی است. اگر تمام پایه های دیجیتال ورودی 1 شوند، جریانی که از پایۀ Iout عبور می کند برابر Ifs خواهد بود. اگر تمام ورودی های دیجیتال صفر باشند، جریانی که از Iout بار (پایۀ 2) عبور می کند، برابر Ifs است. زمانی که Iout در ماکزیمم خود است، Iout بار (پایۀ 2) در مینیمم خود است. با توجه به مطالب گفته شده و تصویر زیر داریم:

Ifs4 = - Ifs2
Ifs4 = Ifs
Ifs4 = -Ifs
Ifs = (Vref/Rref) * (255/256)

KVL(*): Vo1 = VCC - R Ifs4 = VCC - R Ifs
KVL(**): Vo2 = VCC - R Ifs2 = VCC + R Ifs

Vout(p-p) = Vo2 - Vo1 = 2R Ifs = 2R (Vref/Rref) * (255/256)

 

جریان های خروجی آی سی از مقاومت های پول آپ روی پایه های 2 و 4، کشیده می شود. بنابراین ولتاژی روی این پایه ها می افتد. در KVL(*) و KVL(**) این ولتاژها را محاسبه کرده ایم. با توجه به مقادیر مقاومت های این پروژه، ولتاژ پیک تو پیک موج سینوسی خروجی برابر است با:

Vout(p-p) = Vo2 - Vo1 = 2 * 10k * (5/5k) * (255/256) = 19.92v

 

محاسبه-ولتاژ-خروجی

تصویر 4 – شماتیک برای محاسبۀ ولتاژ خروجی DAC0800

می توانیم تنها یکی از خروجی های آی سی را استفاده کنیم. اما در این صورت ولتاژ دارای آفست خواهد بود. برای حذف آفست خروجی و به دست آوردن تفاضل Vo1 و Vo2 می توانیم از تقویت کنندۀ تفاضلی استفاده کنیم. در تصویر زیر یک تقویت کنندۀ تفاضلی که با استفاده از یک اپ امپ ساخته ایم، آمده است. ورودی های این تقویت کنندۀ تفاضلی همان خروجی های آی سی DAC0800 هستند. گین آن نیز با توجه به مقدار مقاومت ها برابر 1 است. بنابراین خروجی آن برابر Vo2 – Vo1 است. زمانی که Vo2 در حداکثر مقدار خود است، Vo1 مینیمم است و بالعکس. پس اگر موج سینوسی روی آنها ایجاد شود، با هم 180 درجه اختلاف فاز خواهند داشت. بنابراین دامنۀ شکل موج حاصل از تفاضل آنها، دو برابر دامنۀ هر یک از آنهاست. در ادامه به تولید موج سینوسی با AVR و DAC0800 می پردازیم.

تقویت-کننده-تفاضلی

تصویر 5 – تقوییت کنندۀ تفاضلی با گین 1 با اپ امپ LM741

روش تولید موج سینوسی با AVR و DAC0800

برای کار با مبدل دیجیتال به آنالوگ DAC0800 و راه اندازی آن با میکروکنترلرهای AVR یا هر میکروکنترلر دیگر، باید یک دادۀ 8 بیتی به صورت موازی به پایه های ورودی آن بدهیم. اگر مقادیر صفر تا 255 را به ورودی آن بدهیم، خروجی آن از صفر تا ولتاژ حداکثر تغییر می کند. برای این که موج سینوسی در خروجی داشته باشیم، دادۀ 8 بیتی را باید طبق الگوی سینوسی به آن بدهیم. برای این کار می توانیم از Lookup table سینوسی استفاده کنیم. Lookup tableها را می توانیم از سایت هایی که آنها را تولید می کنند کپی کنیم. این مقادیر، یک Lookup table هشت بیتی 256 تایی با الگوی سینوسی است:

131 , 134 , 137 , 140 , 144 , 147 , 150 , 153 , 156 , 159 , 162 , 165 , 168 , 171 , 174 , 177 ,
180 , 183 , 185 , 188 , 191 , 194 , 196 , 199 , 201 , 204 , 206 , 209 , 211 , 214 , 216 , 218 ,
220 , 222 , 225 , 227 , 229 , 230 , 232 , 234 , 236 , 237 , 239 , 240 , 242 , 243 , 245 , 246 ,
247 , 248 , 249 , 250 , 251 , 252 , 252 , 253 , 254 , 254 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 254 , 254 , 253 , 252 , 252 , 251 , 250 , 249 , 248 , 247 , 246 ,
245 , 243 , 242 , 240 , 239 , 237 , 236 , 234 , 232 , 230 , 229 , 227 , 225 , 222 , 220 , 218 ,
216 , 214 , 211 , 209 , 206 , 204 , 201 , 199 , 196 , 194 , 191 , 188 , 185 , 183 , 180 , 177 ,
174 , 171 , 168 , 165 , 162 , 159 , 156 , 153 , 150 , 147 , 144 , 140 , 137 , 134 , 131 , 128 ,
125 , 122 , 119 , 116 , 112 , 109 , 106 , 103 , 100 , 97  , 94  , 91  , 88  , 85  , 82  , 79  ,
76  , 73  , 71  , 68  , 65  , 62  , 60  , 57  , 55  , 52  , 50  , 47  , 45  , 42  , 40  , 38  ,
36  , 34  , 31  , 29  , 27  , 26  , 24  , 22  , 20  , 19  , 17  , 16  , 14  , 13  , 11  , 10  ,
9   , 8   , 7   , 6   , 5   , 4   , 4   , 3   , 2   , 2   , 1   , 1   , 1   , 1   , 1   , 1   ,
1   , 1   , 1   , 1   , 1   , 2   , 2   , 3   , 4   , 4   , 5   , 6   , 7   , 8   , 9   , 10  ,
11  , 13  , 14  , 16  , 17  , 19  , 20  , 22  , 24  , 26  , 27  , 29  , 31  , 34  , 36  , 38  ,
40  , 42  , 45  , 47  , 50  , 52  , 55  , 57  , 60  , 62  , 65  , 68  , 71  , 73  , 76  , 79  ,
82  , 85  , 88  , 91  , 94  , 97  , 100 , 103 , 106 , 109 , 112 , 116 , 119 , 122 , 125 , 128

 

اگر این مقادیر با تأخیر زمانی منظم به ورودی DAC داده شوند، خروجی آن 256 پله تغییر سطح ولتاژ است. که این 256 پله تغییر سطح ولتاژ، یک شکل موج سینوسی را به وجود می آورد. هر چه تعداد مقادیر Lookup table بیشتر باشد، خروجی بیشتر به موج سینوسی شبیه است. تعداد مقادیر Lookup table در پروژۀ این نوشته را 256 مقدار در نظر گرفته ایم.

خروجی-سینوسی

تصویر 6 – پله های خروجی DAC حاصل از تبدیل مقادیر Lookup table به ولتاژ آنالوگ و تشکیل موج سینوسی

محاسبۀ فرکانس موج سینوسی خروجی DAC

برای این که فرکانس موج سینوسی ثابت باشد، مقادیر Lookup table باید در فواصل زمانی ثابت به DAC0800 داده شوند. این فاصلۀ زمانی را با تایمر 1 در AVR خواهیم ساخت. حال می خواهیم رابطۀدورۀ تناوب موج سینوسی را با تعداد پله هایی که تایمر می شمارد به دست آوریم. شکل موج سینوسی خروجی، 256 پله دارد. بنابراین دوره تناوب موج سینوسی که نام آن را T می گذاریم برابر 256 * t است. t همان فاصلۀ زمانی ثابت است که با تایمر 1 ساخته می شود. تایمر را روی مد CTC با مقدار TOP برابر OCR1A تنظیم و وقفۀ مقایسۀ A را نیز فعال می کنیم. در این صورت شمارندۀ تایمر (TCNT1) از صفر تا مقدار رجیستر OCR1A می شمارد و وقفۀ مقایسه اتفاق می افتد. در روتین این وقفه مقادیر Lookup table را در پورت A قرار می دهیم. دوباره تایمر از صفر تا OCR1A می شمارد و وقفۀ مقایسه دوباره اتفاق می افتد. در این هنگام مقدار بعدی Lookup table را در پورت A قرار می دهیم. زمان بین دو وقفۀ تایمر، همان t است. وقتی 256 بار وقفه اتفاق بیفتد، 256 مقدار Lookup table به ترتیب با وقفۀ زمانی t در پورت A قرار می گیرند. در این پروژه مقدار فرکانس کلاک تایمر 1، همان کلاک CPU یعنی 8 مگاهرتز است. به تصویر زیر دقت کنید. مقدار رجیستر OCR1A نسبت به فرکانس موج سینوسی (freq) از فرمول زیر به دست می آید. برای تغییر فرکانس موج سینوسی، OCR1A باید تغییر کند. که با قرار دادن مقدار فرکانس مورد نظر در فرمول، مقدار OCR1A محاسبه می شود.

تایمر 1 و 3 در AVR

T = 1/freq = 256 * t , t = OCR1A * (1/F_CPU)

1/freq = 256 * (OCR1A *(1/F_CPU))

OCR1A = F_CPU / (256 * freq) , F_CPU = 8MHz

OCR1A = 31250/freq

 

رابطه-فرکانس-موج-سینوسی-ocr1a

تصویر 7 – تولید موج سینوسی با AVR و DAC0800، رابطۀ بین فرکانس موج سینوسی و رجیستر OCR1A

نمونه کد تولید موج سینوسی با AVR و DAC0800

ابتدا فرکانس CPU را 8 مگاهرتز دیفاین و پس از آن کتابخانه هایی را فراخوانی کرده ایم. در ادامه Lookup table سینوسی را در یک آرایه آورده ایم.

#define F_CPU	8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "Libs/clcd.h"

unsigned char const_source[256] ={
131 , 134 , 137 , 140 , 144 , 147 , 150 , 153 , 156 , 159 , 162 , 165 , 168 , 171 , 174 , 177 ,
180 , 183 , 185 , 188 , 191 , 194 , 196 , 199 , 201 , 204 , 206 , 209 , 211 , 214 , 216 , 218 ,
220 , 222 , 225 , 227 , 229 , 230 , 232 , 234 , 236 , 237 , 239 , 240 , 242 , 243 , 245 , 246 ,
247 , 248 , 249 , 250 , 251 , 252 , 252 , 253 , 254 , 254 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 254 , 254 , 253 , 252 , 252 , 251 , 250 , 249 , 248 , 247 , 246 ,
245 , 243 , 242 , 240 , 239 , 237 , 236 , 234 , 232 , 230 , 229 , 227 , 225 , 222 , 220 , 218 ,
216 , 214 , 211 , 209 , 206 , 204 , 201 , 199 , 196 , 194 , 191 , 188 , 185 , 183 , 180 , 177 ,
174 , 171 , 168 , 165 , 162 , 159 , 156 , 153 , 150 , 147 , 144 , 140 , 137 , 134 , 131 , 128 ,
125 , 122 , 119 , 116 , 112 , 109 , 106 , 103 , 100 , 97  , 94  , 91  , 88  , 85  , 82  , 79  ,
76  , 73  , 71  , 68  , 65  , 62  , 60  , 57  , 55  , 52  , 50  , 47  , 45  , 42  , 40  , 38  ,
36  , 34  , 31  , 29  , 27  , 26  , 24  , 22  , 20  , 19  , 17  , 16  , 14  , 13  , 11  , 10  ,
9   , 8   , 7   , 6   , 5   , 4   , 4   , 3   , 2   , 2   , 1   , 1   , 1   , 1   , 1   , 1   ,
1   , 1   , 1   , 1   , 1   , 2   , 2   , 3   , 4   , 4   , 5   , 6   , 7   , 8   , 9   , 10  ,
11  , 13  , 14  , 16  , 17  , 19  , 20  , 22  , 24  , 26  , 27  , 29  , 31  , 34  , 36  , 38  ,
40  , 42  , 45  , 47  , 50  , 52  , 55  , 57  , 60  , 62  , 65  , 68  , 71  , 73  , 76  , 79  ,
82  , 85  , 88  , 91  , 94  , 97  , 100 , 103 , 106 , 109 , 112 , 116 , 119 , 122 , 125 , 128 };

 

روتین وقفۀ مقایسۀ A تایمر 1 را هم به این شکل می نویسیم. هر بار مقدار شمارندۀ تایمر (TCNT1) به مقدار OCR1A برسد، یک وقفۀ مقایسه اتفاق می افتد. و این روتین وقفه اجرا می شود. دفعۀ اول، عضو صفرم آرایۀ const_source در PORTA قرار می گیرد. دفعۀ دوم، عضو یکم آرایه و به همین ترتیب اعضای صفرم تا عضو شمارۀ 255 در PORTA قرار می گیرند. شرط if برای این است که مقدار ph1 از 255 بیشتر نشود و دفعۀ بعد دوباره عضو صفرم آرایه در PORTA قرار بگیرد. پورت A میکروکنترلر به ورودی DAC متصل است و نتیجۀ تداوم این روند، شکل موج سینوسی در خروجی DAC است.

ISR(TIMER1_COMPA_vect)
{
	static unsigned int ph1=0;
	PORTA = const_source[ph1];
	ph1++;
	if(ph1 > 255) ph1 = 0;
}

 

در تابع main ابتدا چند متغیر تعریف کرده و مقدار اولیۀ فرکانس را 10 هرتز قرار داده ایم. مقدار delay_const را که در نهایت در OCR1A قرار می گیرد، طبق فرمول به دست آورده ایم. در سطر بعد پورت A را برای اتصال به DAC و پورت D را برای اتصال به LCD خروجی کرده ایم. به دو پایۀ PE4 و PE5 دو دکمه برای تغییر فرکانس متصل کرده ایم. در اینجا با یک کردن بیت های 4 و 5 رجیستر PORTE، پول آپ داخلی آنها را فعال کرده ایم. در سطرهای بعد تایمر 1 را در مد شمارۀ 4 پیکربندی کرده ایم. مقدار OCR1A آن هم برابر delay_const قرار داده ایم. سپس وقفۀ مقایسۀ تایمر 1 را فعال، LCD را راه اندازی و پرچم کلی وقفه ها را فعال کرده ایم. در LCD نیز مقدار فرکانس اولیه را نمایش داده ایم.

int main(void)
{
	unsigned int delay_const=0;
	unsigned char freq=10;
	char lcd_str[16];
	
	delay_const=(unsigned int) 31250/freq;

	DDRA=0xFF;
	DDRD=0xFF;
	PORTE=(1<<PORTE5) | (1<<PORTE4);

	TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
	TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
	OCR1AH=(delay_const>>8);
	OCR1AL=(delay_const&0xFF);

	TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

	lcd_init(16);
	lcd_clear();
	sprintf(lcd_str,"Frequency = %d",freq);
	lcd_puts(lcd_str);
	
	sei();

 

نتیجه-مقدار-اولیه-فرکانس

تصویر 8 – تولید موج سینوسی با AVR، مقدار اولیۀ فرکانس

تغییر فرکانس موج سینوسی

برای تولید موج سینوسی با AVR با فرکانس متغیر، دو دکمه به پایه های PE4 و PE5 متصل کرده ایم. با فشردن دکمۀ روی PE5 چون که به صورت داخلی پول آپ است، بیت پنجم رجیستر PINE صفر می شود. بنابراین برنامۀ درون if اول اجرا می شود. فرکانس یک واحد کم می شود و مقدار delay_const با توجه به فرمول به دست می آید. delay_const یک مقدار 16 بیتی است. 8 بیت با ارزش آن را در OCR1AH و 8 بیت کم ارزشش را در OCR1AL قرار داده ایم. در سطرهای بعد محدودۀ 1 تا 100 هرتز برای مقدار فرکانس در نظر گرفته ایم. سپس مقدار فرکانس را در LCD نمایش داده ایم. با فشردن دکمۀ روی PE4، برنامه وارد if دوم می شود و فرکانس یک واحد افزایش می یابد. در اینجا هم مثل if قبلی OCR1A مقداردهی و فرکانس در LCD نمایش داده می شود. وقتی مقدار OCR1A تغییر می کند، تعداد پله های شمارش تایمر و در نتیجه مقدار t هم تغییر می کند. این تغییر در نهایت باعث می شود که فرکانس موج سینوسی تغییر کند. در تصویر زیر موج سینوسی فرکانس متغیر با AVR با فرکانس های 25 هرتز و 70 هرتز آمده است.

نکته: در مقداردهی به رجیسترهای 16 بیتی در AVR دقت شود که اول باید در بایت با ارزش نوشت و سپس در بایت کم ارزش.

پورت IO در AVR

while (1)
{
		
	if(!((PINE & (1<<5)) == (1<<5)))
	{
		_delay_ms(200);
		freq--;
		delay_const=(unsigned int) 31250/freq;
		OCR1AH=(delay_const>>8);
		OCR1AL=(delay_const&0xFF);
		if (freq>100) freq=100;
		if (freq<1) freq=1;
		lcd_clear();
		sprintf(lcd_str,"Frequency = %d",freq);
		lcd_puts(lcd_str);
	}
		
	if(!((PINE & (1<<4)) == (1<<4)))
	{
		_delay_ms(200);
		freq++;
		delay_const=(unsigned int) 31250/freq;
		OCR1AH=(delay_const>>8);
		OCR1AL=(delay_const&0xFF);
		if (freq>100) freq=100;
		if (freq<1) freq=1;
		lcd_clear();
		sprintf(lcd_str,"Frequency = %d",freq);
		lcd_puts(lcd_str);
	}
}

 

نتیجه-تولید-موج-سینوسی

تصویر 9 – نتیجۀ نهایی راه اندازی DAC با AVR و تولید موج سینوسی با AVR و DAC0800

نتایج تولید موج سینوسی با AVR و DAC0800

  1. در راه اندازی DAC با میکروکنترلرهای AVR یا میکروکنترلرهای دیگر، در صورتی که نوع ارتباط DAC، ارتباط موازی باشد، تنها نیاز است ورودی DAC را به یک پورت میکروکنترلر متصل کنیم و مقادیر دیجیتال را روی آن پورت قرار دهیم.
  2. آی سی DAC0800 تعداد 8 پایۀ ورودی دارد که مقادیر دیجیتال را به صورت موازی می گیرد. دو پایۀ خروجی هم دارد که سیگنال های آنالوگ روی آنها قرار می گیرد.
  3. ولتاژ خروجی DAC0800 به ولتاژ مرجع، مقاومت روی پایۀ ولتاژ مرجع و مقاومت های پول آپ خروجی بستگی دارد.
  4. می توان با یک تقویت کنندۀ تفاضلی دو خروجی DAC0800 را به یک خروجی تبدیل کرد و ولتاژ آفست را حذف کرد.
  5. در تولید موج سینوسی با DAC باید مقادیری که توالی آنها الگوی سینوسی دارد، در زمان های منظم به ورودی DAC داده شوند.
  6. هر چه تعداد مقادیر Lookup table بیشتر باشد، خروجی DAC به شکل موج مورد نظر شبیه تر است.
  7. وقفه های زمانی منظم را می توان به روش های مختلفی ساخت. یکی از این روش ها استفاده از تایمر است.
  8. در استفاده از تایمر به روش های مختلفی می توان وقفه های زمانی منظم ایجاد کرد. یکی از این روش ها استفاده از مد CTC تایمر است.
  9. در پروژۀ این نوشته، برای تغییر فرکانس کافی است تعداد پلیه های شمارش تایمر تغییر کند. که این کار با تغییر OCR1A صورت گرفته است.
  10. فرکانس موج سینوسی خروجی با مقدار OCR رابطۀ عکس دارد. هر چه مقدار OCR کمتر شود، فرکانس موج سینوسی خروجی بیشتر می شود و بالعکس.


 

رضا بداغی

رضا بداغی

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

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

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

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

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

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

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

رله-relay

رله، سوییچ تحریک پذیر

تعریف رله، تاریخچه، طرز کار رلۀ الکترومکانیکی، اصطلاحات، انواع الکترومکانیکی، رلۀ حالت جامد، رلۀ هیبریدی، رلۀ حرارتی و انواع تحریک شونده با عوامل غیر الکتریکی، انواع موجود در صنعت برق و برق صنعتی، رلۀ ایمنی و برخی انواع حفاظتی، رلۀ دیجیتال، لزوم استفاده و راه اندازی رله، مشخصات الکتریکی

پروتکل-i2c-protocol

پروتکل I2C، ادغامی از USART و SPI توسط Philips

پروتکل I2C، تاریخچه I2C، ویژگی ها و کاربردهای I2C، عبارات و اصطلاحات I2C، باس، اتصالات و گسترش شبکه I2C، سیگنال های I2C، قالب داده و آدرس در I2C، انتقال داده در I2C، آدرس دهی 10 بیتی، قابلیت Multi-master، حکمیت، مشخصات الکتریکی و زمانی، مقدار مقاومت های پول آپ، Clock Stretching

سون-سگمنت-seven-segment

سون سگمنت، نمایشگر هفت قسمتی

سون سگمنت چیست؟ انواع 7-segment، تاریخچه 7-segment، ساختار 7-segment و نمایش در آن، تعداد ارقام و 7-segmentهای مالتی پلکس، کاربردها، انواع اندازه ها و رنگ ها و مدار راه اندازی 7-segment، بایاس 7-segment، مقدار مقاومت در راه اندازی 7-segment، درایور سون سگمنت، پایه های 7-segment

49 دیدگاه ها

  1. سلام آقای بداغی. یک آیسی DAC با دقت 12 بیت خوب بهم معرفی می کنید؟

    پاسخ
    • سلام. آی سی DAC7621 یه آی سی DAC با ورودی موازیه و آی سی های DAC60501M و DAC60501Z هم DACهای با ورودی سریال (یعنی I2C و SPI) هستن. هر سه DAC هم 12 بیتی هستن.

      پاسخ
  2. سلام. من میخوام یک پروژه دارم که امکانات چندانی نداره. توی پروژه از DAC استفاده میشه. من AVR کلاسهای استاد اسدی رو شرکت کردم و AVR رو خوب بلدم. اما سوالی که برام پیش اومده اینه که برم سراغ میکروکنترلرهای ARM STM32 چون خودشون DAC دارن یا اینکه نه با همین AVR انجام بدم؟ ممنون میشم در این مورد راهنماییم کنید.

    پاسخ
    • سلام. از نظر من اگر توی استفاده از سخت افزار مشکلی ندارید، با همین میکروکنترلر AVR و آی سی های DAC میتونید کار کنید. البته باید شرایط پروژه هم در نظر بگیرد. تعداد بیت های DAC، فرکانس تایمر میکروکنترلر، که بتونید باهاش موج های مختلف با فرکانس های مختلف بسازید و شرایط دیگۀ پروژه. ولی اگه فکر میکنید لازمه که تعداد سخت افزار کمتری استفاده بشه، میتونید از DAC میکروکنترلرهای STM32 استفاده کنید. چون اگه از DAC میکروکنترلرهای STM32 استفاده کنید، یه آی سی کمتر استفاده کردید. یه نکته هم دقت کنید و اون این که اگه میخواید PCB بزنید، ترتیب پایه های DAC0800 (پکیج DIP) جالب نیست و ممکنه باعث بشه برد مدار چاپی دو لایه استفاده کنید. این مورد رو هم در نظر داشته باشید که ممکنه برنامه نویسی میکروکنترلرهای STM32 براتون مشکل تراز برنامه نویسی میکروکنترلرهای AVR باشه.

      پاسخ
  3. سلام
    ممنون از مطلب خوبتون. یه سوال دارم. چرا توی تعریف آرایه const source از volatile استفاده کردید؟ ممنون

    پاسخ
    • سلام خواهش میکنم. چون از نرم افزار کدویژن برای نوشتن برنامه استفاده کردیم. توی کدویژن برای تعریف متغیر با کلاس حافظۀ اتوماتیک، باید متغیر رو بدون آوردن کلمۀ auto تعریف کنیم. در این صورت ممکنه کامپایلر، کلاس حافظه متغیر رو از نوع رجیستر قرار بده. برای جلوگیری از این خطا باید از volatile استفاده کنیم. البته این کار دلایل دیگه ای هم داره که توی نوشته های «انواع متغیر در زبان برنامه نویسی C» و «کلاس های حافظه در زبان برنامه نویسی C حوزۀ تعریف و طول عمر متغیرها» توضیح داده شدن.

      پاسخ
  4. وایییی دستتون درد نکنه. کلی با این dac کلنجار رفتم تا آخرش از روی شماتیکی که قرار دادید فهمیدم ترتیب پایه های اون برعکس نام گذاری شده. فرمولی هم نوشتید برای محاسبه خروجی که توی پایان نامهم نوشتم. در کل خیلی ممنونم خیلی کارمو راه انداخت

    پاسخ
    • خواهش میکنم. موفق باشید. ان شاء الله که مفید بوده باشه.

      پاسخ
  5. سلام مهندس ممنون از مدارتون . آیاممکنه یه فرکانس تا حدود 10کیلو هرتز که با پتانسیومتر تغییر کنه با این مدار داشته باشیم؟ اگه ایمیل بدین ممنون میشم .

    پاسخ
    • سلام. خواهش میکنم. به صورت تئوری بله. اگه مقدار OCR1A رو 3 قرار بدیم، طبق فرمولی که محاسبه کردیم، فرکانس موج سینوسی حدود 10 کیلو هرتز میشه. ولی باید توجه کرد که در این صورت باید پورت IO با فرکانس حدود 2.6 مگاهرتز تغییر وضعیت بده. اگر DAC0800 هم بتونه با این فرکانس ورودی رو دریافت کنه، میکروکنترلر AVR ممکنه نتونه. باید به دیتاشیت یا User Manual های AVR مراجعه کنید و حداکثر قرکانس تغییر وضعیت پایه های IO رو ببینید.

      پاسخ
  6. سلام جناب مهندس خسته نباشید. ممنون از مطالب مفیدی که گذاشتید.
    سوالی که من دارم اینه برای ایجاد موج سینوسی سه فاز با اختلاف فازهای 120 درجه بایستی از سه پورت AVR استفاده کنم و اعداد رو طوری بچینم که بین سه پورت اختلاف فاز 120 درجه ایجاد بشه؟
    و سوال دیگه اینکه می تونم تغییرات فرکانس رو در طول زمان با یک آهنگ خاص و به صورت اتوماتیک ایجاد کنم؟
    همچنین خروجی موج سینوسی سه فاز ایجاد شده رو می تونم برای درایو یک اینورتر سه فاز که یک موتور سه فاز رو کنترل می کنه استفاده کنم؟

    پاسخ
    • سلام. خیلی ممنون. خواهش میکنم. بله. شما از آرایه ای که توی همین پروژه انجام شده استفاده کنید. البته برای این که اختلاف فاز با دقت بالاتری 120 درجه بشه، 255 تا (یا تعدادی دیگه ای) از مقادیر آرایه رو استفاده کنید. که اگه تقسیم بر 3 بشه، خارج قسمتش عدد صحیح بشه. در این صورت توی وقفۀ تایمر به سه تا پورت مقدار میدید. مثلاً اگه از 255 تا مقدارش استفاده کنیم، به این شکل:

      PORTA=const_source[ph1];
      PORTB= const_source[ph1+85];
      PORTC= const_source[ph1+170];
      Ph1++;
      if (ph1>=255) ph1=0;

      از آرایۀ counst source بهتره یه مقدار نزدیک ولتاژ صفر یعنی عدد نزدیک 127 روئ حذف کنید تا نبودنش توی شکل موج خروجی زیاد تأثیرگذار نباشه.

      دربارۀ تغییر فرکانس: الان تغییر فرکانس با کلید انجام میشه. شما برنامه ای بنویسید که مثلاً با delay و حلقۀ for یه متغیر مقدارش خطی یا غیر خطی تغییر کنه. و باعث تغییر مقدار delay بشه بعد از این delayی که مقدارش با آهنگ برنامه ریزی شده تغییر میکنه، مقدار فرکانس رو تغییر بدید.

      دربارۀ اینورتر هم توجه داشته باشید که اینورتر ولتاژ DC رو به AC تبدیل می کنه. و نمیشه بهش ولتاژ AC داد. مگر این که منظور شما این باشه که یک اینورتر رو باز کنیم و این ولتاژ رو به جایی از مدارش بدیم و اون هم تقویتش کنه. که این هم باید توجه بشه که اینورترها انواع مختلفی دارن. ولی در کل میشه خروجی DAC رو تقویت کرد و ازش یه اینورتر ساخت.

      پاسخ
  7. تشکر از مطلب خوبتون. عالی بود. میشه فقط از یکی از پایه های خروجی استفاده کرد یا باید حتماً از دو تاش خروجی گرفت؟

    پاسخ
    • سلام. خواهش میکنم. ممنون. بله میشه. ولی در این صورت آفست خروجی رو دارید.

      پاسخ
  8. سلام آقای مهندس. dac رو میشناسید که نیاز به ولتاژ دوبل نداشته باشه و بدون نیاز به ولتاژ منفی کار کنه؟

    پاسخ
    • سلام. آی سی AD1866 یه نمونه 16 بیتی برای صداست که نیاز به منبع دوبل نداره. AD7801 هم یه DAC با منبع تغذیۀ تکی هستش.

      پاسخ
  9. سلام. جناب مهندس میشه مقاومت های پول آپ رو وصل نکرد؟ من دیدم معمولاً مقاومت پول آپ رو برای ورودی های دیجیتال و برای بالا کشیدن ولتاژ اونا استفاده میکنن.

    پاسخ
    • سلام. خیر باید وصل کنید. چون خروجی اون open-collector هستش و خروجی ولتاژ آنالوگ با جریان Sink عبوری از مقاومت های پول آپ به وجود میاد. پول آپ کردن با این که خیلی مواقع برای ورودی های دیجیتال استفاده میشه، صرفاً برای ورودی دیجیتال نیست و گاهی (مثل خروجی DAC0800) برای خروجی هم استفاده میشه.

      پاسخ
  10. سلام. آقای مهندس میشه توضیح بدید چطور میشه اون آرایه اعداد ثابت رو به دست آورد؟ ممنون از شما

    پاسخ
    • سلام. یه روشش این فرموله:

      constant_source[i]=[(127*sin(xi))+128]

      فرضاً میخواید از 8 مقدار استفاده کنید. پس باید 8 مقدار ورودی صفر و 45 و 90 و 135 و 180 و 225 و 270 و 315 درجه رو به ورودی تابع بدید. در این صورت اعداد خروجی بین صفر تا 255 هستش. اگه میخواید یه سینوسی دقیق تر داشته باشید، باید تعداد اعضای اون آرایه رو بالا ببرید که نیاز داره تعداد بیشتری ورودی بدید. مثلاً میخواید تعدادش 100 تا باشه. پس 100 تا ورودی باید بدید به تابع. این ورودی ها هم میشن:

      x0=0

      x1=1 * (360/100)

      x2=2 * (360/100)

      x99=99 * (360/100)

      زوایای ورودی هم به این شکل انتخاب میشن. توجه داشته باشید که کروشه توی فرمول نماد جزء صحیحه.

      پاسخ
  11. با سلام
    جای تشکر دارد که یک هموطن ایرانی مطالبی به این زیبایی را بیان نموده است من تازه شروع کردم و بیشتر از مطالب خارجی که درکش برام سخته استفاده میکنم خوشحال خواهم شد اگر در رابطه با ساخت cnc و کنترل چند موتور همزمان و نحوه ارتباط با grbl منبع خوب و کاربردی معرفی نمایید نا گفته نماند که من قصد کار با بردهای اردینو را ندارم و بهتر میدانم که خودم زحمت ساخت را بکشم . با سپاس فراوان سعید سعیدی

    پاسخ
    • سلام خواهش میکنم نظر لطفتونه. بنده در این زمینه فعالیت نداشتم و نمی تونم منبعی خدمتتون معرفی کنم.

      پاسخ

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

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

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

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

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

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

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

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

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

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

شروع بازی ST

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

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

آموزش FreeRTOS یوبرد

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

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

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

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

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

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

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

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

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

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