Arşiv

Archive for Kasım 2011

PIC16F877 ile 8 Step Motor

14 Kasım 2011 1 yorum

PIC16F877 ile 8 unipolar step motor sürülebilir mi? Hesap edelim. Unipolar her motor 4 pinli, 8×4 den 32 I/O lazım ki PIC ile ilişkilendirebilelim. Her motora da 2 şer adet ileri geri butonu ile kontrol edersek 2×8 den 16 I/O eder. Toplamda 48 I/O. PIC16F877 de var olan pin sayısından da fazla.

Eğer 1 adet motor sürse idik, 4 pinin alacağı değerler 1000, 0100, 0010, 0001 şeklinde 4 farklı pozisyon olacaktı. Kısaca 1, 2, 3 ve 4. Bu durumu 0, 1, 2 ve 3 şeklinde yazarsak, bu sayıları 2 bitlik bir değişken olarak tanımlayabiliriz. 0 için 00, 1 için 01, 2 için 10, 3 için 11. Aslında yaptığımız iş 10 luk sistemi 2 lik sisteme çevirmekten ibaret. Dolayısı ile PIC çıkışını her bir motor için 2 bitlik düşünüp, bu 2 biti 10luk sisteme çevirdiğimizde istediğimiz olacaktır. Bu işi yapabilecek marifetli entegre ise CD4028 dir.

CD4028 çıkışlarını ise ULN2003A ile sürerek step motorlara uygulayabiliriz. 8 buton ise PIC in bir portu üzerinden tarama mantığı ile sürülmektedir.

#include <htc.h>

struct
{
union
{
unsigned char All;
struct
{
unsigned char Number1Reverse:1;
unsigned char Number1Forward:1;
unsigned char Number2Reverse:1;
unsigned char Number2Forward:1;
unsigned char Number3Reverse:1;
unsigned char Number3Forward:1;
unsigned char Number4Reverse:1;
unsigned char Number4Forward:1;
}Stepper;
}Part1;

union
{
unsigned char All;
struct
{
unsigned char Number5Reverse:1;
unsigned char Number5Forward:1;
unsigned char Number6Reverse:1;
unsigned char Number6Forward:1;
unsigned char Number7Reverse:1;
unsigned char Number7Forward:1;
unsigned char Number8Reverse:1;
unsigned char Number8Forward:1;
}Stepper;
}Part2;
}Buttons;

struct
{
union
{
unsigned char All;
struct
{
unsigned char Number1Value:2;
unsigned char Number2Value:2;
unsigned char Number3Value:2;
unsigned char Number4Value:2;
}Stepper;
}Part1;

union
{
unsigned char All;
struct
{
unsigned char Number5Value:2;
unsigned char Number6Value:2;
unsigned char Number7Value:2;
unsigned char Number8Value:2;
}Stepper;
}Part2;
}Positions;

bit bitButtonScanner;
bit bitStepperOperation;

