이것은 소프트웨어 문제입니다. 인터럽트 서비스에 너무 많은 시간을 소비하고 있으며 I2C 루틴이이를 처리 할 수 없습니다 (그렇지 않은 두 가지 사항). 나는 몇 가지 비슷한 상황을 겪었습니다.
첫째 : 인터럽트에서 가능한 한 적은 작업을 수행하고 데이터를 읽고 저장하며 ISR 외부에서 수행 할 수있는 처리를 수행하지 않으며 수학은 많은 CPU 사이클을 취할 수 있으며 CPU는 다른 작업을 수행 할 수 없습니다 그 인터럽트 중에.
둘째 : 물건을 자동화하기 위해 DMA를 조사하므로 인터럽트는 거의 배경 자동화 프로세스가됩니다.
셋째 : I2C가 중요하다면 THAT도 인터럽트에 넣지 만 우선 순위를 정하십시오.
넷째 : I2C 루틴이 실패한 이유를 해결하고, I2C 자체는 매우 간헐적 인 타이밍, 일시 정지 및 대기 등을 견딜 수 있으므로 루틴이이를 허용하도록 수정해야 할 수도 있습니다.
다섯 번째 : 인터럽트를 "체인"할 수 있는지 확인하십시오. ADC 판독을보다 효율적으로 처리하거나 인터럽트하기 전에 더 많은 작업을 수행하는 다른 모드로 ADC를 배치 할 수 있습니다 (EG는 모든 판독 값을 사용할 수있을 때까지 기다립니다. 그런 다음 8 개의 개별 ADC 채널 읽기에 대해 8 개의 개별 인터럽트가 아닌 한 번의 히트로 모두를 읽습니다).
여섯 번째 : 보드의 오실로스코프 또는 로직 분석기와 여분의 IO 핀을 사용하여 각 코드 비트에서 소비 한 시간을 추적하여 속도를 높일 수 있는지 확인하십시오. (기능 / ISR을 입력 할 때 핀을 높게 설정하고 종료시 다시 낮게 설정하십시오).
일곱째 : ADC를 너무 많이 읽어야하는지 결정하고 느리게 진행하면 상황이 악화 될까요? 반 직관적이지만 때로는 느리게 실행하면 실제로 신호를 평균화하고 스파이크 / 과도 현상을 줄여 문제를 일으키거나 제거하기 위해 추가 처리가 필요할 수 있습니다. 모터 제어 PID 루틴을 1/4의 속도로 간단히 실행하여 프로세스에서 CPU 시간을 절약함으로써 모터 제어 PID 루틴을 개선했습니다.