ساخت PWM با AVR، سخت افزاری و نرم افزاری

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

ساخت-pwm-avr

آموزش AVR یوبرد

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

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

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

آموزش خصوصی AVR

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

ساخت PWM با AVR علاوه بر پیاده سازی به صورت سخت افزاری با مدهای PWM تایمر، به صورت نرم افزاری با مدهای نرمال، CTC و PWM نیز امکان پذیر است. منظور ما از تولید PWM سخت افزاری با AVR، به کارگیری مد(های) PWM و فعال کردن خروجی(های) آن است. در این روش تایمر در یکی از مدهای PWM پیکر بندی و خروجی آن مورد استفاده قرار می گیرد. با تغییر مقدار رجیستر مقایسه، Duty Cycle موج خروجی تغییر می کند. در ادامه خواهیم دید که چگونه با راه اندازی PWM در AVR به صورت سخت افزاری، موج PWM می سازیم. گاهی نیز ممکن است به دلیل محدودیت های طراحی، نتوانیم از خروجی های PWM برای ایجاد موج PWM استفاده کنیم. برای مثال در زمانی که پایۀ خروجی PWM تایمر، به عملکرد دیگری اختصاص یافته است. در این صورت تولید موج PWM به صورت نرم افزاری، می تواند راه حلی برای رسیدن به هدف پروژه باشد. تولید PWM نرم افزاری با AVR که در این نوشته خواهیم دید، با وقفه های تایمر به دست می آید. طوری که می توانیم روی هر پایه از پورت IO در AVR، موج PWM داشته باشیم. در این نوشته به بررسی نمونه کد PWM در AVR به صورت سخت افزاری و نرم افزاری می پردازیم. همچنین نکات مهمی را حول این موضوع بیان می کنیم. نمونه کد نوشته شده برای تولید PWM سخت افزاری و نرم افزاری برای میکروکنترلر ATmega64A است. این نمونه کد در اتمل استودیو و کدویژن و فایل شبیه سازی پروتئوس آن در پیوست موجودند. تولید PWM با تایمر در AVR و میکروکنترلرهای دیگر، می تواند کاربردهای فروانی داشته باشد. از کم و زیاد کردن نور یک LED تا کنترل دور موتور DC، ساخت شکل موج سینوسی، اینورتر PWM و … همگی می توانند با تایمرهای میکروکنترلرها ساخته شوند.

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

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

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

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

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

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

ساخت-pwm-با-avr-atmega64pin

تصویر 1 – ساخت PWM با AVR

ساخت PWM با AVR، موج PWM سخت افزاری

در این قسمت به ساخت PWM با AVR با مد PWM تایمر به صورت سخت افزاری می پردازیم. برای این کار از تایمر 1 در AVR در مد PWM سریع 10 بیتی استفاده می کنیم. هر سه خروجی آن را در حالت PWM ناوارون فعال می کنیم تا بتوانیم سه موج PWM داشته باشیم. در تولید موج PWM با قابلیت سخت افزار تایمر، نیازی نیست که حتماً وقفه ای فعال شود. در این حالت شمارش از صفر شروع می شود. با رسیدن مقدار تایمر به رجیستر مقایسه و سرریز، در هر یک از خروجی ها، یک موج PWM خواهیم داشت. به این صورت که وضعیت هر یک از خروجی ها با Compare Match صفر و با سرریز، یک می شود. در اینجا تعداد 1024 پله طی می شود و دورۀ تناوب PWM خروجی، 1024 برابر دورۀ تناوب کلاک تایمر است. اگر بخواهیم به دورۀ تناوب مشخصی دست پیدا کنیم، باید تعداد پله های شمارش را تعیین کنیم. در این صورت لازم است به رجیستر TCNT1، مقداری بدهیم تا شمارش از آن مقدار شروع شود. اما برای این که همیشه TCNT1 از آن مقدار شروع به شمارش کند، نیاز است که وقفۀ سرریز فعال شود. و در روتین این وقفه، آن مقدار به رجیستر TCNT1 داده شود. بدین شکل، تایمر همواره از آن مقدار شروع به شمارش و تا سرریز، تعداد مشخصی پله را طی می کند. ما می خواهیم سه موج PWM با فرکانس 1 کیلوهرتز داشته باشیم. فرکانس کلاک تایمر را 1 مگاهرتز تعیین می کنیم تا زمان هر پله برابر 1 میکروثانیه شود. اگر مقدار TCNT1 را 24 قرار دهیم، از این مقدار تا مقدارِ TOP که 1024 است، 1000 پله طی می شود. 1000 پلۀ 1 میکروثانیه ای در مد Fast PWM، موج PWMی را با فرکانس 1 کیلوهرتز بدست می دهد.

