Şimdi Ara

Tiny85 PWM

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
12
Cevap
0
Favori
1.172
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar,
    tiny85'de değişken pwm çıkışı nasıl yapılır ?


    frekansını ve duty oranını potansiyometre ile nasıl değiştirebilirim ?
    Bunun standart kodlarla yapılamayacağını öğrendim,
    işlemcinin datasheet dosyasını okuyarak bunu yapabilmem neredeyse imkansız,
    arduino uno'da pwm.h kütüphanesi ile, derin kodlara girmeden kolayca yapabiliyorduk
    ama bu kütüphane tiny85'de çalışmıyor, var mı yardımcı olabilecek ?
    Yada, şu dersleri öğrenirsen yaparsın diyebileceğiniz bir kaynak var mı ?
    İnternette araştırınca tccr, tccr, cs, wgm gibi özel kısaltmalarla yazılmış tuhaf kodlar görüyorum, deniyorum çalışmıyor.

    Attiny85 Datasheet



    < Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 16:9:38 >



  • Diğer işlemleri arduino fonksiyonları ile mi yapıyorsun?
    Osilatör dahili mi yoksa kristal mi? Kaç mhz?
    AnalogRead() çalışıyor mu?
  • EmuDev E kullanıcısına yanıt
    symbolcu S kullanıcısına yanıt
    symbolcü S kullanıcısına yanıt
    Dahili, default 8mhz osilatör evet analogRead çalışıyor,
    tüm işlemlerimi hep arduino fonksiyonları ile yapıyordum.

    Aslında pot kullanmamın sebebi sürecek olduğum trafonun ideal frekansını bulmak,
    arduino uno'da bunu buldum aslında, 3khz %32 duty cycle,
    işlemci değiştiği için aynı kodlar farklı frekans üretebilir diye tekrar frekans bulacaktım,
    pot bağlamadan sürekli yeni kod yazmak suretiyle de ideal frekansı bulabilirim,
    tek sorunum pwm frekansını ayarlıyamıyor olmam, duty cyccle standart kodlarla ayarlanıyor analogWrite(1, 32) diye.



    < Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 21:11:29 >
  • Saniyede 5000 defa,
    digitalWrite HIGH > delayH > girişKontrol > digitalWrite LOW > delayL > girişKontrol
    yapsa saçma mı olur ?
    bir nevi yazılımsal pwm..



    < Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 21:43:46 >
  • Yazılımsal pwm yaparsan başka işlem yapamazsın. Ayrıca hem ayarlaması zor olur hem hassas olmaz.

    Şimdi OSC 8 mhz, ihtiyaç duyulan pwm frekansı ~3 khz demişsin. Buna göre bir konfigurasyon hazırladım. Pwm çıkışı PB4 pininden alınacak. Aşağıdaki kodu setup() içine koy.

    PLLCSR = 0;
    DDRB |= _BV(4);
    GTCCR = _BV(PWM1B) | _BV(COM1B1);
    TCCR1 = _BV(CS13) | _BV(CS11) | _BV(CS10);

    --------------------------------------
    Pot ile frekans ayarlamak için analogRead() ile okuduğun değeri 4'e bölüp OCR1C register'ına yazacaksın. Bu değer ne kadar küçükse frekans o kadar yüksek olur. Duty cycle ayarı içinse analogRead() ile okuduğun başka bir pot değerini yine 4'e bölüp OCR1B register'ına yazacaksın. Bu değer OCR1C'den küçük olmalı. Eğer eşit ya da daha büyük olursa duty cycle %100 olur.

    Yukarıdaki konfigurasyona göre frekans 30 hz .. 7,8 Khz arasında olacak.
  • EmuDev E kullanıcısına yanıt
    Tekrar teşekkürler hocam, sayenizde çalıştı yine.

    Bu şekilde programlamayı öğrenmek kaçınılmaz bir son olacak gibi.
    Aynı zamanda kodları inceleyip, datasheet'ten öğrenmeye çalışıyorum da,
    *PLLCSR adrsinin 0, 1 olmasına göre, TIMER1 senkron yada asenkron olarak çalışıyormuş
    *DDRB adresi çıkış yönlendirmesi yani interrupt'ın PB4 pinine yönlendirilmesi galiba
    *GTCCR genel TIMER kontrol adresiymiş, PWM1B biti OCR1B'ye göre şekil alıp OCR1C'ye göre de sıfırlanıyormuş,
    COM1B1 biti de PB4 piniyle ilgili birşeyler yapıyor.
    *TCCR1 adresindeki CS13, CS12, CS11 ve CS10 isimli bitleri de işlemci saykıllarını bölmeye yarıyormuş,
    (siz 64'e böldünüz, ben de hepsini 1 yaparak 1024'e böldüm ve çalıştığını, sisteme bağlamadan gözle görebildim)

    Bir miktar öğrendim ama bu öğrenme tarzı ezberci öğrenim gibi oldu, hiçbirşey net değil.
    Derslerde, "yeni başlayan birine teknik kelime sunulmaması" hassasiyetine uyulmadan bodoslama anlatım yapılıyor genelde.
    Sizce daha net öğrenmek için için ne yapmalıyım ? Önerebileceğiniz bir site veya yotube dersleri olur mu ?

    Bir de siz (1 << CS13) yazmak yerine _BV(CS13) yazdınız,
    yeni öğrenen biri açısından bu çeşitlilik çok kafa karıştırıcı oluyor,
    bu şekilde farklı yazım çeşitleri çok var mı ?
  • Ben zaten 1024'e bölmüştüm. Hepsini 1 yaparsan 16384'e böler.

    O koddaki sözcüklerin hiçbiri C diline ait değil, hepsi mikrodenetleyiciye özel sembolik isimler. Amaçları kodu daha anlaşılabilir hale getirmekten ibaret. C dilindeki "macro" özelliği ile karmaşık ifadeleri daha akılda kalıcı ifadelerle değiştirmek mümkün oluyor.
    https://nongnu.org/avr-libc/user-manual/group__avr__sfr.html

    Şu linkte birkaç tanımlanmış macroya bakabilirsin. Gördüğün gibi _BV(bit) macrosu derlenmeden önce (1 << (bit)) şeklinde açılıyor. Bu hem okunabilirliği arttırır hem de bazı hataları önler.

    TCCR1 = _BV(CS13) | _BV(CS11) | _BV(CS10); ifadesini
    TCCR1 = 11;
    şeklinde yazarak ta geçebilirdik. Ama koda 3 gün sonra bakınca ne anlama geldiğini hatırlayamazdık.

    Öğrenme konusunda şunu söyleyeyim. Burada 2 ana başlık var. Birisi C prog. dili, diğeri mikrodenetleyici. Öncelikle bilgisayarda C çalışmanı tavsiye ederim. Öğrendiklerinin %99'u mikrodenetleyicilerde de geçerli olacak.
  • EmuDev E kullanıcısına yanıt
    Teşekkürler, sağolun. Ben bunu öğreneceğim, m.denetleyicin çok rahat yapabileceği şeyleri bile programlayamamak hiç hoş olmuyor benim açımdan.
  • https://murtuzayevsahil.files.wordpress.com/2013/03/c_kitap.pdf

    Bunu öneririm. Yazarı konusunda uzmandır ve C programcıları derneğinde eğitimcidir.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • EmuDev E kullanıcısına yanıt
    İndirdim okuyacağım hocam sağol.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.