Pic ile PCM Sinyali üretmek

Başlatan garezza, 19 Kasım 2015, 17:56:52

garezza

Pic ile (8 bit çözünürlükte) PCM sinyali üretmek istiyorum(Resimdeki gibi).
Bununla ilgili algoritma , kod, yada deneyim paylaşabilirmisiniz. Mod alarak yapmayı düşündüm ancak 1,2,3,4... gibi küçük sayılara mod alırken sıkıntı çıkmıyor ancak büyük sayılarda ciddi sıkıntı oluyor. Örneğin 255 in 128 ve sonrası bütün sayılara göre modu yanlızca 1 puls üretilmesine neden oluyor. Yardımlarınız için şimdiden teşekkürler.

pea

Eklediğiniz resimdeki şekiller PDM sinyalleri.
PCM'de değerler dikey olarak gösterilir.

PCM mi lazım, PDM mi?
PCM çıkışı için analog çıkış gerekli. Ya da PWM DAC yapabilirsiniz.

Örnek PCM: https://upload.wikimedia.org/wikipedia/commons/b/bf/Pcm.svg
Örnek PDM: https://upload.wikimedia.org/wikipedia/commons/e/e7/Pulse_density_modulation.svg

t2

#2
8 bit Wav dosyadaki data  pcm kodtur.  hardware pwm tam olarak PCM çıkış üretir. hatta bu şekilde ses çalınabiliyor.


"8 bit pwm" "ccs" diye arayalım...

garezza

Amacım resimdeki gibi sayısal değer arttıkça aynı süre içindeki darbe sayısını arttırmak. Bunu PCM olarak ifade etmemin nedeni öyle olduğunu düşünmem. Hardware PWM darbe süresini değiştirerek çalışmıyormu bu konuda eminmisiniz? Osiloskop olsaydı incelerdim.

t2

#4
Darbe süresi sabit olup, periyod icindeki darbe "sayısını" artırıp azaltmak bence pcm değildir.

Dalga genligine göre bir kod üretmek, ve bu işi periyodik yapmak, pcmdir. Aşağıdaki resimde -8..7 aralığı yerine 0...255 aralığını düşünelim. pcm budur.


Aslında pwm önererek, yanlış bilgi verdiğimi fark ettim. Pwm ters çalışır. PCM Kodları verirsin, gerilim üretir.

Size gerekli olan, periyodik olarak adc ile okuma yapmaktır. Sinyal 1khz ise 10khz 8bit adc ile okuyun. Pcm kodlar hazır.

garezza

Soruyu yanlış ifade edip kafa karışıklığı yarattığım için üzgünüm. Soruyu güncelleyeyim o zaman. Darbe süresi sabit kalmak kaydıyla aynı zaman diliminde darbe sayısını nasıl değiştirebilirim. İlk paylaştığım resimdeki şekilde.

ferit06

#6
Sizin aradığınız PDM (pulse duration modulation) (Türkçesi; Vurum Yeri Bindirmi VYB)  , V/F dönüştürücüler ile elde edebilirsiniz.
Düzeltme: PIC ile elde edeceğim demişsiniz  AD dönüşüm yapıp,  sonuca bağlı gecikme süresi kullanarak belirleyeceğiniz genişlikte bir darbe üreterek yapabilirsiniz.
( 8 bit adc : alınan sonuç 100 olsun gecikme 255-100=155,    alınan sonuç 200 olsun gecikme 255-200=55)   (gecikme birimini hesaplamak size ait)

iyildirim

Alıntı yapılan: garezza - 20 Kasım 2015, 10:05:06
Darbe süresi sabit kalmak kaydıyla aynı zaman diliminde darbe sayısını nasıl değiştirebilirim. İlk paylaştığım resimdeki şekilde.
Frekansı yani peryodu değiştirerek.
Pic de OCx vs. registerlerini sabitleyip, sadece timerX in taşma değerini değiştirerek.

garezza

