펄스 폭 변조 (PWM)에 GPIO를 사용할 수 있습니까?


97

GPIO를 펄스 폭 변조 출력 으로 사용할 수 있습니까 ?

그렇다면 어떻게하면 좋을까요? 동시에 많은 고유 한 PWM 출력을 가질 수 있습니까?


사용중인 모델을 지정해야합니다. 그것들은 모두 약간 다릅니다.
not2qubit

2
@ user1147688이 질문은 모델이 하나 밖에 없을 때 다시 물었습니다.
berry120

답변:


76

제안한 바와 같이 알렉스 전관 상기 WiringPi의 라이브러리는 두 모델에 따라 하나 또는 두 개의 GPIO 핀에 하드웨어 PWM 출력 지원 나타나는 소프트웨어 PWM을 다른 GPIO 핀에 임의. 한편 RPIO.PWM 라이브러리 는 GPIO 핀에서 DMA로 PWM 을 수행합니다. 사실상 이것은 하드웨어와 소프트웨어 PWM 사이의 중간에 있으며 WiringPi의 소프트웨어 PWM을 통해 100µs에 비해 1µs 타이밍 분해능을 제공합니다 [1] .

이 중 어느 것이 어플리케이션에 적합한지는 필요한 PWM 출력 수와 해당 출력에서 ​​원하는 성능에 따라 다릅니다.

응용 프로그램이 낮은 타이밍 해상도와 높은 지터 를 허용 하는 경우 소프트웨어 또는 DMA 지원 타이밍 루프를 사용할 수 있습니다. 높은 정밀도 / 낮은 지터 PWM을 원하면 하드웨어 지원이 필요할 수 있습니다.

소프트웨어 PWM이 언제 적합한가요?

부드러운 실시간 응답 요구 사항으로 사람이 볼 수있는 케이던스 (10Hz)가 다른 LED를 플래시하려는 경우 소프트웨어 루프는 GPIO 핀만큼 많은 PWM을 처리 할 수 ​​있습니다.

하드웨어 PWM이 언제 적합한가요?

실시간 응답 요구 사항 이 까다로운 서보 모터를 제어 하려면 하드웨어 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이 더 이상 최신 파이 모델에서 작동하지 않을 수 있다고 말합니다.


소프트웨어 PWM 방식을 사용하여 DC 모터를 작동시킬 수 있습니까?
기드온

@gideon-예, 제가 사용한 모터 전력 증폭기는 모두 PWM을 입력으로 사용했습니다.
Mark Booth

2
참고로, RPI 라이브러리 ( pythonhosted.org/RPIO/pwm_py.html )는 100us 해상도의 WiringPi와 비교하여 훨씬 더 나은 해상도 (1us) 인 것 같습니다
dm76

@MarkBooth-문제 없음. 이 라이브러리는 실제로 잘 작성되어 있으며 RPi.GPIO의 드롭 인 대체로 사용할 수 있습니다.이 라이브러리는 후자를 사용하여 프로젝트를 시작한 후 나중에 PWM 신호가 필요하다는 사실을 알게되면 매우 편리합니다 ...
dm76

RPIO.PWM은 더 이상 최신 파이 모델에서 작동하지 않을 수 있습니다.
heather

39

하드웨어 PWM

예, Raspberry Pi에는 P1-12 (GPIO18)에 연결된 하나의 하드웨어 PWM 출력이 있습니다. 또한 I²C 또는 SPI 인터페이스를 사용하여 PWM 출력을 추가 할 수 있습니다 . 어떤 사람들은 이것으로 성공했습니다 ( 포럼 게시물 ).

예제 코드

WiringPi 라이브러리 를 사용하여 PWM 핀을 제어 할 수 있습니다 . 전체 라이브러리를 포함하지 않도록 코드를 볼 수 있습니다.

소프트웨어 PWM

Linux는 실시간 운영 체제가 아니므로 Raspberry Pi는 심각한 소프트웨어 PWM에는 적합하지 않습니다.


1
질문, 심각한 소프트웨어 PWM의 정의 또는 예는 무엇입니까? 그리고 "실시간 운영 체제"무엇이며, 지금까지 파이에 하나를 얻기의 기회가
AnthonyBlake

@AnthonyBlake 글쎄, 당신은 아마도 소프트웨어 PWM을 사용하여 빛의 밝기를 제어 할 수 있지만 모터가 멈추는 것 같습니다. 소프트웨어 PWM을 수행 할 필요는 없지만 하드웨어는 더 단순하고 효과적입니다. 실시간 운영체제는 Google에 의해 더 잘 설명 될 것입니다. 소프트웨어가 얼마나 오래 그리고 자주 실행되는지에 대한 특정 사항을 보증합니다.
Alex Chamberlain

