50hz kare dalga tesbiti

Başlatan sezer, 24 Mart 2024, 20:27:47

sezer

Öncelikle herkese hayırlı günler
Orjinal bir cihazın üzerindeki pic için bir program yazmaya çalışıyorum. Öncelikle belirtmem gerekli ki devre üzerinde değişiklik yapmadan sadece pic için kod yazacağım. Kodun bütün kısımlarını i2c iletişim ve komut gönderimini hallettim. Son bir sıkıntım kaldı ve bunu bir türlü aşamadım. Şuan telefondan giriş yaptığım için şemanın ayrıntılarını patlaşamıyorummpc ye geçince paylaşırım.

220v ac hattına 47k direnç ve tek bir diyotla doğrultma yapılarak optokuplör e giriliyor optonun bir çıkışı gnd hattında  diğer çıkışı 10nf ile gnd 10k ile pullup 3.3v hattına bağlı. Scope ile ölçümde ac var ise optonun çıkışında kare dalga var.

Yapmak istediğim şey eğer pb5 pininde kare dalga var ise pb4 pini 2000ms delay ile low a çekilecek. Kare dalga gittiği anda pb4 pini high a çekilerek çıkışlar mute a alınacak. Bu fonksiyon abir amfi katının koruması için kullanılıyor. Bir kaç farklı kod ile deneme yaptım ama bir türlü verim alamadım. Bazı denediğim kodlarda enerji kesilmesinden 2 sn sonra işlevini yaptı.

Bu arada ac kesildiğinde pic in pininde 3.3v var ac var ile kare dalga olduğu için 1.8v civarında bir voltaj var hızlı olması için adc den voltaj ölçtürerek yapmayı da denedim başarılı olamadım.

True döngüsünün içinde sinyal ve peak ledlerini yakmayı yarayan kod döngüsü ile mute döngüsü var. Sinyal ve peak kısmı sorunsuz çalışırken mute kısmı çalışmadığı için enerji kesildiğinde ses gelmeye devam ediyor voltaj boşalırkende çatlama sesi geliyor.

Bana 30-60hz arasında kare dalga var ise fonksiyon çalışsın yoksa çalışmasın tarzında basit bir kod verebilir misiniz.

alisumer

#1
Alıntı yapılan: sezer - 24 Mart 2024, 20:27:47"220v ac hattına 47k direnç ve tek bir diyotla doğrultma yapılarak optokuplör e giriliyor optonun bir çıkışı gnd hattında  diğer çıkışı 10nf ile gnd 10k ile pullup 3.3v hattına bağlı. Scope ile ölçümde ac var ise optonun çıkışında kare dalga var."
burada pullup yaptığın için yarım doğrulltuğun ac sinyalin tersini alıyorsun optonun çıkışından.yani ac sinyalin kesilince opto çıkışın sürekli 3.3 volt verecek.yapmak istediğini tam bilmiyorum ama eğer elektrik kesilmesi ile ilgili bir kontrol sağlıyorsan zaten sadece çıkışı kontrol edip bunu sağlayabilirsin illede pulse yakalamana gerek yok.
program olmadan zor ama sanki
 "kare dalga var ise pb4 pini 2000ms delay ile low a çekilecek."
ile
"kodlarda enerji kesilmesinden 2 sn sonra işlevini yaptı."
arasında bir bağlantı olabilirmi.


Hep meraktan

ete

