avatar_elektro77

4051 Kullanımı

Başlatan elektro77, 08 Mayıs 2021, 16:21:30

elektro77

Ekteki isis simülasyonunda ve aşağıdaki yazılımda 4051 entegresini giriş çoklayıcı olarak kullanıp bir ses amplifikatörünün koruma devresini tasarlamaya çalışıyorum. Şema ve devre ticari bir şemadan kısmen alıntıdır. Devredeki pic arızalanması ve firmanında artık bu cihazı üretmemesinden dolayı tamirini kendim yapmak istedim.
Devrenin şemasına göre picin giriş ve çıkış pinlerini belirleyip bir kod yazdım.
Fakat herzamanki gibi kodları çok uzattım.
Aşağıdaki yazılımda 4051 in adres pinlerini for next döngüsü ile  adreslendirip girişlerine bakıyorum. Girişlerin bazıları high ta ve bazıları ise low da olmalı. Sonra adrese göre 4051 in x pinine gelen veriyi okuyup pice gerekeni yaptırıyorum.
Sorunum şu: 4051 i adreslerken daha kısa bir yazılım olması ve daha stabil bir yazılım olması açısından for next döngüsünden başka nasıl bir yol kullanıyorsunuz?.


#config
 __Config _XT_OSC  &  _WDT_OFF &_PWRTE_OFF &_BODEN_ON &_CP_ON &_CPD_OFF &_LVP_OFF 
#ENDCONFIG
 '-------------------------------------------------------------------------------
define OSC 4
 '-------------------------------------------------------------------------------
CMCON=7               'komparatör pinleri iptal hepsi giriş çıkış yapıldı.
ADCON1=7              'ADC KANALLARI DİJİTAL YAPILDI - ADC İPTAL
OPTION_REG.7=1        'portB deki dahili PULL-UP lar iptal edildi.
 TRISA=%00000001      '4051 e giden adres pinleri çıkış, 4051 den gelen x pini ise giriş olarak ayarlandı
 TRISB=%00000000      'Portb nin tamamı çıkış olarak ayarlandı
 TRISC=%00011110      'portc deki bazı pinler giriş olarak ayarlandı
 PORTA=0
 PORTB=0
 PORTC=0
'-------------------------------------------------------------------------------
i VAR byte

symbol x = porta.0    '4051 in x pini
symbol a = porta.1    '4051 in a adres pini
symbol b = porta.2    '4051 in b adres pini
symbol c = porta.3    '4051 in c adres pini
symbol led1=portb.0
symbol led2=portb.1
symbol led3=portb.2
symbol powerled=portb.3
symbol mainrole=portb.4
symbol signalled=portb.5
symbol limitled=portb.6
symbol protectled=portb.7
symbol currsence=portc.4
'-------------------------------------------------------------------------------
pause 100
powerled=1
if currsence=1 then delay

BASLA:
if currsence=0 then protect

FOR I = 0 TO 7
PAUSE 1

IF i=0 then 
a=0:b=0:c=0  'x0 kanal 0 (DC fault sense)
    if x=1 then 
        led1=1:led2=1:led3=1
        else
        gosub protect
    ENDif
endif
'---------------------------
IF i=1 then  
a=1:b=0:c=0  'x1 kanal 1 ,şemada bu kanal kullanılmıyor.
endif
'---------------------------
IF i=2 then 
a=0:b=1:c=0  'x2 kanal 2, şemada bu kanal kullanılmıyor
endif
'---------------------------
IF i=3 then 
a=1:b=1:c=0  'x3 kanal 3 (limit sense)
    if x=0 then 
        limitled=0
        else
        limitled=1
    ENDif
endif
'---------------------------
IF i=4 then 
a=0:b=0:c=1  'x4 kanal 4 (ses signal)
    if x=0 then 
        signalled=0
        else
        signalled=1
    ENDif
endif
'----------------------------
IF i=5 then  'x5 kanal 5, şemada bu kanal kullanılmıyor 
a=1:b=0:c=1
endif
'----------------------------
IF i=6 then 
a=0:b=1:c=1  'x6 kanal 6 (ntc sens)
    if x=1 then 
        led1=1:led2=1:led3=1
        else
        gosub protect
    ENDif
endif
'-----------------------------
IF i=7 then 
a=1:b=1:c=1  'x7 kanal 7 (+HV fault sense)
    if x=0 then 
        led1=1:led2=1:led3=1
        else
        gosub protect
    ENDif
endif
'-------------
NEXT I 
'------------------------------------------------------------------------------
GOTO BASLA