ساخت-pwm-avr-سخت-افزاری

تصویر 2 – ساخت PWM با AVR به صورت سخت افزاری با Duty Cycleهای 25 و 50 و 75 درصد

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

در این بخش به بررسی نمونه کد PWM در نرم افزار اتمل استودیو می پردازیم. برای دست یافتن به موج PWM با فرکانس 1 کیلوهرتز، نیاز است که 1000 پلۀ 1 میکروثانیه ای طی شود. برای این که هر پله از تایمر برابر 1 میکروثانیه شود، فرکانس میکروکنترلر AVR را 8 مگاهرتز انتخاب می کنیم. سپس برای تایمر از تقسیم فرکانسی 8 استفاده می کنیم. برای این که تایمر همواره 1000 پله بشمارد، باید رجیستر TCNT1 را در وقفۀ سرریز برابر 24 قرار دهیم.

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_OVF_vect)
{
	TCNT1=0x18; // TCNT1=24
}

در تابع main پایه های PB.5 و PB.6 و PB.7 را در حالت خروجی قرار می دهیم. خروجی های PWM تایمر 1 یعنی OC1A و OC1B و OC1C به ترتیب روی این سه پایه قرار دارند. برای تنظیم این خروجی ها روی PWM ناوارون، باید بیت های COM1x1 یک  شوند. مد PWM سریع 10 بیتی نیز مد شمارۀ 7 است. برای تنظیم تایمر در این مد باید بیت های WGM12 تا WGM10 یک شوند. برای تنظیم تقسیم فرکانسی تایمر روی عدد 8، باید بیت CS11 یک شود. بنابراین، فرکانس کلاک تایمر برابر 1 مگاهرتز است. پس زمان هر پله برابر دورۀ تناوب کلاک تایمر و برابر 1 میکروثانیه است. سپس به رجیستر TCNT1 مقدار اولیه 24 می دهیم. با این تنظیمات تایمر از 24 تا 1023 می شمارد و سرریز می شود و دوباره از 24 شروع به شمارش می کند. سپس به رجیسترهای OCR1x مقدار می دهیم. در این مقداردهی از فرمول زیر استفاده می کنیم. با توجه به این که می خواهیم Duty Cycleهای 25 و 50 و 75 درصد را ایجاد کنیم، مقدار OCR1A و OCR1B و OCR1C، برابر 274 و 524 و 774 می شود.

فرمول-ocr-ساخت-pwm-avr

در نهایت وقفۀ سرریز تایمر 1 و پرچم کلی وقفه ها را فعال می کنیم.

int main(void)
{
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5);
	
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<COM1C1) | (0<<COM1C0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x18;
OCR1AH=0x01;
OCR1AL=0x12;
OCR1BH=0x02;
OCR1BL=0x0C;
OCR1CH=0x03;
OCR1CL=0x06;
	
// Timer1 Overflow Interrupt: On
TIMSK |= (1<<TOIE1);
	
sei();

while (1)
{
	// Place your code here
}
}

تصویر زیر نتیجۀ برنامۀ بالا در نرم افزار پروتئوس است.

pwm-سخت-افزاری-avr-proteus

تصویر 3 – نتیجۀ ساخت PWM با AVR با مد PWM تایمر در نرم افزار پروتئوس

نکات راه اندازی PWM با AVR به صورت سخت افزاری