senin 47K ve seri diyot sistemin PortB5 pininde frekans olduğu müddetçe kesme yaratmak için kullanılmış. Bu kesme düşen kenar kesmesi. Şimdi 30-60 hz frekans aralığında bu sistem frekans olduğu müddetçe min 16ms de bir maksimum 33 ms de bir kesme yaratır. Maksimumu esas alırsak ve her kesme oluştuğunda timer1 sayacını sıfırlarsak bu sayac frekans olduğu müddetçe hiç bir aman taşma kesmesi yaratamaz. Bu durumda timer1 sayacını 35ms ye için kurar isen sistemin hazır demektir.
Mantık şöyle. Frekans olduğu müddetçe Timer1 kesmesi olmayacaktır. O halde ilk frekans kesmesi oluştuğunda PORTB.4 pinine bakarsın. low değil ise 2000 ms bekleyip LOW yaparsın yada LOW yapıp 2000 ms beklersin farketmez.
Daha sonra frekans olduğu müddetçe PORTB.4 sürekli low da kalacağı için bir işlem gerektirmeyecektir.
Ama frekans kesildiğinde 35 ms sonra Timer1 kesmesi devreye girecek ve PORTB.4 deki LOW kaldırılıp başka ne yapılacak ise yapılacaktır. Timer1 sayacının illaki kesmeye bağlanmasıda gerekmez. Ana program içinden PIR1.0 register biti bu sayacın kesma bayrağıdır. Onu kontrol ederekde istediklerini yaptırabilirsin.
Basit bir program aslında.
Bu sitede genelde hazır kod vermeyiz. Sen başla yapmaya çalış yapamazsan yaptıklarını bir görüp gereken yardımı yaparız.

Ete

sezer

bu kod ile proteus simulasyonunda kısmen çalıştı ama led çıkışında kapatıp açma görünüyor simulasyon kaynaklı olabilir diye düşünüyorum.

tek düzeltmem gereken yer true döngüsünün içine  sadece ac kesildiği zaman kapatma komutunu eklemem gerekiyor.

#include <16F689.h>
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOPUT,NOMCLR
#use delay(clock=8000000)

#define LED PIN_C0
#define SIGNAL_INPUT PIN_B5
#define TIMER_DELAY 35 

int1 timer_flag = FALSE;

#int_TIMER1
void TIMER1_isr() {
   timer_flag = TRUE; 
}

void main() {
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(0); 
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   output_low(LED); 
   output_low(SIGNAL_INPUT);

   while(TRUE) {
      if(!input(SIGNAL_INPUT)) { 
         delay_ms(TIMER_DELAY); 
         if(timer_flag) {
            output_high(LED); 
            delay_ms(2000); 
            output_low(LED);
            timer_flag = FALSE;
         }
      }
   }
}

ete

Program mantığını iyi anladığını sanmıyorum.
 output_high(LED); 
komutu vererek ledi yakıyorsun
delay_ms(2000); 
   2000ms bekliyorsun nedenini bilmiyorum!!!!
output_low(LED); sonra ledi söndürüyorsun. Neye dayanarak sönüyor oda belli değil.

Led'in kapatılması yalnızca Timer1 kesmesi meydana gelince olmalı.

Ben Basic de kesme kısmını aşağıdaki şekilde yazardım.

KESME:
IF FLAG_DEGISIK=1 THEN  'PortB değişiklik kesmesi meydana gelmiş ise yani frekans var ise
   TMR1L=$4F:TMR1H=$77  'Frekans olduğu müddetçe TMR1 ön yükleme değeri yeniden veriliyor
   FLAG_DEGISIK=0       'kesme bayrağını sıfırladık
   LED=0                'led söndürüldü  
ENDIF

IF FLAG_TIMER1=1 THEN   'Timer1 kesmesi meydana gelmiş ise
   LED=1                'led yakıldı
   FLAG_TIMER1=0        'bayrak sıfırlandı
   TMR1L=$4F:TMR1H=$77  'önyükleme değeri yeniden verildi
ENDIF
RESUME
ENABLE
BU olabilecek en basit hali. Kodu incelersen frekans geldiği müddetçe led sönük kalacak ve Timer sayac ön yükleme değeri hep yenilenecek. Böylece hiç bir zaman Timer kesmesi meydana gelemeyecek.
Ama frekans kesilirse TMR1 kesmesi meydana gelip led yakılacak.35 ms lik süre sayımı için ön yükleme değeri verilecek.

İşin püf noktası elbette kesme içindeki işlemler. Kod anlaşılsın diye sembolik isimler kullandım FLAG_DEGISIK değişiklik kesme bayrağını temsil ediyor.
FLAG_TIMER1  TMR1 kesme bayrağını temsil ediyor.

