راه اندازی تایمر LPC1768 و روش ساخت PWM روی پایه های IO

توسط | 2 خرداد, 1399 | lpc, میکروکنترلر, وبلاگ | 7 دیدگاه ها

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

آموزش ARM LPC یوبرد

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

آموزش های رایگان ARM LPC

فیلم های آموزش ARM LPC

آموزش خصوصی ARM LPC

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

راه اندازی تایمر LPC1768 به صورت رجیستری و ساخت موج PWM که در این نوشته بررسی می کنیم، همانند ساخت موج PWM با تایمر صفر در AVR است. در آنجا با استفاده از مد نرمال تایمر صفر، موج PWM ساختیم. به این روش که در روتین وقفۀ مقایسه و سرریز یک پایه را صفر و یک کردیم. در اینجا نیز وقفۀ تایمر صفر را فعال می کنیم و در آن پایۀ P0.21 را صفر و یک می کنیم. در این صورت یک شکل موج روی پایۀ P0.21 به وجود می آوریم. که می توانیم فرکانس و Duty Cycle آن را تغییر دهیم. در اینجا علاوه بر ساخت شکل موج PWM با Duty Cycle و فرکانس متغیر و استفاده از نمایشگر LCD کاراکتری، تایمر 1 را نیز به کار گرفته ایم. به این شکل که تایمر 1 را در مد عملیاتی کانتر فعال می کنیم و پالس روی پایۀ P0.21 را با آن می شماریم. در واقع شکل موجی را که با تایمر صفر روی پایۀ P0.21 به وجود می آید، به عنوان کلاک به ورودی تایمر 1 می دهیم.

ساخت شکل موج PWM با استفاده از روتین های وقفه و بدون استفاده از خروجی های PWM کار صحیحی نیست. چون در این روش یک موج PWM به صورت نرم افزاری ساخته ایم و صفر و 1 کردن پایۀ خروجی را به عهدۀ CPU گذاشته ایم. ساخت PWM به این روش که در این نوشته بررسی می کنیم، صرفاً جنبۀ آموزشی دارد. و قصد ما آموزش تایمر LPC1768 است. بنابراین در راه اندازی تایمر LPC1768 که در این نوشته بررسی می کنیم، از مدهای PWM استفاده نمی کنیم. آموزش PWM در LPC1768 موضوع نوشته های آینده خواهد بود. نمونه کد تایمر LPC1768 که در این نوشته بررسی می شود، در نرم افزار Keil نوشته شده و در فایل پیوست قرار دارد.

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

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

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

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

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

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

عملکرد-تایمر-صفر-1-lcd

تصویر 1 – عملکرد تایمر صفر و 1 و LCD

تشریح عملکرد برنامۀ راه اندازی تایمر LPC1768

عملکرد برنامه به این صورت است که تایمر صفر با فرکانس 40 کیلوهرتز از مقدار متغیر TcStartPoint شروع به شمارش می کند و تا مقدار رجیستر مقایسۀ MR1 می شمارد. در هنگام شمارش با مقدار رجیستر MR0 برابر می شود. در هنگام برابر شدن با مقدار MR0، وقفۀ تایمر اتفاق می افتد و پایۀ P0.21 یک می شود. پس از آن تایمر تا مقدار MR1 می شمارد و هنگام برابر شدن با مقدار MR1، وقفۀ تایمر یک بار دیگر اتفاق می افتد. این بار پایۀ P0.21 صفر می شود و مقدار متغیر TcStartPoint در رجیستر TC قرار می گیرد. مطابق پیکربندی تایمر صفر، مقدار آن پس از برابری با MR1، ریست می شود و تایمر از مقدار TcStartPoint شروع به شمارش می کند و این شمارش تا همیشه ادامه می یابد. صفر و یک شدن پایۀ P0.21 به این طریق، باعث به وجود آمدن یک موج PWM می شود. فرکانس این موج PWM با تغییر مقدار TcStartPoint و Duty Cycle آن با تغییر مقدار MR0 تغییر می کند. در حلقۀ while، شرط های if فشرده شدن کلیدهای روی پایه های P2.10 تا P2.13 را بررسی می کنند. با فشرده شدن این کلیدها مقدار دو متغیر Freq و DutyCycle تغییر می کنند. در فرمول هایی که در ادامه آورده می شوند، مقدار رجیسترهای MR0 و TC تایمر صفر با توجه به تغییرات DutyCycle و Freq تغییر می کند. بنابراین می توان فرکانس و Duty Cycle موج PWM ایجاد شده را تغییر داد. در تصویر زیر می بینیم که با تغییر مقدار MR0، مقدار Duty Cycle و با تغییر TcStartPoint مقدار فرکانس تغییر می کند. در توضیح کدهای برنامه خواهیم دید که مقدار TcStartPoint مستقیماً در رجیستر TC تایمر صفر قرار می گیرد. در تصویر زیر نتیجۀ راه اندازی تایمر LPC1768 را می بینیم که تایمر صفر و 1 فعال شده اند.