void main(void)
{
unsigned char bSpeed;

PSPMODE=0;
TRISC=TRISD=0x00;
TRISB=0xFF;

ADCON1=0x06;
TRISA=0x38;

PORTC=0x00;
PORTD=0x00;

//Timer 0
//Freq = 15.26 Hz
T0CS = 0;
T0SE = 0;
PSA = 0;
PS2 = 1;
PS1 = 1;
PS0 = 1;
TMR0 = 0;
T0IE=1;

//Timer 2
bSpeed=(PORTA>>3)&0x07;
//Freq = 15.32 Hz
T2CON |= 120;
TMR2ON = 1;
T2CKPS1 = 1;
T2CKPS0 = 0;
PR2 = 36*bSpeed+3;
TMR2IE=1;
PEIE=1;

GIE=1;

while(1)
{
if(bitStepperOperation)
{

if(Buttons.Part1.Stepper.Number1Reverse) Positions.Part1.Stepper.Number1Value–;
if(Buttons.Part1.Stepper.Number1Forward) Positions.Part1.Stepper.Number1Value++;
if(Buttons.Part1.Stepper.Number2Reverse) Positions.Part1.Stepper.Number2Value–;
if(Buttons.Part1.Stepper.Number2Forward) Positions.Part1.Stepper.Number2Value++;
if(Buttons.Part1.Stepper.Number3Reverse) Positions.Part1.Stepper.Number3Value–;
if(Buttons.Part1.Stepper.Number3Forward) Positions.Part1.Stepper.Number3Value++;
if(Buttons.Part1.Stepper.Number4Reverse) Positions.Part1.Stepper.Number4Value–;
if(Buttons.Part1.Stepper.Number4Forward) Positions.Part1.Stepper.Number4Value++;
if(Buttons.Part2.Stepper.Number5Reverse) Positions.Part2.Stepper.Number5Value–;
if(Buttons.Part2.Stepper.Number5Forward) Positions.Part2.Stepper.Number5Value++;
if(Buttons.Part2.Stepper.Number6Reverse) Positions.Part2.Stepper.Number6Value–;
if(Buttons.Part2.Stepper.Number6Forward) Positions.Part2.Stepper.Number6Value++;
if(Buttons.Part2.Stepper.Number7Reverse) Positions.Part2.Stepper.Number7Value–;
if(Buttons.Part2.Stepper.Number7Forward) Positions.Part2.Stepper.Number7Value++;
if(Buttons.Part2.Stepper.Number8Reverse) Positions.Part2.Stepper.Number8Value–;
if(Buttons.Part2.Stepper.Number8Forward) Positions.Part2.Stepper.Number8Value++;

PORTC=Positions.Part1.All;
PORTD=Positions.Part2.All;

bitStepperOperation=0;
}
}
}

void interrupt ISR(void)
{
//Button operations
if(T0IF)
{
T0IF=0;
bitButtonScanner^=1;
if(bitButtonScanner) { Buttons.Part2.All=PORTB; RA0=1; RA1=0; }
else { Buttons.Part1.All=PORTB; RA0=0; RA1=1; }
}

//Stepper operations
if(TMR2IF)
{
TMR2IF=0;
RA2^=1;
bitStepperOperation=1;
}

}

Program oldukça basittir. Özetle; Yazılımda 2 adet timer kullanılmaktadır. Bunlardan biri buton taraması içindir diğeri ise motor adımları arasındaki süre için kullanılmaktadır. Buton taramasında her step motora ait ileri ve geri bit değişkenleri bulunmaktadır. Bu değişkenler step motorun o anki pozisyonunu belirler. Bu pozisyon değeri ileri yön için 1 artırılır geri için bir azaltılır. Her step motor kontrolü için PIC portunda 2 adet pin ayrılmıştır, buda yazılımda 2 bitlik değişkene tekabül eder. PIC portuna bağlı CD4028 entegreleri ile bu değişkenler 1 of 10 dekoder mantığı ile step motor sürme palslerine dönüşür. Yani portun 2 bitlik değişkeninin aldığı değerin onluk karşılığı 4028 in çıkış pinlerine yazılmış olur. ( 2 bitlik değer 0 ise Q0 high olur 1 ise Q1 high olur 2 ise Q2high olur 3 ise Q3 high olur ) Diğer timer step motor sürme işlemleri için kullanılır. Bu timer her kesme ürettiğinde bir biti set eder ve bu bit main döngüsünde sürekli kontrol edilerek set olduğu anda buton bilgilerine göre step motor pozisyonları ayarlanır ve son olarak bit silinir. Ayrıca donanımda kullanılan 3 dip switch motorların hız ayarları içindir ve sadece ilk enerjilendiğinde okunur.

Firmware (Farklı kaydedip dosya uzantısını .rar olarak değiştirin)

ISIS Simulasyonu (Farklı kaydedip dosya uzantısını .rar olarak değiştirin)