در ساخت PWM با AVR با تایمرها به صورت سخت افزاری باید به نکاتی توجه کنیم.

  1. برای این که یک موج PWM در خروجی داشته باشیم، باید Compare Match اتفاق بیفتد. بنابراین مقادیر OCRnx باید حتماً در محدودۀ شمارش رجیستر TCNTn باشند.
  2. دقت Duty Cycle موج PWMبا تعداد پله های شمارش نسبت مستقیم دارد. مثلاً اگر پله های شمارش 1000 تا باشد، می توانیم Duty Cycleی با دقت 0.1 درصد داشته باشیم. مثلاً می توانیم یک PWM با Duty Cycle برابر 48.3 درصد داشته باشیم. یا اگر تعداد پله های شمارش 100 تا باشد، دقت برابر 1 درصد است.
  3. دقت انتخاب فرکانس نیز با تعداد پله های شمارش نسبت مستقیم دارد. برای کاهش فرکانس باید تعداد پله های شمارش، زیاد و برای افزایش آن باید تعداد پله ها، کم شود. وقتی تعداد پله ها زیاد باشد، با تغییر تعداد آنها، فرکانس مقدار کمی تغییر می کند. مثلاً در پروژۀ حاضر اگر تعداد پله ها 990 تا شود، فرکانس برابر 1010.1 هرتز خواهد شد. حال فرضاً تعداد کل پله ها مثلاً 10 تا پلۀ 1 میکروثانیه ای باشد. در این صورت فرکانس برابر 100 کیلوهرتز است. اگر آن را به 9 پله تغییر بدهیم، فرکانس خروجی برابر 111.1 کیلوهرتز می شود. در مثال اول، 10 پله کاهش باعث افزایش 1 درصدی فرکانس و در مثال دوم، 1 پله کاهش باعث افزایش 11.1 درصدی فرکانس می شود.
  4. با تغییر تعداد پله های شمارش می توان فرکانس موج PWM را تغییر داد. در نوشتۀ «PWM فرکانس متغیر با AVR» به این موضوع پرداخته شده است.

اگر سه موج PWM ساخته شده را به سه LED بدهیم، نتیجه همانند تصویر زیر می شود. همان طور که می بینیم، با Duty Cycleهای مختلف، شدت نور LEDها متفاوت است.

ساخت-pwm-avr-led

تصویر 4 – نتیجۀ عملی ساخت PWM با AVR به صورت سخت افزاری

ساخت PWM با AVR، موج PWM نرم افزاری

منظور ما از موج PWM نرم افزاری، استفاده از تایمرها و وقفۀ آنهاست. بدین صورت که وقفۀ سرریز و مقایسه فعال و پایه های پورت IO در آن تغییر وضعیت می دهند. در اینجا از خروجی های PWM تایمر استفاده نمی شود. مثلاً برای تولید PWM ناوارون روی PA.0، آن را در وقفۀ مقایسه، یک و در وقفۀ سرریز صفر می کنیم. سپس می توانیم با تغییر مقدار OCRn، زمان مقایسه را تغییر دهیم. بنابراین زمان تغییر وضعیت پایۀ IO، تغییر می کند. بدین شکل می توانیم یک موج PWM روی هر کدام از پایه های IO داشته باشیم. فرض کنید می خواهیم یک PWM ناوارون روی PA.0 و یک PWM وارون روی PA.1 با فرکانس 5 کیلوهرتز بسازیم. برای این کار تایمر صفر را با فرکانس 1 مگاهرتز روی مد نرمال تنظیم می کنیم. مقدار TCNT0 را 56 قرار می دهیم تا 200 پله شمارش و PWM با فرکانس 5 کیلوهرتز حاصل شود. همچنین مقدار OCR0 را 156 قرار می دهیم تا در لحظۀ اول، Duty Cycle برابر 50 درصد باشد. سپس وقفۀ سرریز و وقفۀ مقایسه را فعال می کنیم.

ASSR=0<<AS0;
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x38; // TCNT0=56
OCR0=0x9C;  // OCR0=156

TIMSK |= (1<<OCIE0) | (1<<TOIE0);

روتین های وقفۀ سرریز و مقایسه را به صورت زیر می نویسیم. در وقفۀ سرریز مقدار TCNT0 برابر 56 شده است. پس تایمر همواره 200 پله می شمارد. در این وقفه پورت A.0 را یک و پورت A.1 را صفر می کنیم. در وقفۀ مقایسه پورت A.0 را صفر و پورت A.1 را یک می کنیم. نتیجۀ این کار، موج PWM ناوارون روی PA.0 و موج PWM وارون روی PA.1 است.

ISR(TIMER0_OVF_vect)
{
	TCNT0=0x38; // TCNT0=56
	PORTA |= (1<<0);  // set PA.0 at overflow
	PORTA &=~ (1<<1); // clear PA.1 at overflow
}

ISR(TIMER0_COMP_vect)
{
	PORTA &=~ (1<<0);  // clear PA.0 at overflow
	PORTA |= (1<<1);   // set PA.1 at overflow
}