Alıntı yapılan: ferit06 - 20 Kasım 2015, 12:25:52
Sizin aradığınız PDM (pulse duration modulation) (Türkçesi; Vurum Yeri Bindirmi VYB)  , V/F dönüştürücüler ile elde edebilirsiniz.
Düzeltme: PIC ile elde edeceğim demişsiniz  AD dönüşüm yapıp,  sonuca bağlı gecikme süresi kullanarak belirleyeceğiniz genişlikte bir darbe üreterek yapabilirsiniz.
( 8 bit adc : alınan sonuç 100 olsun gecikme 255-100=155,    alınan sonuç 200 olsun gecikme 255-200=55)   (gecikme birimini hesaplamak size ait)
Cevabınız için teşekkür ederim. Ancak söylediğiniz şekilde darbenin konumu değişmiş olucak benim istediğim ise darbenin sayısını artırmak. Diyelim ki benim periyodum bir saniye. Bu durumda 5 için bir saniyeye eşit bir şekilde dağılmış 5 darbe, 100 için 1 saniyeye eşit bir şekilde dağılmış 100 darbe. her iki durumdada darbe süresi ve 1 sn sabit kalacak , darbe sayısı değişecek. Darbe sayısı değiştiğinde darbelerin arasındaki sürede otomatikman değişeceğinden kafamda algoritmasını kuramadım.

mesaj birleştirme:: 20 Kasım 2015, 14:06:23

Alıntı yapılan: iyildirim - 20 Kasım 2015, 14:03:53
Pic de OCx vs. registerlerini sabitleyip, sadece timerX in taşma değerini değiştirerek.
Biraz daha detay vermen mümkün mü ?

iyildirim

Darbeyi nasıl üretiyorsun.
Donanımsal, yazılımsal, Pic nedir?


ferit06

#10
Alıntı yapılan: garezza - 20 Kasım 2015, 14:05:29
Cevabınız için teşekkür ederim. Ancak söylediğiniz şekilde darbenin konumu değişmiş olucak benim istediğim ise darbenin sayısını artırmak. Diyelim ki benim periyodum bir saniye. Bu durumda 5 için bir saniyeye eşit bir şekilde dağılmış 5 darbe, 100 için 1 saniyeye eşit bir şekilde dağılmış 100 darbe. her iki durumdada darbe süresi ve 1 sn sabit kalacak , darbe sayısı değişecek. Darbe sayısı değiştiğinde darbelerin arasındaki sürede otomatikman değişeceğinden kafamda algoritmasını kuramadım.

mesaj birleştirme:: 20 Kasım 2015, 14:06:23
Biraz daha detay vermen mümkün mü ?
Yapılacak modülasyon darbenin yerini tabiki değiştirecek. Darbenin konumunu değiştirmeden sayısını nasıl arttırabileceksiniz?

adc ile bir örnek aldınız. Hesabı yaptınız, yeni bir adc ölçüme kadar:  hesaplanan_boşluk, darbe,hesaplanan boşluk, darbe.... şeklinde sinyaliniz olacak. Dolayısı ile darbenin konumu değişecek ama süresi değişmeyecek.

ilave: Sizin darbenin yeri değişiyordaki kastınızın PCM sinyalindeki örnekleme anı(sıklığı) ile ilgili olduğunu düşünüyorum. Örnekleme sıklığı sabit kalacak.  Sabit aralıklar ile örnek alıp işlem yapacaksınız.

sadogan

Zaman dilimin süresi nedir, Darbe süresi nedir.

garezza

#12
Alıntı yapılan: sadogan - 20 Kasım 2015, 20:58:13
Zaman dilimin süresi nedir, Darbe süresi nedir.
Böyle bir işi yapabilecek mümkün olan en kısa süre(PIC16F628 için). Darbe süresi bu sürenin 255'te biri olarak ayarlamaya çalışıcam.

mesaj birleştirme:: 21 Kasım 2015, 12:27:35

Alıntı yapılan: iyildirim - 20 Kasım 2015, 14:25:33
Darbeyi nasıl üretiyorsun.
Donanımsal, yazılımsal, Pic nedir?
Yazılımsal üretiyorum.