Otázka:
Použití PWM na Raspberry Pi 3 vs Pi 2 s knihovnou bcm2835
Sean
2016-06-03 20:53:26 UTC
view on stackexchange narkive permalink

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;}  
Dokázali byste rozvinout „prostě nefunguje“? Funguje to? Běží to špatně? Znamená to výjimky? Existují špatné požáry?
Existuje nějaká [diskuse o seznamu mailů libbcm2835] (https://groups.google.com/forum/#!searchin/bcm2835/Pi$203|sort:relevance/bcm2835/rencLf-Rl2o/VsDPjxXrBQAJ), kde je Pi 3 kde zjevně funguje pro základní účely (přepínání GPIO), ale neodkazuje na PWM. V tomto vlákně autor zmiňuje „přidání některých poznámek k dokumentaci“ o Pi 3 v „dalším vydání“, ale AFAICT aktuální vydání (1,50) předchází tuto diskusi. Pravděpodobně byste se měli dostat na seznam e-mailů a zeptat se na to.
@goobering jistě, v našem testovacím kódu se motory točí jedním směrem a zrychlují nahoru a dolů, pak dělají totéž v opačném směru. To funguje na pi2. Když běží na pi 3, v motorech prostě nedochází k žádnému pohybu. Sestavuje se dobře a nyní jsou při spuštění vyvolány chyby.
Zdá se, že tento problém je omezen na knihovnu bcm2835.
Dva odpovědi:
Nishant Kelkar
2016-08-18 14:17:51 UTC
view on stackexchange narkive permalink

Zde je relevantní vlákno pro tento problém - https://groups.google.com/forum/#!searchin/bcm2835/pwm $ 20not $ 20working% 7Csort: relevance / bcm2835 / mZjLtVmlKV8 / d1BheSSKAgAJ

Podle diskuse budete potřebovat oprávnění sudo / root při spuštění spustitelného souboru C, aby PWM fungoval.

omotto
2017-07-22 01:53:15 UTC
view on stackexchange narkive permalink

Právě teď jsem měl stejný problém! Nakonec jsem zjistil, že GPIO18 funguje správně, zatímco GPIO12 nefunguje (není tam žádný signál PWM).

Stačí změnit:

  #define PIN RPI_GPIO_P1_12  

autor

  #define PIN RPI_GPIO_P1_18  

To je vše.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...