پس از تأخیری 2 ثانیه ای، در حلقۀ while مقدار OCR0 را ابتدا با تأخیر 25 میلی ثانیه افزایش و سپس کاهش می دهیم. نتیجۀ این کار، تغییر Duty Cycle دو موج PWM مطابق تصویر زیر خواهد بود.

_delay_ms(2000);	
while (1)
{
	for (counter=56; counter<254; counter++)
	{
		_delay_ms(25);
		OCR0=counter;
	}
	
	for (counter=254; counter>56; counter--)
	{
		_delay_ms(25);
		OCR0=counter;
	}
}

pwm-نرم-افزاری-متغیر-avr

تصویر 5 – نتیجۀ تولید موج PWM با AVR به صورت نرم افزاری در پروتئوس

نکات راه اندازی PWM با AVR به صورت نرم افزاری

ساخت PWM با AVR به صورت نرم افزاری نیز مانند ساخت آن به صورت سخت افزاری نکاتی دارد که باید به آنها توجه شود.

  1. نکات گفته شده برای ساخت PWM سخت افزاری در اینجا نیز صدق می کنند.
  2. موج PWM نرم افزاری می تواند با همۀ مدهای تایمر ساخته شود. کافی است وقفۀ مقایسه و سرریز فعال و پایه های IO در روتین آنها تغییر وضعیت دهند. البته ساخت PWM با AVR با مد CTC تایمرهای 8 بیتی قابل پیاده سازی نیست. زیرا سرریز در مقدار MAX و تنها در زمانی که OCR0 برابر MAX باشد، اتفاق می افتد. در مد CTC حداکثر شمارش با رجیستر OCRn تعیین می شود. و اگر هم مشکل وقفۀ سرریز وجود نداشت، با تغییر OCRn، مقدار فرکانس عوض می شد، نه مقدار Duty Cycle. این محدودیت در تایمر صفر در AVR و همچنین تایمر 2 در AVR وجود دارد. اما در تایمرهای 16 بیتی مثل تایمر 1 و 3، در مد CTC شمارۀ 4 می توان با مقایسه های B و C، دو موج PWM و در مد CTC شمارۀ 12 می توان با هر سه مقایسه، سه موج PWM داشت.
  3. تولید PWM نرم افزاری در حالت عادی توصیه نمی شود. زیرا تغییر وضعیت نرم افزاری پایه ها، آن هم به طور دائم، باعث افزایش بار پردازشی CPU می شود.

نتیجۀ ساخت PWM با AVR با وقفه های تایمر و به صورت نرم افزاری در تصویر زیر آمده است. اگر موج های PWM تصویر قبل به دو LED روی پایه های PA.0 و PA.1 داده شود، شدت نور LEDها به صورت تصویر زیر می شود.

تولید-pwm-avr-نرم-افزاری

تصویر 6 – نتیجۀ عملی تولید PWM با AVR با مد نرمال تایمر و به صورت نرم افزاری

نتایج ساخت PWM با AVR، سخت افزاری و نرم افزاری

  1. ساخت PWM در AVR و میکروکنترلرهای دیگر، به صورت سخت افزاری و نرم افزاری امکان پذیر است.
  2. PWM نرم افزاری و PWM سخت افزاری، انواع PWM در AVRو دیگر میکروکنترلرها از لحاظ به وجود آمدن با مدهای PWM یا غیر PWM هستند.
  3. منظور از PWM سخت افزاری، راه اندازی تایمر در مدهای PWM و فعال کردن خروجی(های) آن است.
  4. منظور از PWM نرم افزاری، راه اندازی تایمر و وقفه های آن و تغییر وضعیت پایه های IO در آن وقفه هاست.
  5. عوامل مؤثر در فرکانس موج PWM خروجی، فرکانس کلاک تایمر و تعداد پله های شمارش هستند.
  6. عامل مؤثر در مقدار Duty Cycle موج PWM خروجی، زمان Compare Match است.
  7. برای استفاده از خروجی های PWM تایمر در AVR، باید پایه های مربوط، با رجیستر DDR خروجی شوند.
  8. تولید موج PWM نرم افزاری با مدهای CTC تایمرهای 8 بیتی AVR، امکان پذیر نیست.
  9. ساخت PWM با کدویژن بر خلاف ساخت PWM با Atmel Studio بسیار ساده تر است. به طور کلی تنظیمات PWM در کدویژن به راحتی با کدویزارد انجام می شود. در این صورت برنامه PWM با CodeVisionAVR با چند کلیک ساخته می شود. همچنین در قسمت بالای راه اندازی تایمر در کدویژن (کدویزارد)، دورۀ تناوب آن نمایش داده می شود. بنابراین محاسبه فرکانس PWM راحت تر می شود.