ایجاد-موج-تایمر-صفر

تصویر 2 – راه اندازی تایمر LPC1768، ایجاد موج PWM با Duty Cycle و فرکانس متغیر

عملکرد تایمر 1 و رفرش شدن LCD

موج PWM خروجی پایۀ P0.21 با استفاده از یک سیم به عنوان کلاک به تایمر 1 داده می شود. تایمر 1 در اینجا در حالت کانتر پیکر بندی شده است. با هر پنج پالس کلاک ورودی، یک واحد به مقدار تایمر 1 اضافه می شود. چرا که مقدار تقسیم فرکانسی برای تایمر 1 برابر 4 انتخاب شده است. هر بار که مقدار تایمر 1 با رجیستر مقایسۀ MR2 برابر می شود، وقفۀ آن اتفاق می افتد. در این وقفه یک واحد به متغیر LcdRefCounter اضافه می شود. در حلقۀ while یک شرط وجود دارد که مقدار این متغیر را بررسی می کند. اگر مقدار آن برابر 2 یا بیشتر از 2 شود، LCD یک بار رفرش و وضعیت پایۀ P0.18 که به یک LED متصل است، تغییر می کند. همانند تایمر صفر که در هنگام برابری با مقدار MR1 ریست می شود، تایمر 1 نیز هنگام برابری با MR2، ریست می شود. البته تایمر صفر پس از آن از مقدار TcStartPoint شروع به شمارش می کند. ولی تایمر 1 از صفر شروع به شمارش می کند. رفرش شدن LCD در اینجا بدون این که از delay استفاده کنیم، پس از گذر زمان هایی اتفاق می افتد. برای درک بهتر این موضوع تاخیر با تایمر در میکروکنترلرها را مطالعه فرمایید.

عملکرد-تایمر-کانتر-1

تصویر 3 – راه اندازی تایمر LPC1768، تایمر 1 در حالت کانتر

نحوه راه اندازی تایمر LPC1768 و ساخت موج PWM

در این بخش به بررسی نمونه کد تایمر LPC1768 و ساخت موج PWM روی یکی از پایه های خروجی میکروکنترلر می پردازیم. در نمونه کد راه اندازی تایمر LPC1768 چهار بخش کلی وجود دارد. یک بخش مربوط به راه اندازی تایمر صفر است. تایمر صفر فعال می شود و تا مقدار رجیستر مقایسۀ 1 (یعنی MR1) می شمارد. همچنین در هنگام شمارش با مقدار رجیستر مقایسۀ صفر (MR0) نیز برابر می شود. برای هر دو مقایسه، وقفۀ تایمر فعال است. هر بار که مقدار تایمر با مقدار رجیسترهای مقایسه برابر می شود، وقفه اتفاق می افتد. در این وقفه پایۀ P0.21 صفر و یک می شود. این بخش در تصویر 2 ترسیم شده است. یک بخش مربوط به راه اندازی تایمر 1 است. تایمر 1 در حالت کانتر با لبۀ بالا روندۀ پالس اعمال شده به پایۀ CAP1.0 و تقسیم فرکانسی 4 تنظیم می شود. در اینجا تایمر 1 با هر پنج پالس خروجی P0.21 یک واحد تا مقدار رجیستر مقایسۀ شمارۀ 2 می شمارد. در این هنگام وقفۀ تایمر 1 نیز اتفاق می افتد. در وقفۀ تایمر 1 به مقدار متغیر LcdRefCounter اضافه می شود. یک بخش مربوط به تغییر Duty Cycle و فرکانس موج PWM روی پایۀ P0.21 است. این بخش با خواندن پایه هایی که روی آنها کلید قرار دارد، انجام می شود. بخش دیگر نیز نمایش در LCD کاراکتری است که فرکانس و Duty Cycle موج PWM نمایش داده می شود. با هر بار برابر شدن LcdRefCounter با 2، یک بار LCD رفرش می شود و متغیر LcdRefCounter صفر می شود. که این موضوع در تصویر زیر مشخص است. در ادامه به بررسی کدهای نوشته شده می پردازیم.