protect:
led1=0:led2=0:led3=0:mainrole=0
protectled=1
stop
return

delay:
pause 2000
mainrole=1
goto basla

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Değişkene kendin değer verip sonra onun değeri 1 midir 2 midir diye sorgulamak elbette yanlış.
Burada yapılması gereken şey 4051 in adres girişlerine adres bilgisini sırası ile verip adrese göre X çıkışının ne değer aldığını test etmiş olmandır. Pin kullanımıda biraz ters olmuş.
X çıkışını PORTA.3'e bağlasan daha kolay iş yapabilirdin. Çünki FOR I=0 to 7 deyip PORTA=PORTA & %11111000+I dedinmi otomatikman 4051 i sırası ile adresleyip çıkış kontrolü yapabilirdin.
Mevcut bağlantı şekline göre ise şöyle yapman gerekecek.
a=0:b=0:c=0
IF X=1 THEN 
led1=1:led2=1:led3=1
endif

a=1:b=1:c=0
    if x=0 then 
       limitled=0
    else
       limitled=1
    ENDif
.....
....

4051 çıkışını belirli bir adrese göre test etmek için önce o adresi adres pinlerine vermen daha sonra X pininin durumuna bakman lazım. Sende buda yanlış olmuş.

Ete

elektro77

#2
Teşekkür ederim ETE Hocam;
Haklısınız for next kullanımım bilgisizce ve fuzuli olmuş.
X çıkışını ise dediğiniz port noktasına almam çok uğraştırır keza hazır bir devre, ben sadece bozulan pici ve yazılımı uyarlamaya çalışıyorum.
Pin kullanımını ise nasıl düzelteceğimi de pek anlayamadım. Ama sorgu başlarına a=x:b=x:c=x yerine c=x:b=x:a=x şeklinde yazsam sorun çözülür galiba.
Yazılım simülasyonda gayet hızlı çalışıyor gerçek devrede henüz denemedim.
4 mhz de Tarama hızı sorun yaratır mı bilmiyorum? Pause veya delay komutlarıyla yavaşlatmam gerekebilir mi bilmiyorum?
Tekrar teşekkür ederim.
Bir sorunla karşılaşırsam tekrar bilginize başvururum Hocam. Sizi özlemişim bu arada :)

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#3
Başlangıçta dijital giriş olarak ayarladığımız porta.0 ı kod aralarında tekrar adc ye çevirip 4051 in bazı kanallarında adc ölçüp tekrar dijital girişe çevirebiliyormuyuz? Bunu nasıl yaparız Hocam?
Örneğin 4051 x4 girişinde 0....+300mVdc arası analog bir ses sinyalim var. Lojik değil yani.
4051 tam bu x4 kanalında iken yazılımda nasıl adc ölçüp,200mV larda, çıkıştaki sinyal ledin i yaktırabilirim.
Sonrasında 4051 diğer kanallarında porta.0 yine dijtal giriş olarak ayarlanacak.
Yada böyle yapmak yerine porta.0 ı hep analog giriş olarak ayarlayıp lojik seviyelere analog olarak mı baksak.?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bir işlemcinin uygun olan pinlerini hem digital hem analog olarak kullanmak mümkün elbette. Bunun için epeyce atraksiyon gerekiyor pek tavsiye edeceğim bir yöntem değil. Yine herzaman olduğu gibi sınırları zorlama peşindesin. Her neyse,
Bir pin hem digital hem analog olabiliyor ise, işlemciye göre bu pini değişik zamanlarda hem analaog her digital kullanmanın yolu data sheete gre ayarlanmalı.
Bir pinin analog olması için, o pinin önce giriş olarak ayarlanması gerekiyor. Ardından işlemcide var ise ANSEL registerinde ilgili pine denk gelen bit HIGH yapılmalı. Böylece o pin analog olarak çalışır. Ansel yok ise bu durumde genelde ADCON1 registerinin data sheet de verilen analog ayarlama tablosuna göre değer verilerek pin analog yapılabilir. AYnı pini digital giriş yapmak için ise yanlızca analog özelleğini kapatmak yeterli olacaktır.

Sorduğun soru çok açık değil. 4051 üzerinden sorduğuna göre X ucunun bağlı olduğu pini hem digital hemde analog kullanmak istiyorsun diye varsayıyorum. Böylece 4 cü uç için giriş seçme değeri ABC girişlerine %011 değerinin verilmesi ile olacaktır. Zira %000 verildiğinde birinci uç, %001 verildiğinde ikinci uç ve %011 verildiğinde ise 4 nolu uç X çıkışına bağlanmış olur. Böylece 4 nolu uçtaki analog bilgi X ucuna aktarılmış olacak ve sende X ucunu analog yaparak o uçtan analog ölçüm alabileceksin demektir.

