Arduino zaman tutmak ne kadar doğru?

Arduino'umu 16 saat ve 8 saat boyunca ışığı söndürmek için kullanmak istiyorum. Genel kodu biliyorum, sadece gecikmeleri ve röle kalkanı kodunu kullanarak. Bunun ne kadar doğru olacağını bilmek istiyorum? (İkisine de erişebildiğim için uno ve leonardo olarak etiketledim)

1
Arduino delay (), gerçekten zaman işleyişi için kullanılmaz. Tekli orta derecede kullanıyorsa, en iyi durumda saatin doğruluğuna yaklaşabilir, ancak daha uzun bir süreye kadar ekleme yapmak için tekrarlı olarak kullanmak yanlış başlangıç ​​/ bitiş hatası ve ayrıntı düzeyi birikir. Bunun yerine, tüm ilgilenilen aralık boyunca geçen toplam saat tik numarasına bakan bir şey kullanmalısınız.
katma yazar rossp, kaynak

7 cevap

Arduino'nun çoklu versiyonları ve "klonları" var ve her biri muhtemelen farklı bileşenler kullanacak. Bahsettiğiniz zaman, bu durumda "millis ()" inanıyorum ki, ana saatten (normalde 16MHz) türetilen bir zamanlayıcı kesilmesinden korunuyor.

Anakartınızdaki ana saat, çok doğru olmayan seramik bir rezonatör tarafından oluşturulmuş olabilir: yaklaşık% 0,5 -% 1 hata. Aynı zamanda% 0.001 hassasiyetle iyi kuvars kristali olabilir. Frekans kaynağındaki bu değişimler zaman içinde biraz kaymalara neden olur ... Saatinizin zaman zaman yeniden ayarlanması gerektiği gibi.

Another factor that affects accuracy, including for RTCs using a 32.768KHz crystal, is the temperature. Here an Application Note on this: http://www.st.com/content/ccc/resource/technical/document/application_note/55/e2/3d/2a/87/ab/4d/e1/CD00232494.pdf/files/CD00232494.pdf/jcr:content/translations/en.CD00232494.pdf

Uygulamanız çok fazla hassasiyet gerektirmeyebilir ve serideki her saniye zamanı basmak için basit bir çizim yazabilirsiniz ... bir saatten bir saate kadar çalışmasına izin verin ve ne kadar sürüklendiğinizi kontrol edin. Bundan sonra bir ay sonra ne kadar kayma olacağını tahmin etmek kolay olacaktır.

1
katma
Evet, haklısın, değirmencileri artırmak için küçük yük birikimli olmayacak.
katma yazar Paolo Bergantino, kaynak
yazılımınızın ek yükünün, millis() değerini artırması için hala bazı kayıplarınız var”. Hayır yapmazsın. millis() süren donanım zamanlayıcısı, yazılım timer0_millis değerini artırırken saymayı durdurmaz. Çok yanlış bir şey yapmazsanız, 1 ms'den daha uzun süreli kesintileri engellemek gibi, kristal/rezonatörün tek bir tıkanmasını kaybedemezsiniz.
katma yazar Sprogz, kaynak

Tanım olarak, Arduino kristal saat/rezonatör kadar doğrudur.

Bir Uno için bu saat yaklaşık 16mhz'de çalışıyor.

Arduino'nun iç zamanı, bu kristalin kaç kez titreştiğinin bir sayısı.

READ THIS! - these next two paragraph are apparently incorrect. See Nick Gammon's comment below.

Söz konusu kristal yaklaşık olarak aynı: https://www.sparkfun.com/products/536 - bu SparkFun'dan gelen, 50 ppm'ye kadar doğru - bu milyonda bir. Yani, eğer Arduino'nuz bu EXACT kristaline sahipse, milyonda 50 parça kaybedebilir ya da kazanabilir - bir milyon saniyede, 999.950 ile 1.000.050 saniye arasında bir yerde sayılır. Bu, günde 4.3 saniyeden veya ayda 2 dakikadan az kazanacağınız/kaybedeceğiniz anlamına gelir.   Eğer tahtanın üzerinde kristali bulursanız, kodu (muhtemelen Sparkfun için 16.000N gibi bir şey) google'a girin; Veri sayfasını bulabilirseniz, size belirli sıcaklıklarda doğruluk göstermesi gerektiğini - sıcaklık arttıkça ve aşağı indikçe hatanın da değişeceğini unutmayın.

