RaspberryPi その他 ラズパイ(C言語)

RaspberryPiでPWMを使いこなす①(応用編)

スポンサーリンク

こんにちは!駆け出しエンジニアのまっきーです。

今回はハードウェア方式、ソフトウェア方式のPWMを制御していきたいと思います。

まだPWMを使いこなせていないなという人は、ぜひ見てください!

以下の課題に取り組んでいきます!課題はこちらのサイトでダウンロードできます。

課題一覧

  1. ソフトウェア方式PWMでデューティ比をかえる
  2. ソフトウェア方式PWMで約440kHzの矩形波を発生させる
  3. ハードウェア方式のPWMで約440kHzの矩形波を発生させる

PWM制御については今までも何度か行ってきましたが、復習もかねて、必要な関数などを復習しましょう!

PWMって何?という方は過去の記事をご覧ください。

復習

PWM使用時に必要な関数

ソフトウェア方式

softPwm.hソフトpwmを使用する際に必要なヘッダーファイル
softPwmCreate(int pin,int initialvalue,int pwmRange)initialvalueにはpwm信号のHIGHの長さを設定。pwmRangeはデューティ比の階調を設定
softPwmWrite(int pin,int value)GPIOを指定し、デューティ比(パルスONの長さ)を設定

ハードウェア方式

pinMode(int pin,int mode)GPIOを指定し、PWM_OUTPUTモードに設定
pwmSetClock(int divisor)内部クロックを分周する値を設定
pwmSetRange(unsigned int range)デューティ比の階調を設定
pwmSetMode(int mode)PWM_MODE_BAL or PWM_MODE_MSを設定
pwmWrite(int pin, int value)GPIOを指定し、デューティ比(パルスONの長さ)を設定

ピン配置図

画像に alt 属性が指定されていません。ファイル名: image-21.png

電子回路

回路図は、前回の記事に引き続き、付け加える形で作成しています。

ラズパイ4を使っている方は、スイッチに3kΩ程の抵抗をつけてください。

ラズパイ3,3B+を使用している方は内部抵抗が使えるので下の図の通りで大丈夫です。

圧電ブザーはGPIO18とつないでいます。今回使用した圧電ブザーは、下記のセットに付属していたものです。

https://amzn.to/2R8guHm

以下、GPIOの対応表です

スイッチ,LED番号GPIO
LED0GPIO23
LED1GPIO24
LED2GPIO20
LED3GPIO21
SW0GPIO25
SW1GPIO17
SW2GPIO27
SW3GPIO5
SW4GPIO6
SW5GPIO13
SW6GPIO19
SW7GPIO26

ソフトウェア方式PWMでデューティ比をかえる

タクタルスイッチに対応したデューティー比でLEDを点灯させるプログラムです。スイッチが押されていないときのデューティー比は0です。

実際に私が作成したソースコードは以下の通りです。

ソースコード

softPwmCreate()関数を、LED、スイッチ初期化の前に置いていたのですが、うまく動作しませんでした。

しかし、下のコードの位置に置き換えたところ、普通に動作しました。原因としては、LEDの出力設定が終わっていないのに、PWMを作成したためだと思います。初歩的なミスです…

著者のソースコードと見比べてみます。(引用元

SwChk()という、スイッチの入力状態を取得する関数を作成しています。リターンで入力状態を返すのですが、for文で0から順番にチェックしているため、最下位bitが優先されるということなんですね。

この発想はなかったです。そして、汎用性が高そうです。

次の問題に行きましょう!

ソフトウェア方式PWMで約440kHzの矩形波を発生させる

デューティー比の指定のみです。計算方法はソースコードの文頭に記載しておきます。

ソースコード

このような音を鳴らすことができました!

少し音に歪み?のようなものがありますね。この理由はもう少し先でわかります。

ハードウェア方式PWMで約440kHzの矩形波を発生させる

先ほどの問題をハードウェア方式で行えということですね。

ハードウェア方式実装の手順を再確認して、臨みます。

ソースコード

このような音が鳴りました。同じ周波数で設定したのですが少しだけ音色が違います。

この違いは、最小変化幅(分解能)によるものだそうです。
●ソフトウェア方式の最小変化幅は 100us のため、周期 T は 2.3ms または 2.2ms です。
2.3ms = 434.8 Hz, 2.2ms = 454.5 Hz となり、音が低くなったり、高くなったりします。
●ハードウェア方式の最小変化幅が 10us の場合、周期 T は 2.27ms です。
2.27ms = 440.5 Hz になります。

先ほどの歪みは周波数が安定していないということなんですね!ハードウェア方式の方が精度が高いということも改めて確認できました!

まとめ・反省

・各処理ごとで適切に関数分けをすることにより、コードがシンプルになる

・ハードウェア方式の方がPWM信号の精度が高い

・小数がでてきたため、普通にdouble型を使用したが、関数内ではint型に変形されているものと思われる

→精度が変わってしまうため、注意が必要。

いかがでしたでしょうか。PWM信号作成のための計算はもう大丈夫ですか?

次は今回できなかった電子ピアノやオルゴールに挑戦できたらと思います。

ありがとうございました。

スポンサーリンク

-RaspberryPi, その他, ラズパイ(C言語)

© 2021 まきろぐ Powered by AFFINGER5