Soru:
Donanım zamanlayıcılarını kesinti olarak ayarlarken, daha düşük bir ön ölçekleyici değeri mi yoksa daha düşük bir CTC mi tercih etmeliyim?
Roberto Santalla
2014-09-02 02:42:00 UTC
view on stackexchange narkive permalink

Şu anda Arduino'nun donanım zamanlayıcılarıyla oynuyorum ve aklıma bir soru geldi. Biraz açıklayayım.

Diyelim ki belirli bir fonksiyonun her 1024 saat işaretini çalıştırmasını istiyorum. AFAIK, Timer2 için ön ölçekleyici değeri ve onun CTC'si ile oynayarak bunu birkaç şekilde başarabilirim:

  1. Ön ölçekleyiciyi 1'e ve CTC'yi 1024'e ayarlama
  2. Ayar ön ölçekleyiciyi 8'e ve CTC'yi 128'e
  3. ...
  4. Ön ölçekleyiciyi 1024'e ve CTC'yi 1'e ayarlama

Tüm bunlar Yollar istediğimi başarırdı, ama hangisi daha verimli? Yoksa hiç önemi yok mu?

Bilginizi paylaştığınız için şimdiden teşekkürler: P

Daha büyük ön ölçekleyici değerleri, güç tüketiminde çok hafif bir düşüşe neden olacaktır, çünkü ön ölçekleyicinin çıkışına bağlı olan devre daha düşük bir frekansta değişecektir ve güç tüketimi c v ^ 2 f ile orantılıdır.
CTC bir sayı değil, sayacın çalışma modudur (mod 2). Zamanlayıcının periyodunu "OCR2A" yı ayarlayarak ayarlarsınız, gerçek periyot "(OCR2A + 1) × ön ölçekleyici" CPU döngüleri olur. Bu nedenle, ön ölçekleyiciyi 8 olarak ayarlarsanız, "OCR2A = 127" ayarlamanız gerekir.
Iki yanıtlar:
Janakiram
2014-09-02 09:11:50 UTC
view on stackexchange narkive permalink

Eğer 'saat tıklama' sayısı (burada 1024), zamanlayıcı genişliği ve kullanılan MCU saati sabitse (sabit bir değer), son seçeneği tercih etmem, yani 1024 öncesi ve CTC 1'i kullanmam. İşte nedenlerim (özellikle Arduino)

1) CTC sıfıra yakın olduğunda (1-> 10 gibi), bazen zamanlayıcı sayım sıfırmış gibi davranır ve istenen frekansın yarısı ile bir kare dalga (% 50 görev oranı ile) çıkarır. . Bu nedenle CTC'yi makul ölçüde büyük yapın. Ancak yine yüksek bir saat frekansı seçmek (skaler 1 öncesi) da doğrulukta düşüş gösterebilir. Bence bir ara seçenek daha iyidir.

2) Bir süreçte CTC sayımı dinamik olarak değiştiğinde, zamanlayıcı ön skaleri, tüm süreç boyunca CTC sayımı her zaman zamanlayıcı genişliğinden küçük veya buna eşit olacak şekilde seçilmelidir.

yani maksimum 'zamanlayıcı tıklama sayısı', verilen genişliği ile zamanlayıcı tarafından rahatça karşılanmalıdır. Burada bile aynı ikilem yine ortaya çıkıyor, o zaman 1. noktaya dayalı seçim daha iyidir.

Bu yeterli değilse, o zaman düşündüğüm tek yol her durumu fiziksel olarak uygulamak ve hangi kombinasyonun size en iyi sonuçları verdiğini kontrol etmektir. Bence pratik sonuçlar daha güvenilir (panoya özel verimli bir kombinasyon elde edebilirsiniz!)