شمارش-تایمر-صفر-1

تصویر 4 – شمارش تایمر صفر و 1 و تأثیر آن بر متغیر LcdRefCounter

فراخوانی کتابخانه ها و تعریف متغیرهای عمومی

در ابتدا کتابخانه های مورد نظر را فراخوانی می کنیم. کتابخانۀ Secondgpio.h دارای توابعی برای مقداردهی به رجیسترهای پورت های IO و خواندن از آنهاست. این کتابخانه دارای سه تابع است. تابع Config که برای ورودی و خروجی کردن و همچنین تعیین مد کاربری پایه های میکروکنترلر است. تابع Write که برای نوشتن روی پایه ای است که خروجی تعریف شده است. تابع Read نیز برای خواندن از پایه ای است که در حالت ورودی قرار دارد. توابع این کتابخانه در نوشتۀ راه اندازی ADC در AVR توضیح داده شده اند. کتابخانۀ delay.h دارای توابعی برای ایجاد تأخیر است. کتابخانۀ CLCD.h نیز کتابخانه ای برای نمایش در LCD کاراکتری است. دو متغیر 16 بیتی نیز تعریف شده اند. متغیر TcStartPoint برای تغییر فرکانس در راه اندازی تایمر LPC1768 است و متغیر LcdRefCounter یک شمارنده برای زمان رفرش کردن LCD است. در نوشتۀ کلاس حافظه در C و C++ و انواع متغیر در C، دلیل volatile تعریف کردن آنها گفته شده است. پروتوتایپ روتین های وقفۀ تایمر صفر و تایمر 1 نیز نوشته شده است.

#include <stdio.h>
#include "delay.h"
#include "Secondgpio.h"
#include "CLCD.h"

volatile unsigned int TcStartPoint=0 , LcdRefCounter=0;

void TIMER0_IRQHandler(void);
void TIMER1_IRQHandler(void);

 

تنظیمات اولیۀ پایه ها، راه اندازی تایمر LPC1768 و LCD

در ابتدای تابع main چند متغیر تعریف کرده ایم. آنها را در ادامه بیشتر توضیح می دهیم. پس از آن با تابع Config پایه های P0.21 و P0.18 را به صورت خروجی Push-Pull تنظیم می کنیم. در سطر بعد با مقدار دهی به رجیستر  PINSEL3، پایۀ P1.18  را در حالت کاربری CAP0.1 قرار می دهیم. با این کار، این پایه را به صورت ورودی برای تایمر صفر تعیین می کنیم. در چهار سطر بعد نیز پایه های P2.10 تا P2.13 را ورودی با مقاومت پول آپ داخلی تنظیم می کنیم.

char LcdStr[16], Counter=0;
static int Freq = 1000;
unsigned char DutyCycle=50;
	
Config (P0_21, 1, 1); // Set P0.21 As Output & Pushpull Mode
Config (P0_18, 1, 1); // Set P0.18 As Output & Pushpull Mode
	
LPC_PINCON->PINSEL3=(1<<5)|(1<<4); // Set P1.18 As CAP1.0
	
Config (P2_10, 0, 1); // Set P2.10 As Input and Pullup
Config (P2_11, 0, 1); // Set P2.11 As Input and Pullup
Config (P2_12, 0, 1); // Set P2.12 As Input and Pullup
Config (P2_13, 0, 1); // Set P2.13 As Input and Pullup

 

اتصالات-راه-اندازی-تایمر-کانتر

تصویر 5 – اتصالات لازم برای راه اندازی تایمر LPC1768 در این نوشته

