Bu bir yazılım sorunudur, kesintilere servis vermek için çok fazla zaman harcıyorsunuz ve I2C rutininiz bunu başaramıyor (bu yüzden doğru olmayan iki şey var). Birkaç benzer durumdan geçtim.
Birincisi: Kesintilerde mümkün olduğunca az şey yapmanız, sadece verileri okuyup saklamanız, ISR dışında yapabileceğiniz herhangi bir işlem yapmamanız gerekir, matematik çok fazla CPU döngüsü alabilir ve CPU başka bir şey yapamaz bu kesintide.
İkincisi: İşleri otomatikleştirmek için DMA'yı araştırın, böylece kesintileriniz neredeyse arka plan otomatik bir işlem haline gelir.
Üçüncüsü: I2C önemliyse, bunu da bir kesinti yapın, ancak öncelikleri çözdüğünüzden emin olun!
Dördüncü: I2C rutininizin neden başarısız olduğunu öğrenin, I2C'nin kendisi çok aralıklı zamanlamalara, duraklamalara ve beklemeye vb. Dayanabilir, böylece rutininizin buna izin vermek için değiştirilmesi gerekebilir.
Beşinci: Kesintileri "zincirleyebiliyorsanız" bakın, ADC okumalarına daha verimli bir şekilde hizmet verebileceğinizi veya ADC'yi kesintiye uğramadan önce sizin için daha fazla işe yaradığı farklı bir moda koyabileceğinizi görebilirsiniz (EG, tüm okumaların kullanılabilir olmasını bekler, ardından 8 ayrı ADC kanal okuması için 8 ayrı kesinti yerine hepsini tek bir vuruşta okuyun).
Altıncı: Her bir kod bitinde ne kadar zaman harcadığınızı izlemek ve hızlandırabileceğinizi görmek için bir osiloskop veya mantık analizörü ve yedek IO pinlerini kullanın. (Bir işleve / ISR'ye girdiğinizde pimi yüksek olarak ayarlayın, çıkışta tekrar düşük olarak ayarlayın).
Yedinci: ADC'yi gerçekten bu kadar çok okumaya ihtiyacınız olup olmadığına karar verin, yavaşlamak işleri daha da kötüleştirecek mi? Bu sezgiseldir, ancak bazen daha yavaş çalışır, aslında daha iyi sonuçlar verir, sizin için sinyalin ortalamasını alma ve sorunlara neden olabilecek veya kaldırmak için fazladan işlem gerektiren sivri / geçici kesintileri azaltır. Motor kontrol PID rutinini, sadece 1/4 hızda çalıştırarak geliştirdik, bu sayede işlemde bir miktar CPU zamanı açtık.