def __init__(self, pin): # Check if the pin is valid super(HPWMPeriphery, self).__init__(pin) if PWM is None: raise ImportError("Failed to import PWM from periphery.") self._pwm = PWM(self._chip, self._SELECTED_COMB.index(pin))
def initPWM(pin): """ Sets a pin to PWM """ pwm = PWM(pin, 0) pwm.frequency = 1e3 pwm.duty_cycle = 0 pwm.enable() return pwm
def __init__(self, pin, freq=None, range=None, threshold=0.01, debug=False): """ 親クラスのコンストラクタ処理後、指定のピンに対しPWM出力ピンとして設定を行う。 初期値としてPWMサイクル値をゼロに指定する。 引数: pin int PWM番号、必須(1~3) freq int PWM Frequency値(Hz) range int PWMサイクル値の範囲(25から40,000までの整数) threshold float 入力値を0として認識するしきい値(-threshold < value< threshold => 0) """ super().__init__(pin, mode=OUT, debug=debug) self.freq = freq or DEFAULT_FREQ self.threshold = threshold if self.pin == 1: self.chip_number = 0 self.channel_number = 0 elif self.pin == 2: self.chip_number = 1 self.channel_number = 0 elif self.pin == 3: self.chip_number = 2 self.channel_number = 0 else: raise ValueError('[PERIPHERY_PWM] pwm:{} is out of range(1.. 3)'.format(str(self.pin))) try: from periphery import PWM except ImportError: exit('[PERIPHERY_PWM] This code requires periphery package') self.gpio = PWM(self.chip_number, self.channel_number) self.gpio.frequency = self.freq self.gpio.duty_cycle = 0 self.gpio.enable() self.run(0) if self.debug: print('[PERIPHERY_PWM] pwm:{} set freq:{}/dutycycle:{}, enabled and set value 0'.format( str(self.pin), str(self.freq), str(self.gpio.duty_cycle)))
def prepare(self) -> None: logger = get_logger(0) for (pin, initial) in self.__channels.items(): try: logger.info("Probing pwm chip %d channel %d ...", self.__chip, pin) pwm = PWM(self.__chip, pin) self.__pwms[pin] = pwm pwm.period_ns = self.__period pwm.duty_cycle_ns = self.__get_duty_cycle(bool(initial)) pwm.enable() except Exception as err: logger.error("Can't get PWM chip %d channel %d: %s", self.__chip, pin, tools.efmt(err))
def initPWM(pin): pwm = PWM(pin, 0) pwm.frequency = 1e3 pwm.duty_cycle = 0 pwm.enable() return pwm
# set GPIO mode to BOARD GPIO.setmode(GPIO.BOARD) mode = GPIO.getmode() print(mode) # Open PWM channel 0, pin 32 pins = range(0, 41) """ for pin in pins: try: pwm = PWM(0, pin) print("** Channel 0 pin {} works!".format(pin)) except: print("Pin {} does not work".format(pin)) """ pwm = PWM(0, 2) pwm = PWM(0, 0) #Channel 0 pin 2 # Set frequency to 1 kHz pwm.frequency = 2e3 # Set duty cycle to 75% pwm.duty_cycle = 0.25 pwm.enable() # Change duty cycle to 50% pwm.duty_cycle = 0.25 time.sleep(5 * 60)
class HPWMPeriphery(HPWM): """Wrapper around python periphery pwm implementation extends :class:`HPWM`. This class need the periphery module to be installed. Also some configuration files need to be added to the system. More info in the repo's README. Args: pin (int): The pin number in bcm mode. Raises: ImportError: Error if the periphery library is not installed. """ _chip = 0 # PWM chip def __init__(self, pin): # Check if the pin is valid super(HPWMPeriphery, self).__init__(pin) if PWM is None: raise ImportError("Failed to import PWM from periphery.") self._pwm = PWM(self._chip, self._SELECTED_COMB.index(pin)) def read(self): """Read from hardware pwm pin. Returns: float: The duty cycle of the pwm pin. """ return self.duty_cycle def write(self, value): """Write to the pwm pin. Args: value (float): The new duty cycle value. """ self.duty_cycle = value def close(self): self.enable = 0 def _get_frequency(self): return self._pwm.frequency def _set_frequency(self, frequency): "Ugly solution to sysf permission error" try: self._pwm.frequency = frequency except PermissionError: sleep(0.1) self._pwm.frequency = frequency def _get_duty_cycle(self): return self._pwm.duty_cycle def _set_duty_cycle(self, duty_cycle): self._pwm.duty_cycle = duty_cycle def _get_enable(self): return self._enable def _set_enable(self, enable): #self._pwm.enable = enable self._enable = enable if self._enable: self._pwm.enable() else: self._pwm.disable() def _get_polarity(self): pass def _set_polarity(self, polarity): pass
"""periphery库 PWM测试.""" import time from periphery import PWM # 打开 PWM 3, channel 0 ,对应开发板上PWM3外设 try: pwm = PWM(2, 0) # 设置PWM输出频率为 1 kHz pwm.frequency = 1e3 # 设置占空比为 50% pwm.duty_cycle = 0.50 # 开启PWM输出 pwm.enable() while True: for i in range(0, 9): time.sleep(0.1) pwm.duty_cycle += 0.05 for i in range(0, 9): time.sleep(0.1) pwm.duty_cycle -= 0.05 if pwm.duty_cycle == 0.0: time.sleep(1) finally: pwm.close()
try: from periphery import PWM import time pwm = PWM(2, 0) pwm.frequency = 1e3 pwm.duty_cycle = 0.5 def enable_buzzer(): pwm.enable() def disable_buzzer(): pwm.disable() def set_freq(freq): pwm.frequency = freq def cooltone(): enable_buzzer() for x in [587.330, 793.989, 880, 1174.66]: pwm.frequency = x time.sleep(0.161) disable_buzzer() def b_tone(): enable_buzzer() for x in [1174.66, 880, 793.989, 587.330]: pwm.frequency = x time.sleep(0.161) disable_buzzer() except: print("Could not import periphery lib.")
class PERIPHERY_PWM(PERIPHERY): """ PWM出力ピンを表すクラス。 指定ピンがハードウェアPWMに対応しない場合は、疑似PWMとして操作する。 """ def __init__(self, pin, freq=None, range=None, threshold=0.01, debug=False): """ 親クラスのコンストラクタ処理後、指定のピンに対しPWM出力ピンとして設定を行う。 初期値としてPWMサイクル値をゼロに指定する。 引数: pin int PWM番号、必須(1~3) freq int PWM Frequency値(Hz) range int PWMサイクル値の範囲(25から40,000までの整数) threshold float 入力値を0として認識するしきい値(-threshold < value< threshold => 0) """ super().__init__(pin, mode=OUT, debug=debug) self.freq = freq or DEFAULT_FREQ self.threshold = threshold if self.pin == 1: self.chip_number = 0 self.channel_number = 0 elif self.pin == 2: self.chip_number = 1 self.channel_number = 0 elif self.pin == 3: self.chip_number = 2 self.channel_number = 0 else: raise ValueError('[PERIPHERY_PWM] pwm:{} is out of range(1.. 3)'.format(str(self.pin))) try: from periphery import PWM except ImportError: exit('[PERIPHERY_PWM] This code requires periphery package') self.gpio = PWM(self.chip_number, self.channel_number) self.gpio.frequency = self.freq self.gpio.duty_cycle = 0 self.gpio.enable() self.run(0) if self.debug: print('[PERIPHERY_PWM] pwm:{} set freq:{}/dutycycle:{}, enabled and set value 0'.format( str(self.pin), str(self.freq), str(self.gpio.duty_cycle))) def run(self, input_value): """ 引数で渡されたpulse値をPWMサイクル値に変換し、指定ピンへ出力する。 引数: input_value float コントローラ/AIからの入力値 戻り値: なし """ cycle = self.to_duty_cycle(input_value) self.gpio.duty_cycle(cycle) if self.debug: print('[PERIPHERY_PWM] pwm:{} set cycle {}(input_value:{})'.format( str(self.pin), str(cycle), str(input_value))) def to_duty_cycle(self, input_value): """ コントローラ/AIからの入力値をPWMサイクル値に変換する。 しきい値範囲内の場合やNoneの場合は、0として扱う。 引数: input_value float コントローラ/AIからの入力値(None含む) 戻り値: cycle float PWM duty_cycle値 """ if input_value is None or (abs(float(input_value)) < self.threshold): if self.debug: print('[PERIPHERY_PWM] gpio:{} input_value None to zero'.format(str(self.pin))) return float(0) input_value = abs(input_value) if input_value >= 1.0: return float(1.0) return float(input_value) def shutdown(self): self.run(0) self.gpio.disable() if self.debug: print('[PERIPHERY_PWM] set duty_cycle to 0 and disabled') super().shutdown()