Kategoriler:Donanım/Yazılım Etiketler:,

Snubber Devresi Tasarımı

11 Kasım 2011 2 yorum

Şekildeki buck regülatör için snubber tasarımı şu şekilde yapılır;

Vsw noktasına osiloskop ile baktığımızda sinyalin üst kısmında spike ve ringing görürüz. Diyelim ki ringing periyotunu da 7ns olarak ölçtük. (Bu yaklaşık 143 MHz eder. Böyle bir olayı izleyebilmemiz için en az 300MHz lik dijital bir osiloskopa ihtiyacımız var) Ölçülen değerleri kaydettikten sonra Vsw noktasından şaseye (yani diyodun üzerine) bir kondansatör lehimliyoruz ve tekrar ringing periodunu ölçüyoruz. Periodun 14ns yani başlangıç değerinin 2 katı olduğu kondansatör değerini deneme yanılma ile bulmaya çalışıyoruz. Diyelim ki 330pF lik bir kondansatör ile bu değeri elde ettik.

Formülüne göre, Cext deneme yanılma ile bulduğumuz değer olmak üzere, Cs yi bulmak için bu değeri yerine yazarsak Cs=110pF olarak hesaplanır. Bulduğumuz bu değeri aşağıdaki denklemde yerine koyarsak

Ls değeri de 11.2nH olarak hesaplanacaktır.

Snubber devresinde kullanacağımız Csnub değeri, hesapladığımız Cs değerinin 5 katı veya daha fazlası olmalıdır (Csnub≥5Cs). Bu durumda 5x110pF den bu değer 550pF çıkar. Yakın ve büyük bir değer olan 560pF, snubber kapasitesi olarak kullanılabilir.

Rsnub değeri ise

formülüne göre hesaplanır. Bulduğumuz Cs ve Ls değerlerini yerlerine yazarsak, snubber direnci yaklaşık 5Ω olarak hesaplanır. Rsnub direnci gücü ise

formülüne göre hesaplanır. Burada Vp değeri direnç üzerinde ölçülen gerilimin pozitif değeri, Vn ise negatif değeridir. Bu durumda 40V giriş gerilimimiz olduğununu ve direnç üzerindeki gerilimlerin Vp=40V, Vn=20V olduğunu var sayarsak, 150kHz anahtarlama frekansı için yukarıdaki formüle göre direnç gücü, 0.084W olarak hesaplanır.

 

 

8051 ile Transistör Karakteristiği

08 Kasım 2011 Yorum bırakın
Yukarıdaki grafikte bir transistörün (BJT) ortak emetör karakteristik eğrisi görülmektedir. Kollektör – emetör gerilimine karşılık kollektör akımının bu değişiminde transistörün birinci bölge karakteristiği denir. Grafikten de anlaşılacağı üzere karakteristiğin çıkarılmasında izlenen yol; baz akımının sabit tutulup, kolektör geriliminin artırılmasından ibarettir. Farklı baz akımlarına göre bu işlemler tekrarlandığında yukarıdaki grafik elde edilir. Devrede test edilen transistörün ( DUT – Device Under Test ) ise bağlantı şekli aşağıdaki gibidir.

Transistörün baz akımı 4 bitlik bir DAC ile R34 üzerinden uygulanır. Bu andan itibaren baz akımı sabit tutulur ve R35 üzerinden verilen Vcc gerilimi, 8 bitlik başka bir DAC üzerinden 0 dan 12V a kadar 256 adımda artırılır. Her artışa denk gelen kolektör gerilimi 8 bitlik bir ADC ile ölçülür. Ölçüm sonucunda Ic elde edilir ve grafik çiziminde kullanır. Farklı baz akımları içinde bahsedilen işlemler tekrarlanır.

