Привет! Как использовать аппаратный ШИМ на 18. GPIO RPi3B? Нужно подключить сервопривод, но при исполнении стандартной библиотеки он дёргается.
Если речь идет о серве типа SG90, то шим должен иметь период повторения около 20мС (есть ли возможность настолько низкочастотного ШИМа ?), и довольно узкий интервал значений - от 255*(1/20), до 255*(2/20) для 8-битного Шима. Т.е. 12-26. А дергается она на любой нестандартный сигнал.
как дашике на BCM2835 ARM Peripherals так и на BCM2837 присутствует описание ШИМ-а Раздел 6 General Purpose I/O (GPIO) Параграф 6.2 Alternative Function Assignments Every GPIO pin can carry an alternate function. Up to 6 alternate function are available but not every pin has that many alternate functions. The table below gives a quick over view. Код (Text): Pull ALT0 ----------------------------- GPIO12 Low PWM0 GPIO13 Low PWM1 Раздел 9 Pulse Width Modulator Параграф 9.1 Overview This section specifies in detail the functionality provided by the device Pulse Width Modulator (PWM) peripheral.
ТС сказал что у него RPi3B, я сослался на дашик. Если интерес к wiringPi то в исходниках есть работа с pwm на регистрах Заголовочный файл https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPi.h строка 208 Код (C): extern void pwmWrite (int pin, int value) ; Реализация https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPi.c настройка пина void pinMode (int pin, int mode) строка 1447 Код (C): else if (mode == PWM_OUTPUT) { if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin return ; usingGpioMemCheck ("pinMode PWM") ; // Set pin to PWM mode *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; delayMicroseconds (110) ; // See comments in pwmSetClockWPi pwmSetMode (PWM_MODE_BAL) ; // Pi default mode pwmSetRange (1024) ; // Default range of 1024 pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM } строка 1168 Код (C): void pwmSetMode (int mode) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (mode == PWM_MODE_MS) *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; else *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; } }