در مرحلۀ بعد تقسیم فرکانسی تایمر صفر را 624، مقدار  رجیستر مقایسۀ 1 را 2000 و مقدار رجیستر مقایسۀ صفر را 1000 تنظیم می کنیم. با مقداردهی به رجیستر MCR وقفۀ تایمر صفر را برای مقایسۀ صفر و 1 فعال می کنیم. و با مقدار دهی به بیت چهارم آن، حداکثر شمارش تایمر صفر را برابر رجیستر MR1 قرار می دهیم. بنابراین تایمر حداکثر تا مقدار 2000 می شمارد. در سطر بعد با تابع NVIC EnableIRQ وقفۀ تایمر صفر را فعال می کنیم. و با مقداردهی به بیت صفرم رجیستر TCR، فرمان شروع شمارش را می دهیم.

برای تایمر 1 نیز مقدار تقسیم فرکانسی را برابر 4 و رجیستر مقایسۀ شماره 2 را برابر 1 قرار می دهیم. با مقداردهی به بیت صفرم رجیستر CTCR، تایمر 1 را کانتر با لبۀ بالا روندۀ پالس اعمالی به پایۀ CAP0.1 تنظیم می کنیم. همچنین با رجیستر MCR وقفه و ریست تایمر 1 را در مقایسۀ شمارۀ 2 تنظیم می کنیم. بنابراین تایمر 1 از صفر تا 1 می شمارد و پس از آن ریست می شود. در پایان نیز همانند تایمر صفر وقفه و شروع شمارش را فعال می کنیم. در چهار سطر بعدی نیز LCD کاراکتری را راه اندازی می کنیم و UBOARD.IR را به مدت 1 ثانیه نمایش می دهیم.

// Set and Run Timer0
LPC_TIM0->PR =  624;  // Prescaler=624 -> Timer Frequency = 40KHz
LPC_TIM0->MR0 = 1000; // Match Register 0 = 1000
LPC_TIM0->MR1 = 2000; // Match Register 0 = 2000
LPC_TIM0->MCR = (1<<4)|(1<<3)|(1<<0); // MR0 & MR1 Interrupt and MR1 Reset
NVIC_EnableIRQ( TIMER0_IRQn ); // Enable Timer0 Interrupt
LPC_TIM0->TCR = (1<<0); // Enable Counting

// Set and Run Timer1
LPC_TIM1->PR = 4; // Prescaler=4
LPC_TIM1->MR2 = 1; // Match Register 2 = 1
LPC_TIM1->CTCR = (1<<0); // Counter Mode with Rising Edge of CAP1.0
LPC_TIM1->MCR = (1<<7)|(1<<6); // MR2 Interrupt and Reset
NVIC_EnableIRQ( TIMER1_IRQn ); // Enable Timer0 Interrupt
LPC_TIM1->TCR = (1<<0); // Enable Counting

	
lcd_init(16,2); // LCD Initialization
lcd_clear();
lcd_puts("UBOARD.IR");
delay_ms(1000);
lcd_clear();

 

وقفه های تایمر، ایجاد PWM و تعیین زمان رفرش LCD

در روتین وقفۀ تایمر صفر برای تشخیص این که کدام مقایسه اتفاق افتاده از دو شرط if استفاده می کنیم. در این دو شرط بیت های صفر و 1 رجیستر IR تایمر صفر را بررسی می کنیم. اگر وقفۀ تایمر ناشی از مقایسۀ صفر باشد، پایۀ P0.21 را 1 می کنیم. و اگر ناشی از مقایسۀ 1 باشد، آن پایه را صفر می کنیم. با این روش با راه اندازی تایمر LPC1768 در مدهای غیر از PWM، یک موج PWM روی پایۀ P0.21 می سازیم.

نحوه-تولید-تایمر-صفر

تصویر 6 – راه اندازی تایمر LPC1768، وقفۀ تایمر صفر و تغییر وضعیت پایۀ P0.21

در این صورت یک موج PWM وارون روی پایۀ P0.21 شکل می گیرد. در شرط دوم علاوه بر صفر کردن P0.21، مقدار رجیستر تایمر صفر را برابر TcStartPoint قرار می دهیم. که تایمر پس از ریست شدن از آن مقدار شروع به شمارش کند. در پایان پرچم های وقفۀ تایمر صفر را برای مقایسۀ صفر و یک پاک می کنیم. در روتین وقفۀ تایمر 1 نیز یک واحد به متغیر LcdRefCounter اضافه می کنیم. سپس پرچم وقفۀ تایمر 1 را برای مقایسۀ شمارۀ 2 پاک می کنیم.