Ete

elektro77

#5
Hocam bir sorunum kaldı;
Aşağıdaki şemadaki devrenin girişine, gerçekte 0...625mVAC 60hz sinüs ses sinyali uyguladığımda pic tarafında adc ölçümü alamıyorum ve ledi yaktıramıyorum. Diyeceksiniz ki adc sinüs sinyali ölçmez.
Evet ölçmez. Adc girişinde  en fazla sinüsün tepeden tepeye belirsiz bir değer oluşur.
Fakat bu amfinin üreticileri bunu yapmışlar. Nasıl yapmış olabilirler hocam?
codlarım ise aşaıdaki şekilde:
PORTA=%1000
'c=1:b=0:a=0  'x4 kanal 4 (ses signal)
PAUSE 5
ADCIN 0,x
    if x>0 then 'x4 adresinde x değeri 0 volttan büyükse (if x>0 then :bu kodla bile led yanmıyor)
        signalled=1
        else
        signalled=0
    ENDif


"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

AC sinyal ADC olarak ölçülebilir. Ama usulüne uygun ölçülmelidir. AC sinyal bir X-Y ekseni üzerinde görüntülendiği zaman sinyalin bir noktada X eksenini kesip Y ekseninin pozitif tarafında yükseldiği ve sonra tepe noktasına ulaştığını ve o noktadan sonra düşerek yeniden X eksenini kesip bu seferde Y ekseninin negatif tarafında aşağı düşüp en alt noktaya geldikten sonra yeniden yükselişe geçtiğini gözlemlersin. Sonuçta X exsenini kesen noktada veya ona yakın bölgelere denk gelen ADC ölçümleri hep sıfır olarak okunur.
Bu durumda yapılması gereken şey şu olmalı. Öncelikle Sıfır noktası dediğimiz X eksenini kesen nokta bulunup o noktadan sonra ufak bir gecikme vererek ardından diğer sıfır noktasına kadar olan süre boyunca bir çok ölçüm almak ve bunların ortalamasını alarak doğru ölçüm sonucuna ulaşmak gerekir. sinyal frekansı 60 HZ ise iki sıfır noktası arasındaki peryot 1000/60=16,6 ms ye denk gelir Teorik olarak sıfır noktasını geçer geçmez 100 us bekleyim ölçüm almaya başlamalı ve her 100 us de bir ölçüm almalısın. Bunuda 16ms (16000 us) boyunca sürdürmelisin. Bunu yapmanın en iyi yolu sıfır geçiş kesmesi kullanmak. Kesme olur olmaz 100 us gecikme koyup ölçüm almaya başlamak ve her ölçüm arasına 100us gecikme koyarak bu işi yapmak en uygun yol. Bir konu daha var. 0-625 mV demek maksimum voltajın 0,625V olacağı anlamına gelir. Şayet referans voltajını 5V verirsen bu voltajı bence doğru dürüst okuyamazsın. Bana göre referans voltajın 1,024V olmalı ki okuduğun değerler bir anlam kazansın. Bu amaçla dahaili ref voltajı olan bir işlemci kullanman ve kendi ref voltajını üretip bunu ADC için referans volatjı olarak kullanman gerekir. Bilemiyorum bu kadar karmaşık bir konuyu aşabilecekmisin. Önemli olan sıfır geçişide yakalamak bu kadar düşük bir voltajın sıfır geçişini yakalamak da zor olacak ilave devreler kullanmak ve o voltajı kuvvetlendirmek bence en doğrusu. Adamların neyi nasıl yaptığını bilemem. Yaptılar diyorsun ama nasıl yaptıklarını bilmeden yaptılar demekde yanlış olur. Devrenin tamamına hakimmisin değilmisi bilemiyorum çünki az çok devreden ne yapıldığı anlaşılması gerekir.

Ete

elektro77