نوشته های مرتبط با تولید موج PWM در وبلاگ یوبرد:

کنترل دور موتور DC با AVR

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

ساخت PWM با LPC1768



 

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

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

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

جدیدترین تاپیک های 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

10 دیدگاه ها

  1. سلام استاد اسدی وقت بخیر. آیا اصلا دلیلی وجود داره که ما از مد نرمال در تایمر کانتر برای ساخت PWM استفاده کنیم و از مد PWM استفاده نکنیم؟ مگه واحد تایمر کانتری وجود داره که مد PWM نداشته باشه؟

    پاسخ
    • سلام. این نمونه کد صرفاً جنبۀ آموزشی داره. خیلی کم پیش میاد که ما بخوایم موج PWM بسازیم و اون رو با مد نرمال تایمر بسازیم. در کل این کار صحیح نیست و نمونه کد توضیح داده شده تو این نوشته برای آشنایی بیشتر با مباحث تایمرهاست. بازم میگم در کل این کار اصولی نیست و برای استفادۀ بهینه از میکروکنترلر و کمتر شدن بار پردازشی CPU بهتره از همون مدهای PWM تایمر استفاده بشه. شاید یه کاربرد خیلی خاص به وجود بیاد که مجبور بشیم از مد نرمال تایمر برای ساخت موج PWM استفاده کنیم. مثلاٌ توی میکروکنترلرهای STM32 تایمرهای Basic رو داریم که این تایمر ها فقط میتونن سر زمان های مشخص بهمون وقفه بدن و پایۀ خروجی PWM و ورودی Capture ندارن. حالا توی میکروکنترلرهای دیگه هم ممکنه چنین تایمرهایی وجود داشته باشن. اگه بخوایم با تایمرهای Basic موج PWM بسازیم، از روش گفته شده تو این نوشته استفاده می کنیم. برای آشنایی بیشتر با تایمرهای میکروکنترلرهای STM32، به نوشتۀ «انواع تایمر کانتر در میکروکنترلرهای STM32F1» مراجعه کنید.

      پاسخ
  2. سلام. جناب مهندس چطور میشه همین کار رو انجام داد و خروجی inverting pwm بشه؟ خیلی ممنونم

    پاسخ
    • سلام. توی وقفه های تایمر به جای صفر کردن پایه اون رو 1 کنید. و هر جا 1 شده بود اون رو صفر کنید. در این صورت مد تبدیل به Inverting-PWM میشه.

      پاسخ
  3. با این روش میشه سه تا موج pwm رو روی سه تا پایه خروجی تولید کرد؟ میخوام از خروجی اون رو به سه تا فیلتر پایین گذر بدم و تبدیل به موج سینوسی سه فاز کنم. متشکرم

    پاسخ
    • سلام. شما توی وقفه های تایمر میتونید هر چند تا پایه  رو صفر و یک کنید. ولی برای تولید سینوسی سه فاز مشکلی که به وجود میاد اینه که اگه از یه وقفۀ مقایسه استفاده کنید، هر سه تا موج سینوسی با توجه به این که هر سه پایۀ خروجی با هم تغییر وضعیت میدن، بین سه موج خروجی اختلاف فازی به وجود نمیاد. در حالی که باید اختلاف فاز 120 درجه بینشون باشه. برای حل این مشکل باید از سه وقفۀ مقایسه و یه وقفۀ سرریز استفاده کنید که البته تایمرهای 1 و 3 میکروکنترلر ATmega64 و ATmega128 و… سه تا مقایسه رو دارن و میشه از اونا استفاده کرد. برای تولید موج سینوسی باید رجیسترهای مقایسه رو مطابق الگوی سینوسی مقدار دهی کنید. این مقادیر رو میشه توی یه آرایۀ 255 عضوی قرار داد. طوری که توی لحظۀ اول مقدار رجیستر مقایسۀ A برابر اولین عضو این آرایه باشه، مقدار رجیستر مقایسۀ B برابر 85امین عضو آرایه و مقدار رجیستر مقایسۀ C برابر 170امین عضو آرایه. در لحظۀ بعد مقدار رجیستر مقایسۀ A برابر دومین عضو آرایه، مقدار رجیستر مقایسۀ B برابر 86امین عضو آرایه و مقدار رجیستر مقایسۀ C برابر 171امین عضو آرایه باشه و … . در هر لحظه مقدار این رجیسترها برابر مقدار بعدی آرایه باشه. هر وقت هم مقدار بزرگتر یا مساوی 255 شد، مقدار صفرم به رجیستر داده بشه. در این صورت توی هر خروجی یه موج PWM به وجود میاد که اگه اونو فیلتر کنید خروجی یه موج سینوسی میشه. روی سه تا پایه سه تا موج سینوسی با اختلاف فاز 120 درجه به وجود میاد. برای زمان بندی مقدار دهی به این رجیسترها هم میشه از یه تایمر دیگه و وقفۀ اون استفاده کرد. تایمر 1 یا 3 که خروجی اون سه تا موج PWM هستن، وظیفۀ صفر و یک کردن سه تا پایه رو دارن و تایمر دیگه وظیفۀ زمان بندی و در نتیجه فرکانس موج سینوسی خروجی. طوری که هر چقدر زمانبندی مقداردهی به رجیسترهای مقایسۀ تایمر 1 یا 3 کوتاه تر باشه، فرکانس موج های سینوسی خروجی بیشتر میشه. البته میشه بدون این که از تایمر دیگه ای استفاده کرد، با همون تایمر 1 یا 3 هم فرکانس رو تغییر داد. برای این کار میشه از مدهای تصحیح فاز و فرکانس استفاده کرد. البته توی این حالت نمیشه موج PWM خروجی مناسب رو توی فرکانس بالا گرفت. چون تعداد پله هایی که تایمر توی فرکانس بالا طی میکنه کم میشه و دیوتی سایکل موج PWM به اون صورتی که انتظار داریم نمیتونه تغییر کنه. یعنی تغییر دیوتی سایکل با پله های بزرگتر انجام میشه و موج سینوسی خروجی دچار اعوجاج میشه. البته اگه از مدهای تصحیح فاز و فرکانس استفاده کنید باید به حداکثر مقدار اون آرایه توجه کنید که از حداکثر مقداری که تایمر میتونه بشماره بیشتر نباشه.

      پاسخ
  4. سلام بسیار عالی. خواستم تشکر کنم و بپرسم که چطور pwm رو به سینوسی تبدیل کنم؟ ممنون

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

      پاسخ
  5. سلام ممنونم از اموزشهای خوبتون ی سوال داشتم میخاستم ببینم میشه راه حلی براش پیدا کرد.
    من 3 ردیف ال ای دی rgb دارم که با attiny13 دارم موج pwm شبیه به همین پروژه بهش میدم چون میکرو 2 تا خروجی pwm داره از pwm نرم افزاری استفاده کردم. حالا مشکلی که من دارم میخام بین چندتا مدار که همه به همین شکل کار میکنن همه با هم سنکرون کار کنن البته همه جدا از هم باشن و هیچ ارتباطی بینشون نباشه فقط با وصل کردن همزمان تغذیه همه با هم سنکرون کار کنن پیشنهاد شما چیه؟ البته بگم که این کار رو کردم و سنکرون نبودن با ی تاخیر از همدیگه شروع میکنن
    پیشاپیش ممنونم از پاسختون

    پاسخ
    • سلام. خیلی ممنون. لطف دارید. فرض کنیم که سه تا موج PWM رو روی PB0 تا PB2 تولید می کنید. در این صورت اگه توی وقفه های سرریز و مقایسه به این صورت بنویسید، هر سه تا موج خروجی با هم سنکرون میشن.

      ISR(TIMER0_OVF_vect)
      {
      	TCNT0= ...
      	PORTB &=~ (1<<0) | (1<<1) | (1<<2);
      }
      
      ISR(TIMER0_COMP_vect)
      {
      	PORTB |= (1<<0) | (1<<1) | (1<<2);
      }

       

      دقت کنید که فیوزبیت های مربوط به کلاک رو همون طوری تنظیم کنید که توی برنامه تعیین کردید. مثلاً اگه توی برنامه مقدار فرکانس رو 8 مگاهرتز در نظر گرفتید، فیوزبیت ها رو هم برای 8 مگا هرتز تنظیم کنید. خواهش می کنم.

      پاسخ

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

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

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

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

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

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

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

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

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

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

شروع بازی ST

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

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

آموزش FreeRTOS یوبرد

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

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

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

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

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

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

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

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

دانلود

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

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