C dilini bu yüzden sevemiyorum bir türlü. Her şeyi kendi ayarlıyor diyorlar bu bir kolaylık belki ama bu şekil bir programda TMR1 e önyükleme değerini nasıl vereceksin belki vardır bir yolu ama ben pek aşina değilim bilmiyorum. Programa bakınca kim ne yapıyor bir bakışta anlayamıyorsun yazdığın kodda olduğu gibi. Yapılmış bir şeyler ama mantıksal çözüm yapamıyorum ben.
Her neyse işin temelini açıkladım. Bu açıklamaya uygun hale getirilmeli o kod.
Her iki kesme açılıyor. TMR1 sayacı saymaya başlıyor kese oluşturmasına az bir şey kala port değişiklik kesmesi meydana geldiği için ön yükleme değeri tekrar başa alınıyor ve sayma bir yerde yeniden başlıyor ve bu şekilde devam edildiği durumda Timer kesmesi meyadana gelemiyor.
Olay budur.

Ete

ete

Bahsini ettiğim basit kodu yazdım ve denedim senin şemen üzerinde. Kusursuz çalışıyor.
Sende deneyebilirsin dosyalar aşağıda.

Ete

sezer

ilginiz için teşekkür ederim hocam. benim ufaklık rahatsızlandı gece gece hastahaneye götür getir iş güç derken bakamadım.
yazdığınız kod simulasyonda çalışıyor dediğiniz gibi bu kodu şimdi ccs ye uyarlamam ve ana koduma entegre etmem gerekiyor.
işin açıkcası pic programlama ile çok fazla haşır neşir değilim. arduino ide üzerinden avr  ve stm ile daha çok ilgiliyim kütüphane bulmak daha kolay olduğu için.

yukarda 2000ms delayı sormuşsunuz bu kod parçası bir amfinin ilk start anında gecikmeli başlayıp enerji kesildiğinde mute geçmesi amacıyla kullanılacak. orjinal bir devrenin parçası olması devre üzerinde değişiklik yapamamam bazı kısıtlamalara sebep oluyor.

kodun devamını da pbp da bakayım dedim program baya eski olduğu için bulamadım. birde i2c pbp da nasıl kullanılıyor araştırmam gerekecek

elektro77

#7
Alıntı yapılan: sezer - 29 Mart 2024, 04:00:58ilginiz için teşekkür ederim hocam. benim ufaklık rahatsızlandı gece gece hastahaneye götür getir iş güç derken bakamadım.
yazdığınız kod simulasyonda çalışıyor dediğiniz gibi bu kodu şimdi ccs ye uyarlamam ve ana koduma entegre etmem gerekiyor.
işin açıkcası pic programlama ile çok fazla haşır neşir değilim. arduino ide üzerinden avr  ve stm ile daha çok ilgiliyim kütüphane bulmak daha kolay olduğu için.

yukarda 2000ms delayı sormuşsunuz bu kod parçası bir amfinin ilk start anında gecikmeli başlayıp enerji kesildiğinde mute geçmesi amacıyla kullanılacak. orjinal bir devrenin parçası olması devre üzerinde değişiklik yapamamam bazı kısıtlamalara sebep oluyor.

kodun devamını da pbp da bakayım dedim program baya eski olduğu için bulamadım. birde i2c pbp da nasıl kullanılıyor araştırmam gerekecek
Merhabalar;
Bu konu ile bende ilgilendim. Daha önce de RCF marka bir aktif subbus a kod yazdım ve çalıştırdım.
Sizin uğraştığınız amplifikatörün markası da RCF mi. RCF ise hangi modeli?
"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"

sezer

#8
rcf 700 serileri ve pascal modüller için hocam.bütün işlevleri hallettim tek bu sıkıntım kalmıştı.

elektro77

Alıntı yapılan: sezer - 31 Mart 2024, 00:02:32rcf 700 serileri ve pascal modüller için hocam.bütün işlevleri hallettim tek bu sıkıntım kalmıştı.
Benim kod yazdığım subbass ta 12c iletişim yoktu ve pic ise f876 idi. pic ile bir 4051 anahatarları arasında adc okunuyordu.
689 lu bir cihazda var rcf hdl20. ama adau1701 ile f689 arasındaki 12c iletişimi çözememiştim. Bu konuda ben sizden bilgi almak isterim.
"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"

