Аппаратный ШИМ

Тема в разделе "Raspberry Pi", создана пользователем GoWin, 21 ноя 2019.

  1. GoWin

    GoWin Нуб

    Привет! Как использовать аппаратный ШИМ на 18. GPIO RPi3B? Нужно подключить сервопривод, но при исполнении стандартной библиотеки он дёргается.
     
  2. NikitOS

    NikitOS Король шутов Администратор

    А подключение нормальное? Контакт хороший? Питания достаточно?
     
  3. GoWin

    GoWin Нуб

    Все нормально.
     
  4. parovoZZ

    parovoZZ Гуру

    В wiringPI нет аппаратного ШИМа. Ну или я его не увидел.
     
  5. GoWin

    GoWin Нуб

    Так я хочу узнать, как использовать аппаратный ШИМ. Так как программный не подходит
     
  6. parovoZZ

    parovoZZ Гуру

  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если речь идет о серве типа SG90, то шим должен иметь период повторения около 20мС (есть ли возможность настолько низкочастотного ШИМа ?), и довольно узкий интервал значений - от 255*(1/20), до 255*(2/20) для 8-битного Шима. Т.е. 12-26. А дергается она на любой нестандартный сигнал.
     
    Последнее редактирование: 25 ноя 2019
  8. как дашике на 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.
     
  9. parovoZZ

    parovoZZ Гуру

    Ну понятно, что аппаратный ШИМ есть. Речь-то про wiringPi
     
  10. ТС сказал что у него 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 ;
      }
    }