V jedné aplikaci používáme malinu p k řízení otáček motoru pomocí PWM. Byli jsme schopni získat platný pracovní kód na malinovém pi 2, ale když jsme tento kód a ovladače přenesli na pi 3, kód jednoduše nefunguje. Existuje nějaká snadná věc, která nám chybí při přechodu z pi 2 na pi 3, aby tento kód fungoval?
#include <bcm2835.h> # zahrnovat <stdio.h> # define PIN RPI_BPLUS_GPIO_J8_32 # define PIN2 RPI_BPLUS_GPIO_J8_33 # definovat CTL_PIN RPI_BPLUS_GPIO_J8_29 # define CTL_PIN2 RPI_BPLUS_GPIO_J8_31 # definovat PWM_CHANNEL 0 # define PWM_CHANNEL2 1 # define RANGE 1024int main (int argc, char ** argv) {// bcm2835_delay (10000); if (! bcm2835_init ()) vrátit 1; // Nastavte výstupní kolík na Alt Fun 5, aby tam mohl být výstup PWM kanálu 0 bcm2835_gpio_fsel (PIN, BCM2835_GPIO_FSEL_ALT0); bcm2835_gpio_fsel (PIN2, BCM2835_GPIO_FSEL_ALT0); bcm2835_gpio_fsel (CTL_PIN, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel (CTL_PIN2, BCM2835_GPIO_FSEL_OUTP); // Oddělovač hodin je nastaven na 16. // S děličem 16 a RANGE 1024, v režimu MARKSPACE, // bude frekvence opakování pulzů // 1,2MHz / 1024 = 1171,875Hz, vhodná pro pohon stejnosměrného motoru s PWM bcm2835_pwm_set_clock (BCM2835_PWM_CLOCK_DIVIDER_16); bcm2835_pwm_set_mode (PWM_CHANNEL, 1, 1); bcm2835_pwm_set_range (PWM_CHANNEL, RANGE); bcm2835_pwm_set_mode (PWM_CHANNEL2, 1, 1); bcm2835_pwm_set_range (PWM_CHANNEL2, RANGE); // Změňte poměr PWM m / s mezi 1 / RANGE a (RANGE-1) / RANGE int direction = 1; int data = 1; int j; bcm2835_gpio_write (CTL_PIN, HIGH); bcm2835_gpio_write (CTL_PIN2, HIGH); for (j = 0; j<4096; j ++) {if (j == 2048) {bcm2835_gpio_write (CTL_PIN, LOW); // bcm2835_gpio_write (CTL_PIN2, LOW); } if (data == 1) direction = 1; jinak if (data == RANGE-1) direction = -1; data + = směr;
bcm2835_pwm_set_data (PWM_CHANNEL, data); bcm2835_pwm_set_data (PWM_CHANNEL2, data); bcm2835_delay (10); } bcm2835_pwm_set_data (PWM_CHANNEL, 0); bcm2835_pwm_set_data (PWM_CHANNEL2, 0); bcm2835_close (); vrátit 0;}