답변:
제안한 바와 같이 알렉스 전관 상기 WiringPi의 라이브러리는 두 모델에 따라 하나 또는 두 개의 GPIO 핀에 하드웨어 PWM 출력 지원 나타나는 소프트웨어 PWM을 다른 GPIO 핀에 임의. 한편 RPIO.PWM 라이브러리 는 GPIO 핀에서 DMA로 PWM 을 수행합니다. 사실상 이것은 하드웨어와 소프트웨어 PWM 사이의 중간에 있으며 WiringPi의 소프트웨어 PWM을 통해 100µs에 비해 1µs 타이밍 분해능을 제공합니다 [1] .
이 중 어느 것이 어플리케이션에 적합한지는 필요한 PWM 출력 수와 해당 출력에서 원하는 성능에 따라 다릅니다.
응용 프로그램이 낮은 타이밍 해상도와 높은 지터 를 허용 하는 경우 소프트웨어 또는 DMA 지원 타이밍 루프를 사용할 수 있습니다. 높은 정밀도 / 낮은 지터 PWM을 원하면 하드웨어 지원이 필요할 수 있습니다.
부드러운 실시간 응답 요구 사항으로 사람이 볼 수있는 케이던스 (10Hz)가 다른 LED를 플래시하려는 경우 소프트웨어 루프는 GPIO 핀만큼 많은 PWM을 처리 할 수 있습니다.
실시간 응답 요구 사항 이 까다로운 서보 모터를 제어 하려면 하드웨어 PWM을 사용해야합니다. 그럼에도 불구하고 인코더 입력을 PWM 출력에 연결하는 서보 루프에 대한 실시간 응답을 보장하는 데 문제가있을 수 있습니다.
안정적인 서보 루프 는 일정한 속도 (낮은 지터)로 엔코더를 읽고, 수정 된 PWM 출력 값을 일정한 속도로 작성해야하며, 이들 사이의 대기 시간은 고정되어야합니다 (전체적으로 낮은 지터). 이 작업을 수행 할 수 없으면 부하 상태에서 모터가 불안정 해지는 것을 방지하기 위해 모터를 튜닝 (소프트 튜닝)해야합니다. 이는 낮은 수준의 지원이없는 멀티 태스킹 운영 체제와는 관련이 없습니다.
하드웨어 PWM 출력보다 더 많은 서보 루프를 실행해야하는 경우 하드 실시간 성능을 보장하기 위해 다른 장치로 이들을 오프로드해야하므로 Raspberry Pi를 소프트 실시간 관리자로 강등시킬 수 있습니다 .
한 가지 옵션은 Adafruit 16 채널 12 비트 PWM / 서보 드라이버-I²C 인터페이스-PCA9685 와 같은 것으로, I²C 버스를 위해 GPIO 핀 몇 개만으로 16 개의 PWM 출력을 제어 할 수 있습니다. 사용 예는 Raspberry Pi 포럼 의 I²C 16 채널 PWM / 서보 브레이크 아웃-작업 게시물을 확인하십시오.
1. 제안에 대한 dm76 덕분에 헤더 는 RPIO.PWM이 더 이상 최신 파이 모델에서 작동하지 않을 수 있다고 말합니다.
예, Raspberry Pi에는 P1-12 (GPIO18)에 연결된 하나의 하드웨어 PWM 출력이 있습니다. 또한 I²C 또는 SPI 인터페이스를 사용하여 PWM 출력을 추가 할 수 있습니다 . 어떤 사람들은 이것으로 성공했습니다 ( 포럼 게시물 ).
WiringPi 라이브러리 를 사용하여 PWM 핀을 제어 할 수 있습니다 . 전체 라이브러리를 포함하지 않도록 코드를 볼 수 있습니다.
Linux는 실시간 운영 체제가 아니므로 Raspberry Pi는 심각한 소프트웨어 PWM에는 적합하지 않습니다.
최근 Pis에는 두 개의 하드웨어 PWM 채널이 있습니다. 또한 하드웨어 타이밍 PWM 펄스는 40 핀 확장 헤더에 연결된 모든 GPIO에서 독립적으로 생성 될 수 있습니다.
실제로 이것은 두 개의 매우 정확한 PWM 채널이 있으며 다른 모든 GPIO는 Arduino 스타일 PWM (800Hz, 0 꺼짐-255 완전 켜짐)을 가질 수 있음을 의미합니다.
실시간 OS는 아니지만 Raspberry Pi 용 RISC OS 는 협력적인 멀티 태스킹이므로 CPU가 100 % 인 응용 프로그램을 쉽게 실행하여 타이밍을 훨씬 잘 관리 할 수 있습니다. 자신의 코드 이외의 다른 작업은 기대하지 마십시오.
"매우 효율적 : CPU를 사용하지 않고 매우 안정적인 펄스를 제공한다"고 주장하는 이 라이브러리 ( pi-blaster )를 발견했습니다 .
아직 테스트하지는 않았지만 가능한 한 빨리 (아마 오늘) 업데이트됩니다