Doğruluğu azaltabilecek düşük CTC değerleri hakkındaki yorumunuzu doğrulamak için makul bir temel neden görmüyorum. Özellikle, "bazen zamanlayıcı davranır ..." açıkça yanlıştır: AVR mimarisindeki zamanlayıcıların bu durumda neden tekrarlanabilir davranışları olmayacak?
Düşük ön skalerlerin (CTC değerleri değil) doğruluğu azaltabileceğini söyledim. Düşük CTC değerleri, zamanlayıcılardan istenmeyen çıktılar verebilir.
Burada 'Bazen', Arduino'nun 'bazı kartları' anlamına gelir. Bu kelimeyi kullandım çünkü belirli bir tahta için soru sorulmadı. 10.5 MHz zamanlayıcı frekansına sahip 'Arduino Due' zamanlayıcılarla birçok kez çalıştım ve CTC sayımını 15'ten az (veya yakın) zamanlayıcılar bana bir kare dalga verdi, bu yüzden açık bir sebep sayımın sıfır olarak alınmasıdır. Bu matematiksel değil, pratik bir gözlemdir. Dediğim gibi, sadece bir ARM olan (Arduino'da kullanılan daha az saat frekanslı AVR değil) amacım için 'Due' ile çalıştım ve bu yüzden 'bazen' kullanmak bence geçerli.
Nick Gammon
2016-01-14 16:14:34 UTC
view on stackexchange narkive permalink

Çözünürlük ve ulaşılabilir frekanslar arasında bir denge vardır. Zamanlayıcı 2'den bahsediyorsunuz, ancak Atmega328P Zamanlayıcı 2'de 8 bitlik bir zamanlayıcı olduğu için CTC'yi 1024'e ayarlayamazsınız.

16 bitlik bir zamanlayıcıdan bahsettiğimizi varsayalım, Atmega328P'deki Timer 1 gibi. Bir ön ölçekleyiciyle, (16 MHz'lik bir saat varsayıldığında) 1'den 65536'ya kadar "tik", yani 62,5 ns'den 4096 µs'ye kadar süre yapabilirsiniz.

Bu, en kesinlik olacaktır ölçüm, çünkü zamanlayıcı tıklaması başına bir (işlemci) saat tıklaması kullanıyorsunuz (bir ön ölçekleyici).

Ancak, 4.096 ms'den daha uzun bir süre için zaman planlıyorsanız, ön ölçekleyiciyi yükseltmeniz gerekir . Zamanlayıcı 1'deki bir sonraki ön ölçekleyici 8'dir, bu nedenle artık 8 kat daha uzun (32768 µs) bir aralık için zaman yapabilirsiniz ancak doğruluğunuz (kesinlik) artık 8 kat azalmıştır. Ayrıntı düzeyi Zamanlayıcının% 'si 62.5 ns'den 62.5 * 8 ns'ye yükseldi, bu da 500 ns.

32.768 ms'den daha uzun bir süreye ihtiyacınız varsa, ön ölçekleyicinin yeniden daha büyük olması gerekir, bir sonraki 64. Böylece şimdi 262144 µs'ye kadar zamanlayabilirsiniz, ancak 62,5 * 64 taneciklik, 4000 ns (4 µs).

Önerim, yapabileceğiniz en düşük ön ölçekleyiciyi kullanmak olabilir, ancak yine de istediğiniz aralığı alın. Yani açıkçası bir defaya mahsus 10 ms'lik bir ön ölçekleyici kullanamazsınız.


http://www.gammon.com.au/timers.

Bu sayfada, farklı ön ölçekleyicilerin etkilerini görselleştirmeye yardımcı olan bir tablo var:

Timers and prescalers

Üst kısım (bir adet) size her ön ölçekleyicinin ayrıntı düzeyini etkili bir şekilde verir. Örneğin, 256'lık bir ön ölçekleyicinin tanecikliği 16,000 ns'dir (16 µs). Belirli frekanslar (2'nin üsleri), kombinasyonlara (örn. 256 sayımla 1 ön ölçekleyici veya 1 sayımla 256 ön ölçekleyici) ödünç verir.

Ancak, sahip olmayan frekanslar için bu özellik, daha küçük ön ölçekleyici (eğer kullanılabilirse) daha ince bir ayrıntı verir.

Daha yüksek bir ön ölçekleyici kullanmak hiçbir hassasiyeti kaybetmez. Daha büyük ayrıntı elde edersiniz, ancak ikinin üssü olan bir döngü sayısını hedeflerseniz (soruda olduğu gibi), ayrıntı düzeyi sorun olmaz.
Ancak değilse, daha düşük ön ölçekleyici hedefe yaklaşmanıza izin verir. 30 saat döngüsünü ölçmek istediğinizi söyleyin. 1'lik bir ön ölçekleyici, 30 sayısını doğrudan girmenizi sağlar. 8'lik bir ön ölçekleyici, 30 / 8'i (3.75) kullanmanız gerektiği anlamına gelir; bu, doğrudan kayda giremezsiniz, dolayısıyla hassasiyeti kaybedersiniz.
Soru 1024 sayı ile ifade edildi, bu yüzden benim sözlerim buna uymuyor, ancak 1024'ün oldukça özel bir durum olduğu gerçeğinin açık olmaması durumunda daha genel bir cevap vermeye çalışıyordum.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...