void TIMER0_IRQHandler(void)
{
	if (LPC_TIM0->IR & (1<<0)) // Check Match Channel 0 Interrupt Flag
	{
		Write(P0_21,1); // Set P0.21
	}
	else if (LPC_TIM0->IR & (1<<1)) // Check Match Channel 1 Interrupt Flag
	{
		Write(P0_21,0); // Clear P0.21
		LPC_TIM0->TC=TcStartPoint; // Set timer Value
	}
	LPC_TIM0->IR =(1<<1)|(1<<0); // Clear Interrupt Flag For Chanel 0 and 1
}

void TIMER1_IRQHandler(void)
{
	LcdRefCounter++;      // Add to LcdRefCounter
	LPC_TIM1->IR =(1<<2); // Clear Interrupt Flag For Chanel 2
}

 

کدهای حلقۀ while، تغییر مشخصات PWM و نمایش در LCD

در حلقۀ while چهار شرط برای تغییر فرکانس و Duty Cycle قرار داده ایم. در شرط اول فشرده شدن کلید روی پایۀ P2.11 بررسی می شود. اگر درست باشد، ابتدا چک می شود که Duty Cycle بزرگتر از 10 درصد باشد. اگر درست باشد، 10 واحد از مقدار Duty Cycle کم می شود. در سطر بعد رجیستر MR0 با توجه به مقدار Duty Cycle و متغیر TcStartPoint تغییر می کند. در سطر بعد یک شرط برای این که مقدار MR0 کمتر از TcStartPoint نشود قرار داده ایم. علت چنین کاری این است که اگر مقدار MR0 کمتر از TcStartPoint شود، در خروجی موج PWM نخواهیم داشت. برای درک بهتر این موضوع، در تغییر فرکانس و دیوتی سایکل PWM در AVR بخش «چگونه یک موج PWM با Duty Cycle و فرکانس متغیر بسازیم؟» را مطالعه فرمایید. در شرط دوم نیز همین عملیات را برای افزایش Duty Cycle با فشردن کلید روی پایۀ P2.12 انجام داده ایم. با این دو شرط مقدار Duty Cycle بین 10 تا 90 درصد تغییر می کند. و البته تغییر Duty Cycle روی فرکانس تأثیری نخواهد داشت.

if ( Read(P2_11) == 0 )
{
	if (DutyCycle>10)
	{
		while ( Read(P2_11) == 0 );
		DutyCycle -=10;
		LPC_TIM0->MR0 = (unsigned int)(2000 - ((DutyCycle*0.01) * (2000 - TcStartPoint)));
		if ( LPC_TIM0->MR0<=TcStartPoint )
		{
			DutyCycle +=10;
			LPC_TIM0->MR0 = (unsigned int)(2000 - ((DutyCycle*0.01) * (2000 - TcStartPoint)));
		}
	}
}
else if ( Read(P2_12) == 0 )
{
	if ( DutyCycle<90 )
	{
		while ( Read(P2_12) == 0 );
		DutyCycle +=10;
		LPC_TIM0->MR0 = (unsigned int)(2000 - ((DutyCycle*0.01) * (2000 - TcStartPoint)));
	}
}

 

تغییر-duty-cycle-تایمر

تصویر 7 – تغییرات Duty Cycle موج PWM

در دو شرط بعد مقدار فرکانس تغییر می کند. ابتدا چک می شود که فرکانس بین 100 هرتز تا 4000 هرتز باشد. سپس مقدار آن 100 واحد اضافه یا کم می شود. پس از آن متغیر TcStartPoint، رجیستر تایمر صفر (TC) و رجیستر مقایسۀ صفر آن (MR0) مقدار دهی می شوند. با این کار تغییر مقدار فرکانس تأثیری در مقدار Duty Cycle نخواهد داشت. بدین شکل با راه اندازی تایمر LPC1768 و وقفۀ آن و همچنین تغییر مقدار رجیستر TC و رجیستر MR0، یک موج PWM روی پایۀ P0.21 خواهیم داشت. برای تبدیل اعداد float به عدد int از Cast کردن استفاده کرده ایم. که این کار ممکن است باعث کم شدن دقت در ارائۀ Duty Cycle و فرکانس شود.