sezer

hocam adau ile iletişim kısmı en kolayı pic i ı2c master olarak atayıp  selfboot ve reset pinlerini belli süre içinde high ya çekerseniz adau epromdan okuma yapıyor. iş bundan sonra başlıyor aslında okuduğu eprom dosyasında ses kapalı geliyor sesi aç komutunu vermeniz gerekiyor

elektro77

Alıntı yapılan: sezer - 31 Mart 2024, 00:26:59hocam adau ile iletişim kısmı en kolayı pic i ı2c master olarak atayıp  selfboot ve reset pinlerini belli süre içinde high ya çekerseniz adau epromdan okuma yapıyor. iş bundan sonra başlıyor aslında okuduğu eprom dosyasında ses kapalı geliyor sesi aç komutunu vermeniz gerekiyor
örnek bir c kodu verebilir misin?
"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"

sezer

#12
kodu tamamlarsam sana atayım hocam sadece ete hocamın verdiği kodu ccs ye çevirip eklemem gerekiyor.
ortalama 5-10 kadar komut var tek sıkıntı burada komutları bulmaktı. komutlar sigma studioda hazırlanan dsp çizimine dayanıyor orjinal dsp çizimi olmadığı için bulmam biraz zor oldu. birde her 5 sn de bir pic dsp ye ping atıyor

şuan ac sens kısmını eklemesem de  cihaz çalışıyor ses alabiliyorum sadece enerji kesintisinde mute a almadığı için bir çat sesi geliyor

elektro77

Alıntı yapılan: sezer - 31 Mart 2024, 00:36:31kodu tamamlarsam sana atayım hocam sadece ete hocamın verdiği kodu ccs ye çevirip eklemem gerekiyor.
ortalama 5-10 kadar komut var tek sıkıntı burada komutları bulmaktı. komutlar sigma studioda hazırlanan dsp çizimine dayanıyor orjinal dsp çizimi olmadığı için bulmam biraz zor oldu. birde her 5 sn de bir pic dsp ye ping atıyor

şuan ac sens kısmını eklemesem de  cihaz çalışıyor ses alabiliyorum sadece enerji kesintisinde mute a almadığı için bir çat sesi geliyor
İşi bayağı bayağı çözmüşe benziyorsun. Evet enerji kesildiğinde mıte yapmaz ise blokların deşarjı çıkışa dc verip ses olarak yansır.
Bana 12c konusunda yardımcı olmanı dilerim. arşılığında sana fayda sağlamaya çalışırım. Arşivim geniştir.
"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"

sezer

elimden gelen birşey varsa yardımcı olmaya çalışırımö hocam dosyalarım işyerindeki pc imde ben sana start için gerekli olan ı2c komutlarını sırasına göre atarım.

bir konuda yardıma ihtiyacım var ama baya büyük bir düşünce bir dsp katı tasarlamayı düşünüyorum stm32 yada esp32 ile  dspmin konfigürasyon ayarlarını pc üzerinden  uart yada wifi ile ayarlamak istiyorum.

örnek olursa sigma studioda hazırladığım dsp programını göre sigma studio olmadan dspnin gain delay crossover eq limiter compresor ayarlarını yapıp eproma kaydetmesini istiyorum. pc ye pyton da program yazmayı bilmediğim için büyük ihtimalle esp ye yönelip webserver ile bu işi halletmeyi deneyeceğim. büyük ihtimal kodu arduino ide üzerinden yazarım ki hali hazırda sigmadsp kütüphanesi mevcut.

uzun zamandır amfi tasarımı smps tasarımı çizimi yapıyorum birkaç numune pcb ürettirdim uzak doğudan. tek eksik kaldığım kısım dsp kısmı. aslında dsp için ısı korumasından voltaj ölçümüne kadar herşeyi hazırladığım sigma studio kodum var. ama iş ticariye dönerse imalatçıya bir program sağlamam gerekecek.

neyse biraz karışık oldu sanırım :)

Powered by EzPortal