Jest to problem z oprogramowaniem, spędzasz zbyt dużo czasu na obsłudze przerwań, a twoja procedura I2C nie jest w stanie sobie z tym poradzić (więc to dwie rzeczy, które nie są właściwe). Przeszedłem przez kilka podobnych sytuacji.
Po pierwsze: musisz robić tak mało, jak to możliwe w przerwaniach, tylko odczytywać i przechowywać dane, nie wykonuj żadnego przetwarzania, które możesz wykonać poza ISR, matematyka może zająć DUŻO cykli procesora, a procesor nie może zrobić nic innego podczas tego przerwania.
Po drugie: Zbadaj DMA, aby zautomatyzować różne rzeczy, aby Twoje przerwania stały się prawie automatycznym procesem w tle.
Po trzecie: jeśli I2C jest ważny, włóż TO w przerwę, ale upewnij się, że wypracowałeś priorytety!
Po czwarte: dowiedz się, dlaczego zawodzi twoja procedura I2C, sam I2C może wytrzymać bardzo przerywane czasy, pauzy i oczekiwania itp., Więc twoja procedura może wymagać modyfikacji, aby na to pozwolić.
Po piąte: sprawdź, czy możesz „łączyć” przerwania, może okazać się, że możesz obsłużyć odczyty ADC bardziej wydajnie, lub przełączyć ADC w inny tryb, w którym działa on lepiej przed przerwaniem (np. Poczekaj, aż wszystkie odczyty będą dostępne, następnie czytaj wszystko za jednym razem, zamiast 8 oddzielnych przerwań dla 8 oddzielnych odczytów kanału ADC).
Po szóste: użyj oscyloskopu lub analizatora logicznego i zapasowych styków we / wy na płycie, aby prześledzić, ile czasu spędzasz w każdym fragmencie kodu, i sprawdź, czy możesz go przyspieszyć. (Ustaw wysoki pin, gdy wejdziesz do funkcji / ISR, ustaw ponownie niski przy wyjściu).
Po siódme: Zdecyduj, czy naprawdę musisz tak dużo czytać ADC, czy wolniejsze pogorszenie sytuacji? Jest to sprzeczne z intuicją, ale czasem działa wolniej, w rzeczywistości daje lepsze wyniki, wykonując pracę polegającą na uśrednieniu sygnału i zmniejszeniu skoków / stanów przejściowych, które mogą powodować problemy lub wymagać dodatkowego przetwarzania w celu usunięcia. Ulepszyliśmy procedurę PID sterowania silnikiem, po prostu uruchamiając ją o 1/4 prędkości, uwalniając obciążenie procesora podczas procesu.