if ( Read(P2_13) == 0 )
{
	if ( Freq>100 )
	{
		while ( Read(P2_13) == 0 );
		Freq -=100;
		TcStartPoint= (unsigned int) (2000-(40000/Freq));
		LPC_TIM0->TC=TcStartPoint;
		LPC_TIM0->MR0 = (unsigned int)(2000 - ((DutyCycle*0.01) * (2000 - TcStartPoint)));
	}
			
}
else if ( Read(P2_10) == 0 )
{
	if ( Freq < 4000 )
	{
		while ( Read(P2_10) == 0 );
		Freq +=100;
		TcStartPoint= (unsigned int) (2000-(40000/Freq));
		LPC_TIM0->TC=TcStartPoint;
		LPC_TIM0->MR0 = (unsigned int)(2000 - ((DutyCycle*0.01) * (2000 - TcStartPoint)));
	}
}

 

تغییر-فرکانس-duty-cycle

تصویر 8 – تغییر فرکانس موج PWM و بی تأثیر بودن آن در مقدار Duty Cycle

نمایش در LCD و چشمک زدن LED روی برد

هر بار که وقفۀ تایمر 1 اتفاق می افتد، به مقدار متغیر LcdRefCounter یک واحد اضافه می شود. حال اگر مقدار این متغیر برابر یا مساوی 2 شود، LCD رفرش می شود. علاوه بر آن پایۀ P0.18 که به LED متصل است، یک بار تغییر وضعیت می دهد. هر بار که این شرط اجرا می شود، مقدار متغیر Counter چک می شود. اگر صفر باشد، پایۀ P0.18 یک و Counter برابر 1 می شود. در مرحلۀ بعد متغیر Counter برابر 1 است و شرط دوم اجرا می شود. در شرط دوم (else) پایۀ P0.18 صفر می شود و مقدار متغیر Counter به مقدار قبلی (صفر) تغییر می کند. بنابراین با هر بار رفرش شدن LCD، یک بار LED روشن یا خاموش می شود. با توجه به این که کلاک تایمر 1 همان موج PWM فرکانس متغیر روی P0.21 است، زمان رفرش شدن LCD و تغییر وضعیت P0.18 نیز ثابت نیست.

if (LcdRefCounter >= 2)
{
	LcdRefCounter=0;
	sprintf(LcdStr,"Freq= %d Hz",  Freq );
	lcd_gotoxy(0,0);
	lcd_puts(LcdStr);
	sprintf(LcdStr,"DutyCycle= %d ", DutyCycle );
	lcd_gotoxy(0,1);
	lcd_puts(LcdStr);
	if (Counter == 0)
	{
		Write(P0_18,1);
		Counter=1;
	}
	else
	{
		Write(P0_18,0);
		Counter=0;
	}
}

 

راه اندازی تایمر LPC1768 را در عمل ببینیم

در تصویر زیر هدر برد LPC1768 یوبرد را مشاهده می کنید. دو کلید برای تغییر Duty Cycle در روی برد قرار گرفته است. این دو کلید به پایه های P2.11 و P2.12 متصل هستند. دو کلید نیز برای تغییر فرکانس روی برد بورد قرار داده ایم. این دو کلید به پایه های P2.10 و P2.13 وصل هستند. همان طور که در تصویر مشخص است، پایۀ P0.21 را با استفاده از یک سیم به پایۀ P1.18 متصل کرده ایم. یک LED قرمز روی پایۀ P0.21 و یک LED سبز روی پایۀ P0.18 قرار داده ایم. همان طور که مشاهده می کنید، شدت نور LED قرمز با Duty Cycle موج PWM نسبت مستقیم دارد. LED سبز نیز با هر بار رفرش شدن LCD یک بار روشن یا خاموش می شود (وابسته به فرکانس موج PWM). در صورتی که فرکانس موج PWM را کم کنیم، چشمک زدن LED سمت چپ مشخص می شود.

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

تصویر 9 – نتیجه راه اندازی تایمر LPC1768

