Archive

Archive for Şubat 2012

Tek katlı BJT Yükselteç Hesabı

19 Şubat 2012 Yorum bırakın

Yukarıdaki devrenin girişine makul bir işaret uyguladığımızı ve çıkışında da makul bir yükün olduğunu düşünelim. Bu durumda devrenin gerilim kazancı yaklaşık olarak

dir. Değerleri yerlerine koyarsak kazanç

çıkacaktır. Peki devrenin gerilim kazancının

olduğunu nereden bulduk?

Yukarıdaki devreyi modellersek, devrenin AC eşdeğer devresi aşağıdaki gibi olacaktır.

1 ve 2 numaralı çevreler için denklemleri yazarsak

Baz akımının kollektör akımına yaklaşık olarak eşit olduğunu var sayarsak, denklem

şeklini alacaktır. Burada hie yerine aşağıdaki eşitliği yazarsak,

ve

kabul edersek. Kazanç,

olarak bulunur.

Proteus simulasyonu (Dosya uzantısını dsn olarak değiştirin)

 

 

Multitasking 2

07 Şubat 2012 1 yorum

Daha önce yazdığım Multitasking konusunda, multitasking denilen işlemin ne demek olduğunu ve nasıl yapılabileceğini açıklamıştım. İşin özünde mikrokontrolcünün PC değerini değiştirmek ve task dan task a atlamasını sağlamak yatıyordu. Multitasking 2 konusunda ise tasklar arasındaki geçiş işlemini daha farklı bir şekilde yapacağız.

Bunun için yine bir timer kuracağız ve timer ile task sürelerini belirleyeceğiz. Her task ın kendisine ait bir sayacı olacak ve bu sayaç geri doğru sayacak. Sayaç sıfırlandığında ise task ın süresi gelmiş olacak ve task ı aktif edecek bayrağı set edeceğiz.

Bu durumda main fonksiyonu aşağıdaki gibi olacaktır.


void main(void)
{
 vInitializeTimer1();
 while(1)
 {
 //====================================================================
 if(Tasks.Task1 == TRUE)
 {
 Tasks.Task1 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task2 == TRUE)
 {
 Tasks.Task2 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task3 == TRUE)
 {
 Tasks.Task3 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task4 == TRUE)
 {
 Tasks.Task4 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task5 == TRUE)
 {
 Tasks.Task5 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 }
}

Yukarıda verilen task lar timer kesmesi içinde zamanlanır. Bu durumda timer kesmesi aşağıdaki gibi olacaktır.


#define TASK_PERIOD_TASK1 1000
#define TASK_PERIOD_TASK2 2000
#define TASK_PERIOD_TASK3 3000
#define TASK_PERIOD_TASK4 4000
#define TASK_PERIOD_TASK5 5000
void vTaskScheduler(void)
{
 if(Tasks.Task1Counter > 0) Tasks.Task1Counter--;
 if(Tasks.Task2Counter > 0) Tasks.Task2Counter--;
 if(Tasks.Task3Counter > 0) Tasks.Task3Counter--;
 if(Tasks.Task4Counter > 0) Tasks.Task4Counter--;
 if(Tasks.Task5Counter > 0) Tasks.Task5Counter--;
 if(Tasks.Task1Counter == 0)
 {
 Tasks.Task1Counter = TASK_PERIOD_TASK1;
 Tasks.Task1 = TRUE;
 }
 if(Tasks.Task2Counter == 0)
 {
 Tasks.Task2Counter = TASK_PERIOD_TASK2;
 Tasks.Task2 = TRUE;
 }
 if(Tasks.Task3Counter == 0)
 {
 Tasks.Task3Counter = TASK_PERIOD_TASK3;
 Tasks.Task3 = TRUE;
 }
 if(Tasks.Task4Counter == 0)
 {
 Tasks.Task4Counter = TASK_PERIOD_TASK4;
 Tasks.Task4 = TRUE;
 }
 if(Tasks.Task5Counter == 0)
 {
 Tasks.Task5Counter = TASK_PERIOD_TASK5;
 Tasks.Task5 = TRUE;
 }
}

void Timer1IntHandler(void)
{
 vClearTimerFlag();
 vTaskScheduler();
}

Timer kesmesinin her 1ms yede bir kez oluştuğunu düşünürsek TASK_PERIOD_TASKx değeri 1000 olduğunda x taskı her bir saniyede bir kez çalıştırılacaktır. Verilen örnekte de timer kesmesini 1ms olarak kabul edersek sırasıyla task lar 1, 2, 3, 4 ve 5 saniye de 1 kez çalıştırılacaklardır.