質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

4014閲覧

Python: pigpioのwavePWMを用いたPWM制御がうまく行きません。

Ikajiro

総合スコア6

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/28 08:20

編集2022/01/12 10:55

pigpioライブラリのwavePWMというスクリプトを使ったPWMの制御がうまくいきません。

Raspberry Pi 3 Model B V1.2を使用したPWM制御を行おうとしています。

  • 高周波数のPWMを発振できるライブラリが必要で、私が書ける言語がpythonのみなので、このライブラリを使用しています。
  • 実際に使用するコードでは、1 - 20 MHz程度での発振を予定しています。

問題は、ライブラリのホームページにあるwavePWM2というスクリプトをインポートして、PWMによる信号の発振ができないことです。下記に該当のコードを記載します。

Python2.7

1import RPi.GPIO as GPIO 2import pigpio 3from time import sleep 4import wavePWM 5 6GPIO.setwarnings(False) 7 8GPIO.setmode(GPIO.BCM) 9 10signal = 3 11 12GPIO.setup(signal, GPIO.OUT) 13 14o1 = 10 # pulse frequency [Hz] 15 16pi = pigpio.pi() 17pwm = wavePWM.PWM(pi) 18 19def emission(): 20 21 pwm.set_frequency(o1) 22 23 pwm.set_pulse_start_and_length_in_fraction(signal,0/2,1/2) 24 25 pwm.update() 26 27 sleep(o1) 28 29 print("finishied") 30 31 pwm.cancel()
  • PWMの発振をオシロスコープで観測したのですが、信号が認められませんでした。また、LEDの点灯も確認できませんでした。
  • ライブラリにはpigpioを使用し、daemonが起動して動作しているのはLチカとオシロスコープにて確認済みです。

pigpioライブラリのHP

wavePWM2のダウンロード元

参考にした情報

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

python

1pwm.set_pulse_start_and_length_in_fraction(signal,0,0.5)

のように書き換えたらどうなりますか?

投稿2018/03/29 13:04

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ikajiro

2018/03/29 16:40 編集

ご回答ありがとうございます。はっきりしたことはわからないのですが、どうやら問題はPWMに関する記載ではなく、その後に続くpwm.cancel()の部分にあるようです。ご提案いただきましたコードと、前回試したコードで再度PWMの出力を試みたところ、なぜかimportした時点でLEDが点灯し始め、emission()を読み込んだ時点からLEDの点滅が始まりました。前回上手く行かなかった、直接pi.hardware_PWM(pin, frequency, duty)で設定するやり方でも問題なく動作しました。ただ、いずれの場合も、一度設定したPWMの変更を行う際に、一度pythonを終了しなければ、前回の動作を上書きする形では動作しないようです。原因がわかり次第、追記いたします。 上記のスクリプトを2回連続して走らせた際のエラーを下記に記載しておきます。 File "<stdin>", line 1, in <module> File "test.py", line 29, in emission pwm.cancel() File "wavePWM.py", line 294, in cancel self.pi.wave_delete(self.old_wid) File "/usr/local/lib/python2.7/dist-packages/pigpio.py", line 2295, in wave_delete return _u2i(_pigpio_command(self.sl, _PI_CMD_WVDEL, wave_id, 0)) File "/usr/local/lib/python2.7/dist-packages/pigpio.py", line 975, in _u2i raise error(error_text(v)) pigpio.error: 'non existent wave id' ちなみに1 MHz程度まではきれいな矩形波が観測されました。20 MHz(カタログ値)まで測定できるオシロスコープを使っているのですが、5 MHz程度で少し形が崩れはじめ、10 MHzでは完全に崩れた波形となっていました。それでも、pythonでこれだけ高周波数のPWMを32ピンで使えるのは便利です。
TaroToyotomi

2018/03/31 18:03

pi.stop()を呼んでないせいで、デーモン側が中途半端な状態になってて2回目のcancelでデーモンがエラーを戻しているのではないでしょうか? pythonを終了すると、デーモンとの接続が切れるので状態がクリアされるとかないでしょうか。
guest

0

まずはLEDの点滅だけでも実装してみる。
それがきちんと動いてからつぎにいくべし

はなしはそれからやねー

投稿2018/03/28 08:59

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ikajiro

2018/03/28 09:55

ご回答ありがとうございます。どうやらwavePWMで詰まっているようです。もう少し原因を探ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問