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

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

تولید موج سینوسی با AVR و مبدل دیجیتال به آنالوگ DAC0800، معرفی مختصر آی سی DAC0800 و مدار خارجی و اتصالات آن، محاسبۀ ولتاژ خروجی DAC0800، روش تولید سیگنال سینوسی با DAC، رابطۀ فرکانس موج سینوسی خروجی و تایمر، بررسی نمونه کد راه اندازی DAC0800 با 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 و برنامه نویسی میکروکنترلر

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

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

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

آموزش Arduino یوبرد

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

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

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

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-سون-سگمنت-با-آردوینو

راه اندازی سون سگمنت با آردوینو

راه اندازی سون سگمنت با آردوینو UNO، راه اندازی سون سگمنت 4 تایی آند مشترک با آردوینو، اتصال سون سگمنت به آردوینو، کتابخانۀ سون سگمنت برای آردوینو، نمونه کد راه اندازی سون سگمنت، نمایش اعداد در سون سگمنت 4 تایی، نکات راه اندازی سون سگمنت

راه-اندازی-adc-در-آردوینو

راه اندازی ADC در آردوینو

راه اندازی ADC در آردوینو، راه اندازی LCD گرافیکی KS0108 با کتابخانۀ U8g2، اتصالات لازم برای راه اندازی ADC و LCD گرافیکی KS0108، نمونه کد راه اندازی ADC آردوینو، فرمول محاسبۀ دما با TMP36، راه اندازی سنسور دما با آردوینو، راه اندازی فتوسل (LDR) با آردوینو

کنترل موتور براشلس با STM32

از ویژگی‌های تایمرهای Advanced میکروکنترلرهای STM32، امکان ایجاد PWM شش مرحله‌ای است. PWM شش مرحله‌ای در کنترل موتورهای براشلس کاربرد دارد و در STM32 می‌توان با تایمرهای Advanced، موتورهای براشلس را کنترل کرد. PWM شش مرحله‌ای نسبت به روش‌های دیگر کنترل موتور براشلس، عملکرد بهتر، مصرف انرژی کمتر و سطح ایمنی بالاتری را فراهم می‌آورد.

از مباحث آموزش STM32

فیوزبیت EESAVE

برای جلوگیری از پاک شدن محتوای حافظۀ EEPROM داخلی میکروکنترلرهای AVR در هنگام پاک کردن حافظۀ فلش آن، فیوزبیتی به نام EESAVE وجود دارد که باید فعال شود. در غیر این صورت، هر بار که حافظۀ فلش پاک می‌شود، حافظۀ EEPROM نیز پاک می‌شود. فیوزبیت EESAVE به صورت پیش‌فرض غیر فعال است و برای حفظ محتوای EEPROM باید فعال شود. حفظ محتوای EEPROM در بسیاری از پروژه‌ها ضروری است.

از مباحث آموزش AVR

تفاوت Event با وقفه در STM32

در میکروکنترلرهای STM32، علاوه بر وقفه‌های خارجی، Eventهای خارجی هم وجود دارند. تفاوت Event خارجی با وقفۀ خارجی این است که در وقفۀ خارجی، اجرای کد وجود دارد و با اتفاق افتادن آن، کدهای روتین وقفه اجرا می‌شوند، اما در Event خارجی، اجرای کد وجود ندارد و اتفاق افتادن آن فقط باعث می‌شود  میکروکنترلر از مد کاهش مصرف توان خارج شود.

از مباحث آموزش STM32

کلاک خروجی در STM32

در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

وقفۀ Pin change در AVR

در برخی میکروکنترلرهای AVR، وقفه‌های Pin change وجود دارند که تفاوتشان با وقفۀ خارجی این است که در وقفۀ خارجی می‌توان تعیین کرد وقفه با لبۀ پایین‌رونده یا بالارونده یا تغییر سطح اتفاق بیفتد، اما وقفۀ Pin change با هر لبه یا تغییر سطح سیگنال اتفاق می‌افتد. همچنین هر وقفۀ خارجی با تحریک تنها یک پایۀ ورودی اتفاق می‌افتد. اما هر وقفۀ Pin change، چند پایۀ ورودی دارد و تحریک هر یک از آنها، باعث اتفاق افتادن وقفۀ Pin change می‌شود.
از مباحث آموزش آردوینو

خواندن فرکانس و دیوتی سایکل با آردوینو

یک روش برای خواندن Duty Cycleو فرکانس موج PWM ، قابلیت Capture تایمرهاست. برای بردهای آردوینو مبتنی بر AVR، کتابخانۀ TimerOne،  فاقد قابلیت کپچر است. اما در کتابخانۀ HardwareTimer میکروکنترلرهای STM32 در آردوینو، می‌توان از کپچر استفاده کرد و مد input PWM تایمرهای STM32 را فعال کرد و دو کپچر را به کار گرفت و فرکانس و دیوتی سایکل موج ورودی را خواند.

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

اولویت وقفه‌ها در STM32

 

از مباحث آموزش stm32در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

49 دیدگاه ها

  1. سلام میشه حداکثر فرکانس موج سینوسی که با این روش ایجاد میشه رو بگین
    مثلا میشه تا چند کیلو هرتز هم ایجاد کرد

    پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد.

ضبط پیام صوتی

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