#7
Devrenin tam şeması ektedir. Hakim olduğumu düşünüyorum. Orjinal şemada Pic16F870 kullanılmış. Ben ise 16F876 ile devrenin bir çok kısmını çalıştırdım.Ayrıca bir  ref voltaj pini kullanılmamış.
sorunum Sadece ses sinyal ledini amfiye uygulanan sese göre yan sön yapamıyorum.Ek bilgi olarak bu bir subbus amfi, 30 ila 100Hz sesleri verebiliyor. yani 0 geçisini yakalasak bile sabit bir frekans olmadığı için tepeyi okuyacağımız gecikmeyi ayarlayabilirmiyiz bilmiyorum.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bu şema ile o dediğin işler bana kalırsa yapılmaz. Adamların farklı bir mantığı olsa gerek.
Anlamak için 4051 in uçlarına giren bu sinyallerin skop görüntülerine bakmak gerekir. Genlik ve sinyal şekli kullanılacak mantık için önemli bence.
Sinyal Geliş yeri olarak Audio Filter denilmiş. O kısmın ayrı bir şeması mı var acaba?

Ete

elektro77

#9
eke daha kapsamlı bir şema ekledim. Dediğiniz audio filter devresi de bu ekte var.
Skop görüntüsü ise bildiğimiz tam sinüs ve %50 duty ile max 625mVAC.
Sinyali sinyal jeneratörü ile veriyorum...
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Dikkatli bakınca 4051 in 4 nolu ucuna giren hattın isimlendirilmesi  LIM_ON (Limitter ON) şeklinde yapılmış iken aynı uç aşağıda PEAK_ON olarak isimlendirilmiş ve bu uç diğer sayfada yer alan NE5517 nin OUT_B pininden çıkmaktadır.
O entegre nedir bilemiyorum. Şemada bir kusur var gibi geliyor bana. Anlamadım.
Ete

elektro77

Alıntı yapılan: ete - 10 Mayıs 2021, 15:53:12Dikkatli bakınca 4051 in 4 nolu ucuna giren hattın isimlendirilmesi  LIM_ON (Limitter ON) şeklinde yapılmış iken aynı uç aşağıda PEAK_ON olarak isimlendirilmiş ve bu uç diğer sayfada yer alan NE5517 nin OUT_B pininden çıkmaktadır.
O entegre nedir bilemiyorum. Şemada bir kusur var gibi geliyor bana. Anlamadım.
Ete

isimler her sayfada değişmiş. Evet şemanın kusuru bu. Fakat aslolanın signal ucuna sinüs bir sinyalin girmesi ve bu sinyalin 30....100Hz arası %50 duty si olan 0....625mVac bir sinyal olmasıdır. Bu sinyal de picte adc olarak okunup sinyal ledinin yan sön şeklinde çalıştırılmasıdır.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bana bu durum pek mantıklı gelmiyor. Bu kadar düşük bir voltajın (yaklaşık 0,6V) ve üstelik de sinüs şeklindeki bir sinyalin Analog olarak okunması hiç mantıklı değil. Sinyal kuvvetli olsa yine bir sonuç alınabilir. Ancak sinyal seviyesi konusunda kararlısın. Bu bir preanfi sonuçta. Ölçüm noktasıda preanfinin son çıkış noktası. Neden orada 0,6V olsunki daha fazla olamazmı ve zaten daha fazla olduğu bir anı yakalamak olmasın amaç. Her neyse benim bilgim bundan ötesini kurcalamaya yetmiyor maalesef.

Ete

elektro77

#13
Alıntı yapılan: ete - 11 Mayıs 2021, 10:12:38Bana bu durum pek mantıklı gelmiyor. Bu kadar düşük bir voltajın (yaklaşık 0,6V) ve üstelik de sinüs şeklindeki bir sinyalin Analog olarak okunması hiç mantıklı değil. Sinyal kuvvetli olsa yine bir sonuç alınabilir. Ancak sinyal seviyesi konusunda kararlısın. Bu bir preanfi sonuçta. Ölçüm noktasıda preanfinin son çıkış noktası. Neden orada 0,6V olsunki daha fazla olamazmı ve zaten daha fazla olduğu bir anı yakalamak olmasın amaç. Her neyse benim bilgim bundan ötesini kurcalamaya yetmiyor maalesef.

Ete
Ben sinyal seviyesinden eminim hocam. Çünkü cihaz normal olarak çalışıyor. dB hesabına göre de orada en fazla 0.6vac görmem gerekiyor. Hatta 0.5vac. Bunun üzerinde gelen voltajlarda cihazın pic ten bağımsız çalışan peak ledi alarm vermeye başlıyor.
Peki hocam sinyal hattı üzerindeki 4051 e giden,  +5V a ve gnd ye çekilmiş olan bav99 diyotlarının amacı ne sizce?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Aşırı peakleri anında söndürmek için olsa gerek.

Ete

Powered by EzPortal