Baz akımının, Vcc geriliminin belirlenmesi ve kollektör geriliminin ölçülmesi 8051 tarafından kontrol edilir. 8051 Ic akımını hesaplamaz sadece ADC nin ölçüm sonucunu PC ye gönderir. Ayrıca hangi baz akımında testin başlayacağını da PC den öğrenir. Devre ilk enerjilendiğinde 8051 PC den gelecek veriyi bekler. PC den gelen veri testin hangi baz akımında yapılacağı bilgisidir. Bu bilgiyi aldıktan sonra test başlar ve 256 adımda ölçüm sonuçlarını PC ye aktarır. Daha sonraki baz akımı değeri için yeniden PC den gelecek cevabı beklemeye başlar.

PC tüm ölçüm sonuçlarını alır ve filtreler. R35 değerini PC programı bildiğinden grafik çiziminde kullanılacak olan Ic değerini hesaplar. 8051 den alınan tüm ölçüm sonuçları sayısal alarak ortanca filtresine tabi tutulur (median filter) bunun amacı ölçüm sırasında meydana gelen gürültüyü ortadan kaldırıp temiz bir grafik çizmektir.

PC, 8051 ile RS232 seri portunu kullanarak haberleşir. PC tarafında seri port COM1 olmalıdır aksi halde haberleşme ya başlamaz yada yanlış sonuçlarla grafik çizilir. Arayüz programında COM1 ile bağlantının kurulup kurulamadığı kullanıcıya bildirilir.

  • 8051 ve ADC için 5V elde edilmesi
 
 

Devrede 8051 ve ADC için 5V a ihtiyaç vardır buda 7805 ile elde edilir.

  • 8 ve 4 bitlik DAC

DAC lar devrede baz akımının ve Vcc geriliminin verilmesi gibi görevler üstlenirler. 4 bitlik DAC baz akımı, 8 bitlik DAC ise Vcc gerilimi ile ilgilenir. Tüm DAC lar 8051 tarafından yönetilir.

Yukarıda verilen şemada 4 bitlik DAC R19 R20 R21 R22 ve R27 R28 R29 R30 dirençlerinden oluşmuştur. 8051 in P1 portu lojik 1 seviyesi için internal pull up dirençleri kullandığından ( DAC doğrudan P1 çıkışlarına bağlanırsa DAC yanlış çalışacaktır! ) 4050 ile bu çıkışlar tamponlamıştır. Tampon çıkışı R-2R prensibine göre çalışan DAC yapısına aktarılır. DAC çıkışı U6A opampı ile analog olarak buffer lanır ve U6B den oluşan ve kazancı 1 olan çıkış katına aktarılır. Artık baz akımı Q1 üzerinden verilecektir.

Çalışma mantığı aynı şekilde olmak üzere 8 bitlik DAC devresi de yukarıda gösterildiği gibidir. Farklı yanı sadece DAC devresinden elde edilen gerilimin U6D opamp ı ile 2.4 katına çıkarılmasıdır. Bunun nedeni ise 0-5V arasında değişen DAC çıkış gerilimini 0-12V seviyesine yükseltmektir. Bu DAC dan Vcc gerilimi elde edilir.

  • ADC
 
ADC işlemi ADC0804 entegresi ile yapılır. Çevrim sonuçları 8051 in P0 portuna verilmiştir. Özellikle bu port giriş olarak seçilmiştir. Çünkü bu port çıkış işlemleri için open kolektör yapısındadır ve DAC lar gibi çıkış işlemleri gerektiren yapılar için uygun değildir.
  • RS232
 
8051 in RS232 işlemleri için level shifter olarak max232 kullanılmıştır.
  • Devre Şeması
 
Devre şeması yukarıdaki gibidir.
Görseller:
Delikli pertinaks üzerine kurulmuş devre
PC programının karakteristik çizimini gösterdiği an

Kaynak kodlar:

8051 programı (dosya uzantısını .rar olarak değiştirin)
Windows arayüzü (dosya uzantısını .rar olarak değiştirin)