Ayrıca, bir Arduino'nun saatinin geçici bellekte olduğunu da unutmayın - yani, Arduino'yu kapatırsanız ve tekrar açarsanız, saatin kaç olduğu hakkında hiçbir fikri yoktur - saati tekrar bağlamanız gerekir. Bir PC, ağ veya projenizdeki düğmeler/ekran aracılığıyla.

Bu konuda çalışmak için ihtiyacınıza bağlı olarak çeşitli alternatifler var: Projenizde varsa ya da bir RTC modülü kullanıyorsanız, LAN veya WIFI’den veri alabilirsiniz - bunu doğru zamana ayarlamanız gerekir. bir kere, ondan sonra hatırlayacaktır.

Alternatif olarak, ışığa bağlı bir direnç (aka fotorezistör) kullanabilir ve karanlık olduğunda otomatik olarak tetikleyebilirsiniz. Bu, başka bir nedenle, örneğin bir avantaj olabilir veya olmayabilir bir fırtına.

1
katma
@ dannyf - yayının tamamı değil, yalnızca bir paragrafı "yanlış" olarak işaretlemek için düzenlendi. Bir parça numarası belirleyemedim, bu yüzden ne kadar doğru olduğunu söyleyemem.
katma yazar Anarchofascist, kaynak
Hm, USB için doğru bir kristal varsa, bunun çıktısını AtMega328P'ye itmek tasarım anlamında olmaz mıydı? AtMega328P'nin saatli olduğunu biliyorum, 16U2'nin de saati olduğunu sanıyorum? AtMega328P modelinde kesinlikle bir saat var.
katma yazar Anarchofascist, kaynak
Bu bir sorun olur mu? Sinyal gecikmesi olmaz - iki yonga senkronize edilmez ve hiçbir şey onların olduğunu varsaymaz (tabii ki, aksi halde ayrı saatler çalışmaz). Zaman aşımı ilk çip tarafından üretildi, bu yüzden güçlü bir net sinyal olmasını beklerdim - kesinlikle birkaç cm boyunca 16 mhz sorun olmaz mıydı? Aynı zamanda bir pim tasarrufu yapacaktır (kristal iki pim gerektirdiği için).
katma yazar Anarchofascist, kaynak
Uno'nun Atmega328P'ye bağlı bir kristalinin değil, bir rezonatörü var. Tahtada gördüğünüz kristal Atmega16U2'ye (USB arayüzü) bağlı çünkü daha doğru zamanlama gerekiyor. Bir rezonatör genellikle konuşan bir kristal kadar kesin değildir.
katma yazar Nick Gammon, kaynak
Doğru. Ve iki cips de birbirine oldukça yakın. Neden bilmiyorum. Belki de onlara geldiği zaman tahtadaki diğer izlerin kaçması nedeniyle çok geç kalmıştı.
katma yazar Nick Gammon, kaynak
İlginç soru. Bunu yaparak bir ya da iki kuruş kurtarabilirlerdi. Sadece yüksek frekanslı sinyallerin tahtanın bir tarafından diğerine gitmesini engelleme arzusu varsa, bunun bir nedeni olmalı.
katma yazar Nick Gammon, kaynak
> aşağıdaki bilgiler yanlış ... Neden yanlış olduğunu söylediğinizden emin değilim. İyi kodlamada, arduino'nun uzun vadeli doğruluğunun veya diğer herhangi bir mcu'nun yalnızca osilatörün bir işlevi olduğu konusunda büyük ölçüde doğru olduğunuzu iddia ediyorum. Osilatörün bir kristal veya bir txco veya bir iç osilatör vb. olduğu gerçeği, temelde bu gerçeği değiştirmez.
katma yazar dannyf, kaynak

Çok değil.

Bu tür zamanlama için, Gerçek Zamanlı Saat (RTC) modülünü kullanarak çok daha iyi durumdasınız.

1
katma
Ne kadar uzun süre çalışırsa o kadar uzun kayar. Arduino Uno'daki osilatör (seramik) çok zayıf. Leonardo'da USB kullanması gerektiğinden daha iyi, ancak tüm delay ()/millis() olayı en iyi şekilde yanlış.
katma yazar Majenko, kaynak
Bu RTC kullanmaktan çok daha karmaşık ve pahalı.
katma yazar Majenko, kaynak
Düşünebilirsiniz, ancak tüm materyaller ve bunun için kullanılmaya başlanan eski bir ipod'um var :)
katma yazar user23282, kaynak
Tamam, onunla arayüz kurmak ve zaman kazanmak için sadece bir telefon ve başka bir kalkan kullanabilirim. Çok teşekkür ederim :)
katma yazar user23282, kaynak
Ne kadar zaman sonra olacağım? Süper hassas olması gerekmez
katma yazar user23282, kaynak

