Arduino는 입력 (아날로그 / 디지털)으로 PWM 듀티 사이클 값을 읽습니다.

와 같은 자동 조종 장치를 비교하는 중입니다. Ardupilot , CC3D , KK2.1.5 . 비교는 비행 중 제공되는 시스템 반응 / 동작에 대한 것입니다. 이를 위해 자동 조종 카드에서 PWM 듀티 사이클 (오실 라 스코프처럼 PWM 주파수는 50에서 430Hz까지 다양 할 수 있음) 값을 읽어야합니다. 일반적인 쿼드 로터에는 4 개의 명령 입력 PWM과 4 개의 esc 제어 PWM이 있습니다. 디지털 / 아날로그 입력 핀으로 8 개의 듀티 사이클 값을 읽어야합니다. 8 개의 PWM 신호의 듀티 사이클을 어떻게 측정합니까? 또한 디지털 또는 아날로그 측정이 정확하고 빠릅니까?

attachInterrupt 명령에 대한 참고 사항 : arduino.cc 에 따르면 AtMega328 시리즈에는 2 인터럽트가 있습니다. , Arduino ATmega 2560 시리즈에는 7 인터럽트가 있습니다.

Answer

질문 18183에 대한 내 답변 에 표시된 코드,“PulseIn 대신 인터럽트를 사용하여 RC 수신기 채널 읽기 ”. 그 대답에는 RC PWM의 4 개 채널을 읽는 코드가 있습니다. 8 개의 채널로 작업하도록 쉽게 조정할 수 있습니다. 선택한 핀이 변경 될 때 실행되는 ISR이 있습니다. 변경된 채널을 분류하고 변경할 때마다 micros()의 값을 저장합니다.

또한 질문 19106에 대한 내 대답 , “외부 인터럽트가”328 (Uno)에서 함께 OR “될 수 있습니까?” 그 대답에는 적절한 ISR 코드를 생성하기위한 스케치가 포함되어 있습니다. 질문 32572 , “로터리 엔코더의 방향을 감지하는 방법”에 대한 나의 답변은 다른 예를 보여줍니다.

디지털 입력, 위에서 언급 한 코드에서 사용되며 ISR에서 마이크로 초 10 마이크로 초 미만이 걸립니다. dannyf의 의견에서 언급했듯이 for 루프를 풀고 (가능한 경우) 변수 대신 상수를 사용하면 ISR 내 시간을 3.4μs로 줄일 수 있습니다. 참고, ISR 시작 및 종료 여전히 수 마이크로 초가 추가됩니다.

10 비트 아날로그 입력은 판독 당 약 104 마이크로 초가 걸리며, 이는 측정 할 일부 펄스 폭과 비슷한 시간입니다. 따라서 충분히 빠르지 않습니다. 저하 된 ADC 정확도가 허용되는 경우 microsmart.co.za의 웹 페이지 에 설명 된대로 ADC 클럭 스케일 팩터를 줄이면 AD 변환 시간을 20μs로 줄입니다. 이는 디지털 입력에 걸리는 시간의 약 3 배이므로 다소 느립니다.

댓글

  • > ISR에서 1 마이크로 초 미만이 걸리지 만 가능성은 낮습니다. 분명히 ' 당신이 어떤 코드 조각에 대해 이야기했는지 잘 모르겠습니다. 그것들은 그들 중 3 개입니다. 그러나 그것들을 인과 적으로 살펴보면 ISR의 몸체를 실행하는 데 16 틱 이상이 필요하다는 것을 암시 할 것입니다-오버 헤드를 계산하지 않습니다. 사실, 내 작은 버디는 그것이 될 것이라고 말했습니다. Uno에서 실행하려면 8us에 가까워집니다. 🙂
  • @dannyf, 작성했을 때 더 간단한 ISR (단일 인코더 계산) 중 하나를보고 있었으므로 정답을 수정해야합니다. 시간입니다. 죄송합니다!
  • 문제 없습니다. 두 가지 제안 : 1) while 루프를 풉니 다. 2) 변수보다는 상수를 사용하십시오. 또한 rcOld를 ISR 내부에서 정적으로 만들어 코드가 더 모듈화되도록합니다. 그 결과 실행 시간이 3.4us로 줄었습니다.
  • 링크 대신 코드를 공유 할 수 있습니까? 또한 AtMega328 시리즈에는 2 개의 인터럽트가 있고 Arduino ATmega 2560 시리즈에는 7 개의 인터럽트가 있습니다. 그렇다면 8 개의 동시 PWM 신호를 어떻게 측정 할 수 있습니까? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 '는 26 가지 인터럽트 벡터. 참조 된 코드에 사용 된 벡터는 핀 변경 인터럽트 또는 PCINT 용으로, 이러한 벡터 중 3 개를 사용합니다. PCINT는 ATmega328 기반 나노 핀 중 22 개에서 사용할 수 있으며 Uno '에서 유사한 숫자를 사용할 수 있습니다. 이전 질문에 표시된 코드를 참조하세요. 현재 작업 마감일이 있습니다.

답변

아날로그로 수행되는 경우 lpf를 통해 pwm을 실행하고 출력에서 adc를 수행합니다.

디지털로 수행되는 경우 타이머의 캡처 기능을 사용하거나 외부 인터럽트 / 핀 변경 인터럽트를 사용합니다. 타임베이스의 타이밍을 포착합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다