نتایج راه اندازی تایمر LPC1768 و تولید موج PWM

  1. ساخت موج PWM بدون استفاده از مدهای PWM تایمر و یا واحدهای سخت افزاری PWM روشی غیر اصولی است. این کار باعث افزایش بار پردازشی CPU می شود.
  2. نحوه راه اندازی واحد تایمر در LPC1768 بدین صورت است که پس از پیکربندی، باید برای شروع شمارش تایمر، بیت صفر رجیستر TCR را 1 کرد.
  3. راه اندازی PWM در LPC1768 که در این نوشته بررسی شد، با استفاده از وقفۀ تایمر صفر برای مقایسه های شمارۀ صفر و 1 انجام شده است.
  4. اگر مقدار تقسیم فرکانسی تایمر را n قرار دهیم، تعداد n+1 پالس لازم است تا یک واحد به مقدار رجیستر تایمر اضافه شود.
  5. در سورس کد تایمر میکروکنترلر LPC1768 که در این نوشته بررسی کردیم، فرکانس سیگنال روی پایۀ 18 یک بیستم فرکانس موج PWM روی پایۀ P0.21 است. این موضوع در تصویر 4 مشاهده می شود. با هر دو بار صفر شدن متغیر LcdRefCounter، یک دورۀ تناوب روی پایۀ P0.18 ایجاد می شود.
  6. تغییر Duty Cycle در فرکانس موج PWM تأثیری ندارد. ولی باید شرطی قرار داد که در تغییر Duty Cycle، مقدار MR0 کمتر از TcStartPoint نشود. زیرا در این صورت مقایسه ای انجام نمی شود، در نتیجه موج PWMی شکل نخواهد گرفت.
  7. تغییر فرکانس موج PWM باعث تغییر مقدار TcStartPoint و سپس مقدار رجیستر TC می شود. بنابراین اگر مقدار MR0 نیز با توجه به مقدار TcStartPoint تغییر نکند، Duty Cycle موج PWM تغییر می کند. برای همین پس از تغییر فرکانس، علاوه بر مقدار دهی به TC، به MR0 نیز مقدار داده ایم. این موضوع در تصویر 8 مشاهده می شود.
  8. در فرکانس های بالا چشمک زدن LEDها مشخص نمی شود. در فرکانس های بین 100 تا 500 هرتز، چشمک زدن LED سبز رنگ که به پایۀ 18 متصل است، مشخص است. که فرکانس آن یک بیستم فرکانس PWM روی P0.21 است.


 

رضا اسدی

رضا اسدی

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

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

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

جدیدترین تاپیک های ARM LPC

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

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

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

پروگرامر-j-link-میکروکنترلر-arm

پروگرامر J-Link و برنامه ریزی میکروکنترلرهای ARM

پروگرامر J-Link، پردازنده هایی که توسط J-Link پشتیبانی می شوند، انواع J-Link، ویژگی های J-Link، نرم افزار J-Flash چیست؟ پروگرام کردن STM32F1xx و LPC17xx با J-Flash و J-Flash Lite و Keil، اتصالات JTAG و SWD در J-Link، تنظیمات J-Flash و Keil برای پروگرام کردن با J-Link

رله-relay

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

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

پروتکل-i2c-protocol

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

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

7 دیدگاه ها

  1. سلام آقای اسدی. میشه لطفا درمورد میکروکنترلرهای LPC ببشتر مطلب بزارید؟ مثل اینکه جدیدا میکروکنترلرهای خیلی قوی تر از همه شرکتا زده

    پاسخ
    • سلام. بله در ادامه بیشتر در مورد میکروکنترلهای NXP مطلب قرار خواهیم داد.

      پاسخ
  2. سلام. لطفا درمورد میکروکنترلرهای LPC و کلا میکروکنترلرهای شرکت NXP بیشتر مطلب قرار بدید. اگر هم ممکنه توی یه نوشته میکروکنترلرهای شرکتهای مختلف رو مقایسه کنید. حداقل میکروکنترلرهای پرفروش دنیا.

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

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

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

      پاسخ
  4. با سلام وسپاس فراوان
    در میکروکنترلر های stm32 و lpc هاتایمر موتور ۳ فاز وجود دارد ایا میتوان در عمل بااین میکروها ومدار درایور ۶ عدد IGBT را تحریک کرد و موتور ۳ فاز را راه اندازی کرد نمونه ی از این مثال یاطریقه ی تنظیم تایمر در این مود را توضیح دهید .
    با تشکر فراوان

    پاسخ

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

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

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

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

شروع بازی ST

آموزش FreeRTOS یوبرد

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

دانلود

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

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