Ağustos 2013’te sıcaklık ve nem sensörünü yaptım. RTC çipini kullanıyor EBay'den satın alabileceğiniz (DS1307), 1 $ karşılığında daha az değilse satın alabilirsiniz. Batarya yedeği var (lityum hücre).

Üzerindeki saati sıfırlamayı hiç hatırlamıyorum. Şimdi yaklaşık 3 yıl sonra ve yavaş yavaş yaklaşık 11 dakika sürüyor. Bahçe ışıklarını açıp kapatmak gibi bir şey için bu kabul edilebilir bir hata olacaktır. Sıcaklığı almak için bile, bir okumayı kaydederken birkaç dakika dışarıda kalmanın bir önemi olmayacak.

Dahili saati kullanmak muhtemelen o kadar doğru olmaz, ancak bu durumda iyi olabilir. Hatalarını birikmemek için Chris Stratton'ın öneri ve kodunu takip etmenizi öneririm. Örneğin, bir saat geciktirirseniz ve sonra bir şey yaparsanız, bir sonraki gecikme süresine "bir şeyler yapın" eklenmediğinden emin olun.

Süper doğruluk istiyorsanız (duymadığınız gibi) o zaman bir GPS modülünü bağlamak, uydudan tam zamanı sorgulamanıza izin verir, bu da hatayı ihmal edilebilir miktarlarda azaltabilir. Ancak bu GPS modülleri ucuz değildir.


Dahili saati yapmaya karar verirseniz göz önünde bulundurmanız gereken bir şey: güç kesilirse ne olur? Sonra ışıkları ne zaman açıp kapatacağınız izini kaybeder. Bununla birlikte, bir saat çipinde (genellikle) bir batarya yedeği vardır ve güç tekrar açıldığında "zamanı bilir".

1
katma
EBay'e gidip satın almak ve RTC'ye gitmek isterseniz, ekstra para harcayın ve DS1307 yerine DS3231 alın. Bu, sıcaklık dengelenmiş bir osilatöre sahiptir ve bu da daha iyi doğruluk sağlar. Yılda 2 dakika, maksimum. Benim 2 yıl boyunca çalışan benim ve hala dakika doğrudur (yani 60 saniyeden daha az).
katma yazar Al., kaynak
Çok iyi bir tavsiye gibi geliyor. :)
katma yazar Nick Gammon, kaynak

RTC modülleri ve gerçek zamanlı saat yongalarının bir çeşit "yanlış" olduğunu düşünüyorum, CAN max. hızlı ileri sarma için gecikme maks. Ayda 6 saniye. Bunun gibi bir şey, bir yıl kadar önce kapı kilitleme mekanizmasıyla uğraşırken okudum.

Ama uygulama için. 8 saatte, bir arduino RTC modülünün fazlasıyla yeterli olduğunu söyleyebilirim. Sanırım, o saniye önemli değil.

1
katma

Sadece her zaman bir seçenek olduğu için ... Genellikle Arduinos'umu İnternete bir şekilde ya da başka bir şekilde bağlarım, bu yüzden saati doğru veya yeterince doğru tutmak için UTP kullanarak günde bir kez NTP sunucularından zaman alıyorum.

Bunun avantajı, güç kaybedilse bile, Arduino'dan önyükleme yaparken zaman kazanmasını istemek nispeten kolay. O zaman her zaman bilir ve her zaman tam zamanındadır.

Şifre kodunu paylaşmaktan mutluyum, ancak benimkileri UDP kütüphane örneklerinde buldum ve kendi gereksinimlerime uyarladım.

1
katma

Bunun ne kadar doğru olacağını bilmek istiyorum?

doğruluk kodlama ve donanımın bir fonksiyonudur. iyi kodlama ile, donanımınızın yapabildiği kadar hassas yapabilirsiniz.

Tco-919 yüksek hassasiyetli bir osilatör (19.2 Mhz), şartsız bir ortamda, bir ay sonra anlamlı bir zamanlama kayması olmadığını denedim.

Yani doğruluk istiyorsanız, iyi bir osilatör ile gidin.

Sadece makul bir doğruluğa önem veriyorsanız (% 1?), dahili osilatör çalışacaktır.

0
katma