2
@AnthonyBlake "실시간 OS"(RTOS)는 실행 시간 상한을 보장하는 운영 체제입니다. 프로그램에 말하는 것과 같이 "예, GPIO 핀 비트를 뒤집어 필요한 스텝 타임에 신호를 걸기 위해 GPIO 핀 비트를 뒤집는 데 33ms (약 2ms 허용 오차)의 실행 시간이 있습니다. 그것에! " RT Linux가 있습니다. 그것이 RPi (아직)로 포팅되었는지 알 수 없습니다.
orithena

죄송합니다. Alex는 의도적으로 답변의 다른 부분을 훔치지 않았지만 다른 경로를 통해 동일한 포럼 게시물에 온 것을 알았습니다.
Mark Booth

2
40 핀이있는 최신 모델에는 GPIO19 (핀 35)에 연결된 두 번째 하드웨어 PWM이 있습니다.
케빈

12

최근 Pis에는 두 개의 하드웨어 PWM 채널이 있습니다. 또한 하드웨어 타이밍 PWM 펄스는 40 핀 확장 헤더에 연결된 모든 GPIO에서 독립적으로 생성 될 수 있습니다.

실제로 이것은 두 개의 매우 정확한 PWM 채널이 있으며 다른 모든 GPIO는 Arduino 스타일 PWM (800Hz, 0 꺼짐-255 완전 켜짐)을 가질 수 있음을 의미합니다.

예를 들어 서보 블래스터 및 내 pigpio


좋은 대답입니다! 이 두 개의 HW PWM을 어떻게 사용할 수 있습니까? 나는 2 개의 서보를 제어해야합니다. 서보 블래스터와 피그 피오가 괜찮다고 말하지만 HW PWM에 대해 궁금합니다. 테스트를 위해 RPi 2 V1.1이 있습니다.
Kozuch


2
과도한 CPU로드는 차이가 없어야합니다. 네트워크 부하가 크면 특히 기본 200kHz가 아닌 1MHz로 샘플링하는 경우 gpioServo와 차이가 생길 수 있습니다. 주파수는 50 (Hz)이고 듀티 사이클의 범위는 0-1000000입니다 (실제 기본 값인 0-5000000으로 매핑 됨). 1ms는 20ms에서 1ms이므로 5 %의 듀티 사이클은 50000, 1.5ms-> 7.5 %-> 75000, 2ms-> 10 %-> 100000입니다.
joan

1
페이지 102 BCM2835 ARM 주변기기는 GPIO를 할당 할 수있는 다양한 방식을 나타낸다. GPIO가 다양한 Pi 모델 확장 헤더로 연결되는 온라인을보십시오.
joan

1
@ user1147688 PLLD (500MHz)가 핵심 PWM 클록으로 사용됩니다. "작동"방식으로 인해 PWM 코어 주파수는 250MHz입니다. 스위치를 켜고 끌 수 있으려면 (PWM의 경우 필수) 최대 값은 125MHz입니다. PLLC (1000MHz)를 사용하면 수치를 두 배로 늘릴 수 있지만 PLL은 코어 클럭 속도에 따라 다릅니다.
joan

2

실시간 OS는 아니지만 Raspberry Pi 용 RISC OS 는 협력적인 멀티 태스킹이므로 CPU가 100 % 인 응용 프로그램을 쉽게 실행하여 타이밍을 훨씬 잘 관리 할 수 ​​있습니다. 자신의 코드 이외의 다른 작업은 기대하지 마십시오.


출력 핀의 스위칭 주파수에 대한 하드웨어 제한이 있다는 것을 읽었습니다. 나는 그것이 약 20 MHz라고 생각합니다. 따라서 100 % CPU 사용으로도 300MHz PWM 또는 그와 비슷한 것을 끌어낼 수있을 것으로 기대하지 마십시오.
Ponkadoodle

@Wallacoloo : 300MHz PWM이 필요한 애플리케이션은 무엇입니까?
Peter Mortensen 2016 년

2
@PeterMortensen : 글쎄, 나는 무선 송신기와 그와 같은 신호가 어떻게 신호를 생성하는지 모르지만 일부는 PWM으로 할 수 있습니다. PiFM은 100MHz에서이를 수행합니다. 그래도 내 의견과 모순되는 것처럼 보입니다. 핀이 여전히 해당 주파수에서 명령 될 수 있는지 궁금합니다. 그러나 핀 커패시턴스가 그러한 신호를 감쇠시켜 100MHz 구형파가 실제로 예를 들어 (1.0V에서 전체 (0V, 3.3V) 범위 대신, 2.3V).
Ponkadoodle

2

"매우 효율적 : CPU를 사용하지 않고 매우 안정적인 펄스를 제공한다"고 주장하는 이 라이브러리 ( pi-blaster )를 발견했습니다 .

아직 테스트하지는 않았지만 가능한 한 빨리 (아마 오늘) 업데이트됩니다


나는 이것을 시도했지만 지금까지 운이 없다. 내가 말할 수있는 한 실제로 하드웨어를 전환하지는 않습니까?
MrMowgli

1
그냥 부딪 치고 싶어 Pi-blaster는 다른 답변이없는 곳에서 나를 위해 일했습니다.
Seph Reed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.