国際展示場駅前のVVVF波形を評価してみた
おや!なにやら怪しいものが…!(図1)
これは見るからにインバータの波形…!
コミケの風物詩とも言っていいこの床。PFM波形だ〜とツイートするのはいいのですが、基本波成分やTHD解析がなされている文献は見当たりません。(僕が見てないだけかもしれない)
て〜かそもそもなんでいきなりここにPFM波形があるのか?真意は謎ですが、いろいろ気になるので、ちょいと解析をかけてみましょう。
ガバ〜く解析していく!
●スイッチングの読み取り
幸い国際展示場と学校が近いので、帰るときに国際展示場駅を経由してマス目を数えていきます。図2のようにGoogleMapからもギリギリ見れるのですが、ちょっとボヤけてて見えづらく、正確に読み取るのは難しいです。直接出向くのがやはり確実でしょう。
マス目は、図3のように青色を1、黒色を0として順番に読み取って行きました。ちなみに一緒に数える友達なぞいません。
このようにして読み取った波形を図4に示します。マス目は全部で1000マスくらいで15分とかで終わったので、別に友達とかいらんかったかもしれません。
●解析法について
まず、図4の波形を3相2レベルインバータの相電圧と仮定し、、として気持ち的に置き換えます。(はインバータの母線電圧)
▶︎不連続!非対称!
波形をよく見るとわかるのですが、波形が毎回異なっており、通常の同期PWMのように解析できない感じがします。また、どう見ても直流バイアスがかかってる感じで、ゼロクロス点で非対称です。それに加え、波形の端も変なタイミングで終わっており、連続させることができないことから、波形全体をドーンってフーリエ級数展開するのも無理がありそうです。
▶︎ガバ〜く解析
図4の波形を図5のように適当に区間に分け、0度から90度のスイッチング角度を入れると各種解析をしてくれる自作ソフトにぶち込みそれらの結果を平均することでだいたいの値を得ることにしました。この方法では、波形が対称かつ3相で平衡していると仮定しており、これは実際とは異なります。それに端っことかも解析できていないのですが、あくまでガバ〜く解析ってことなので気にしてはいけません。
解析法に関しては、かなり悩みました。波形に直流バイアス成分が乗っているように見えることから、ここら辺を補正して解析しようとも思いましたが、この波形の製作者をなるべく尊重し、THDが少なくなりそうな解析法で攻めることにしました。
スイッチング角度に基づいて解析する方法は前回の記事と同様です。ただし、今回は前回と違って2レベル波形ですので、角度の2レベル波形の次高調波の振幅は次式になります。(として正規化しています。)
●パルス数を求める
基本波振幅を求める前に、まずパルス数を求めます。スイッチングが図5の赤枠の範囲内で切り替わる回数を数えると、合計回となります。また、赤枠は周期分ありますから、パルス数はパルスとなります。
●基本波振幅を求める
図5の赤枠でそれぞれ求めたをすべて平均すると、となりました。パルスをとして正規化すると、となります。また、最小値はで、最大値はとなりました。けっこう幅があります…。
●THDを求める
電流THDの解析方法は前回の記事と同様ですので省略します。
図5の赤枠でそれぞれ求めたをすべて平均すると、となりました。また、最小値はで、最大値はとなりました。さらに幅があります…。本当に大丈夫ですかねこれ。(大丈夫じゃない)
●サブ・ハーモニックPWMと比較
▶︎27パルスと比較
とりあえず、パルス数(スイッチング回数)がほぼ同じなパルスと比較していきます。時のパルスの線間電圧波形を図6に示します。
この波形の電流THDを求めるととなり、最小THDと比較しても、サブ・ハーモニックPWMの波形のほうが品質が優れていることがわかります。一応変調率を変えてでも比較してみましたが、この関係が覆ることはありませんでした。
▶︎なるべく同等の品質となるパルス数
まず、となるべく近くなるようなパルス数を求めます。パルス数は、諸事情で3の奇数倍のみに制限します。求めてみると、のパルスとなります。
また、と同等の品質となるパルス数は、のパルスです。
最悪の場合であると同等の品質となるパルス数はのパルスとなります。ちなみに、パルスはとなっており、もう少しでパルスの顔が見えそうな感じになっております。
●まとめ
図5の波形は、以下のような素晴らしい特徴があります。
- 正弦波に直流バイアスっぽいのがかかってる
- 毎回波形が違う
- 最高のパフォーマンスを発揮できても、性能はサブ・ハーモニックPWMに届かず
- 最悪の場合3パルスの顔がチラつく
解析した感想ですが、これがそもそもインバータの波形として作られていないというのもあり、かなり解析しづらかったです。全然完璧に解析できたわけではないので、何か良い方法を思いついた人は教えてください。
弊学教授作のVVVF波形を評価してみた
弊学の廊下を歩いていると…
おや!なにやら怪しいものが…!(図1)
これは見るからにインバータの波形…!!!
上に電圧形2レベル三相インバータの回路が書いてあるので、三相インバータ関連の波形でしょうか?
どうやらこのポスター、話によるとワイの担任が作ったそうです。研究室前に貼ってありました。なんで作ったのかは真意は謎ですが、いろいろ気になるので、ちょいと解析をかけてみましょう。
ゆる〜く解析していく!
スイッチング角度の読み取り
同期PWMとして解析を行います。まず図2の要領で図1のスイッチング角度を読み取ります。
同期PWMの波形は対称なので、周期分を読み取れば良いのです。写真のピクセル数から角度を読み取っていくと、以下の表1のように読み取ることができました。なお写真の傾きについては補正をかけていません。…どうせそんな変わらんやろ!
表1 スイッチング角度
番号 | 角度 [deg] |
---|---|
8.48 | |
12.5 | |
17.7 | |
24.7 | |
29.5 | |
37.3 | |
43.5 | |
55.0 | |
60.9 | |
75.6 | |
81.2 |
基本波振幅の導出
図2の波形をフーリエ級数展開をするときの要領で図1の波形が連続するとしてフーリエ級数展開を適用すると、次高調波の振幅は(eq.1)になります。(母線電圧=1として正規化しています。)
(eq.1)から、図1の波形の基本波振幅となり、1パルスモードの基本波振幅をとして正規化すると、となります。
なお、写真には基本波らしき正弦波が一緒に描かれていて、これの振幅をピクセル数から読み取ると、となり、と比べると、近くの誤差があることがわかります。
というのを踏まえて基本波の正弦波を赤線で描くと、図3のようになります。
また、3倍調波が0ではないことから、PWM波形は3レベルインバータの相電圧であることがわかります。2レベルインバータの線間電圧には3倍調波は含まれないはずだからです。
上に描いてある回路は2レベルだということを考慮すると、2レベルインバータの線間電圧のつもりで描いたのでしょうか。
THDの導出
電流THDは、電動機一相あたり実効漏れインダクタンスを、基本波角周波数をとすると、(eq.2)となります。
図1の波形は対称なので、次高調波は除いて考えると、となります。また、線間電圧を考えると、次高調波は除去されるのでとなります。これが小さいほど、よいPWM波形だと言えます。
ベクトル軌跡の導出
電圧を時間積分して電流0時の磁束の軌跡っぽいものを出してみます。図4のようになりました。
理想ではこの形は円になります。円形に近いほど、リプルが少ないと言えます。
サブハーモニック法と比較
一般的なサブハーモニック法のPWM波形と比べてみましょう。21パルスモードでの相電圧の波形は図4のようになります。角度の数は11角度で図1とちゃんと一緒です。
THDを出してみましょう。まず、図5の波形(相電圧)はとなり、線間電圧を考えると、次高調波は除去されるのでとなります。
これは、先ほど導出したより数倍小さいです。つまり、図1の波形は、一般的なサブハーモニック法よりはるかに劣っているPWM波形だと言えます。
磁束の軌跡っぽい形も比べてみましょう。図6にそれぞれの磁束の軌跡っぽい形を示します。左側が先ほど導出した図1の磁束の軌跡っぽいもの、右側が21パルスモードの磁束の軌跡っぽいものです。
図6からも図1の波形が一般的なサブハーモニック法に比べてはるかに劣っているPWM波形だということが分かります。
なるべく同等な評価結果となるようなパルス数を求めると、9パルス(キャリア反転、4角度)のとなりました。(これでも1歩及ばず…)つまり、図1の波形は〜以下のスイッチング周波数のサブハーモニック法と同等くらいの品質なのです。例えるならば、「人一倍以上努力しないと1人前になれない」みたいなことです。
まとめ
図1の波形は、以下のような素晴らしい特徴があります。
- 11角度
- 基本波振幅がくらい違う
- 2レベルインバータの線間電圧のつもり
- 3レベルインバータの相電圧
- 人一倍以上努力しないと1人前になれない
今後の活躍に期待です。
ArduinoMegaくんでVVVFの同期モード・非同期モードの実装③ -同期PWMの生成-
前置き(いらない)
そういえばArduinoIDEが新しくなったみたいですね〜知らんけど
同期PWMとは?
非同期PWMのまま基本波周波数を上げていくと、基本波とキャリア波の位相が不連続的に変化するため電圧の動揺とともに分数調波の問題が出てきます。そこで基本波周波数が高い領域では、基本波とキャリア波の位相を同期させ基本波とキャリア波の周波数比を一定に保つことで運転を安定させることが一般的です。このようなPWM方式を同期PWMと言います。同期PWMは線間電圧の半周期に現れるパルス数を添えて同期xxパルスと呼ばれたりもします。
(図1-a)(図1-b)に同期9パルスの基本波・キャリア・相電圧、また(図1-c)に線間電圧の波形例を示します。過変調ではない場合、線間電圧の半周期にはキャリア周波数:基本波周波数の比と同じ9つのパルスが現れています。過変調になると変調されない部分が現れてパルス数が減少します。
また注意点として、3相インバーターにおいては相電圧波形の合同性を保ち偶次高調波を除去するためにキャリア周波数は基本波周波数に対して(3+6n)倍(nは0以上の整数)の比に設定する必要があります。
過変調ではないのに5パルス・12パルスなどの(3+6n)ではないパルス数の場合、この図に示す三角波比較方式の正弦波PWMとは違う方式で生成しているPWMであるということになります。
タイマーと割り込みを駆使して同期PWMを生成
タイマーと割り込み処理を駆使して上記の条件を達成するようなPWMを生成することを考えます。
そこで今回は三角波の折り返し地点(つまりTOPとBOTTOM)で割り込み処理を行いOCRnxを更新することでキャリア波と基本波の位相を強制的に同期させます。(図2)に3パルス時の例を示します。
ここで注意なのは割り込みが発生した時に基本波を更新するという処理方法だと灰色で示した理想的な基本波で生成されるPWMと大きく異なる波形になることです。そのため区間ごとのsinの平均値を求めそれを基本波とすることでPWMを生成します。この平均値はルックアップテーブルに納めます。
また変調率に対する基本波成分の振幅は過変調まではほぼ線形(正確には非線形)に変化するのでついでにテーブルの最大値を1としてゲインをかけておき、過変調ではない状態において電圧跳躍やPWMの誤差ができるだけ生じないようにしておきます。
しかしArduinoの場合、TOPとBOTTOMで値を変更しても位相基準PWMモードの場合はTOPで、周波数基準PWMモードの場合BOTTOMのみでしかOCRnxの値は更新されず、正しくPWMが生成できません。(詳しくはデータシートのp.102を参照)そこで位相基準PWMモードと周波数基準PWMモードを両方うまく使ってTOPとBOTTOM両方で値が更新されるようにします。第一回で秘密にしていた位相基準PWMモードと周波数基準PWMモードの違いはまさにこれです。
具体的にはTOP側の割り込み処理中でタイマーの設定を周波数基準PWMに切り替え、またBOTTOM側の割り込み処理中で位相基準PWMに無理やり設定を切り替えることで実現できます。
特殊PWMの生成①…よく見かける5パルスの生成
よく上記に示したPWM法のまま無理やりキャリア周波数を基本波周波数の5倍にして偶次高調波ぁだらけの5パルスを生成して喜んでる輩がいますがそれは違います。
文献(インバータ制御電車概論: 飯田秀樹・加我敦 著)を漁ると実際はこんな変な猫耳みたいなキャリア(以後猫耳キャリア)を用いて5パルスを生成してるとのことです(図3-a)(図3-b)(図3-c)。
こんな猫耳キャリアArduinoのタイマーで生成できねえよ!!!は?????
…呼んだ…?
と思うかもしれませんがまあ色々いじれば生成できるんですよねこれが。
手順はたった一つ…、キャリアを力任せに変形させて無理やり三角波にするだけです。猫耳キャリアリョナです。またArduinoには出力するPWM波形を反転できる設定もあるのでそれも問答無用で駆使して同じPWMが出力できるようにします(図4)。
反転と非反転を繰り返しているのが印象的ですね。
ということでこれならちょっと歪ですけどArduinoでも生成できそうです。
ね、簡単でしょ。
特殊PWMの生成②…広域3パルスの生成法
広域3パルスについてはggると日立評論のやつがなんか出てくるのでご存じかと思います。ということで知っている前提で進めます。いちいち図描くのめんどくちぃ
今度はノコギリ波に変形させます(図5)。三角波にも変形できるしその方が良いのですが、反転・非反転PWMか否かの更新はTOPでのみ行われるという理由があって不可能でした。
…正直ちょっと気持ち悪いですねこれは。
ちなみに少し見やすくなるように変調率が大きくなると基本波が動く方向を示しています。
これはちょっと曲者で他のPWM法と違い、過変調になるまで変調率に対する基本波成分はほぼ線形にはなっていません。スイッチング角度を基本波成分の振幅から求めると
となります。過程は省略します。(図6)を見ればいかにこの式が非線形かが理解できると思います。
このスイッチング角度から変調率を求め、ルックアップテーブルに保存することで電圧跳躍を最小限に抑えます。
ね、簡単でしょ。
おわり
さてみなさんArduinoで同期PWM・非同期PWMを出すことはできましたか?\はーい/
拙い記事ですが少しでも参考になればと思います。
あとVVVFは沼です。
ではでは
CHMPWM生成プログラムをpythonからmatlabに移行した
前置き(いらない)
最近気温がちょっとずつ下がってきて秋の訪れを感じます。
何もしてないのに時間が過ぎていてちょっと怖いです…。
CHMPWM(最適化PWM)とは
大容量インバータなどでPWM周波数をどうしても下げなければいけない場合、どうしても高調波含有量による電動機損失が問題になります。(テンプレ)
この問題を最小限にするため、電流の高調波成分が最小になるようにノッチ角を設定するPWMを高調波電流最小化PWM(CHM: Current Harmonic Minimum)と言います。自己満足です。電流の高調波含有量を最小にすることで、電流リプルによるトルクリプルあるいは電動機の温度上昇を最小限に抑えます。
matlabに便利な関数があると聞いて
僕は前まで適当にpythonでGAアルゴリズム(最近流行りの遺伝的アルゴリズム)を使ってノッチ角を生成していたのですが、matlabにてfmincon関数という便利な最適化関数を使ってノッチ角を生成できそうなので今回はこれを用いてノッチ角を生成してみます。
最小化する評価関数を求める
今回は高調波電流を最小にすることを考えます。
例としてノッチ角をと設定し[図1]のようにPWM波形を生成するとして、次の高調波電圧の振幅は、1/4サイクル毎に対称な波形なので項は消えて奇次高調波の項のみになり、
従って高調波電流は、次の高調波電流実効値を、次の高調波電流振幅を、電動機一相あたり実効漏れインダクタンスを、を基本波角周波数とすると、
ただし、3倍調波は三相結線では流れないので考慮しません。(この式から外れます。)
実装
fmincon関数に関しては他の記事の方が詳しく説明してくれます!!!!!!!
はい!!!!!!!!!!!!
あとは初期値とかで気をつけてもらえれば問題なく生成できるはずです。
生成できた!やったね
さすがmatlabですね、たった108秒ちょいで生成できました。[図2]pythonだと僕の実装力がないせいか5分くらいかかってたのでかなり高速化されています。ちなみにTHD計算のところで結構時間を取られてるみたいでした。fminconの最適化処理はかなり早く済んでいました。今回初期値はかなり適当に設定したのでガバガバです。本来はあらゆる場合の初期値を同時生成し、その中からもっとも良好な波形を選び切り替えるという処理を行って最適PWMを生成します。例として[図3]を参照してください。ノッチ角がカチャカチャ切り替わってるのがお分かりいただけると思います。まあつまり大域的最小解になるよう初期値を常に切り替えてるってことです。
終わり
と言うことで今回はCHMPWMのノッチ角生成をmatlabにやらせてみました。
結果としてpython生成よりかなり処理が早くなったので今後CHMPWMのノッチ角を生成することがあったらmatlabに任せてみようと思います。python苦手です
ArduinoMegaくんでVVVFの同期モード・非同期モードの実装② -非同期PWMの生成-
前置き(いらない)
前のブログからメチャクチャに期間空いちゃいましたね…。
怒らないでください、やる気が出なかっただけです…。
あとこれ結構前にやったことなので色々適当だったりして正直恥ずかしいです。
需要があれば。
非同期PWMを出すために必要なこと
正弦波のルックアップテーブルを作成
非同期PWMを出すためには、基本波の正弦波を正確に計算できるようにしなくてはなりません。しかしArduinoなどの比較的低速なマイコンでは、毎回sinの値を計算していては速度が足りません。そこで、sinの値を格納したルックアップテーブルを作成すれば、メモリから直接取り出すだけでsinの値を得ることができ、計算の必要がありません。
タイマー割り込みで正確な周波数を出力
正確な周波数を得るためには、θを正確な周期で加算していかなくてはなりません。loop文の中でdelay関数を用いてθを加算する方法だと、他の処理の時間による誤差があり、正確な周波数を得ることは不可能に近いです。そこで、タイマー割り込みを用いて正確な時間で割り込みすることにより正確な周波数を得ることとします。
結局…
つまり非同期PWMを出すためには
- 正弦波のルックアップテーブルの作成
- タイマー割り込み
が必要になりそうです。
タイマー割り込みで周波数を正確に出力
タイマー割り込み
タイマー割り込みの周期ですが、経験則から10kHzくらいが最適だと勝手に思い込んでるので10kHzで実装します。PWMを出すタイマーとは別のタイマーで動作させます。
θは整数型で宣言
θの変数での表現方法は、符号なし32bit整数とし、1周期(360°)分を2^31=2147483648として考えます。(最大の2^32-1=4294967295にしないのは理由があります…。これは後ほど。)これは、ArduinoにFPUなどの高速に浮動小数点演算を行う装置がないことと、処理時間と周波数解像度のトレードオフを考慮し32bitとしました。
剰余の処理を工夫
さらなる高速動作を実現するため、θを循環的に変化させるための剰余の処理も工夫をし、高速化を実現しました。除数aが2の累乗の場合、AND演算をすることで以下のように簡単に剰余を得ることができます。
- x mod a == x & a-1 (ただしa=2^n)
このような理由で、1周期を最大値の2^32-1ではなく、2^31で表現しました。2^32-1は2の累乗ではありませんからね。
正弦波のルックアップテーブルを作成
2の累乗の長さで作成
正弦波のルックアップテーブルですが、長さ2^11=2048、float型で±1の間で変化するものをU, V, Wの3相分作成しました。2048というのはこれまた経験則で決めたものです。これくらいあればまあいけるでしょう(適当)。長さを2の累乗にしたのにも理由があって、θをビットシフトするだけでルックアップテーブル参照用に換算することができるからです。また、ついでに3次高調波重畳の基本波や、空間ベクトル変調用の基本波も作成しておきました(二次元配列にしました。)。ただし、RAMの容量は小さいので、ルックアップテーブルはフラッシュメモリ側で記憶するようにしました。
電圧補償器用の配列の作成
言い忘れていましたが、キャリアベースPWMの場合、そのままのPWMでは含有されている基本波成分の振幅と設定されている電圧値が一致しません。例えば電圧を1に設定したら基本波を最大量含有している1パルスの波形になるのが理想ですが、実際は過変調になる手前の波形になってしまい理想電圧値と実際の電圧値に誤差が生じていることがわかります。これを補正するために、電圧補償用の配列を作成しました。長さはとりあえず1000とし、float型で作成しました。
過変調の処理
過変調(変調率が1を超えている場合)、最終的なPWMデューティー比を設定するOCRnxに値を入れるとオーバーフローを起こしてしまいます。そのため、65535までのリミッタをかけ、オーバーフローが起きないようにします。
Arduinoで非同期PWMを出力!
はい、ということで皆さんできたでしょうか。あ、ソースコードは載せません。
まあ参考にでもなれば幸いでございます。
次回は同期PWMを出力してみようと思います。僕のやる気が出るまでお待ちください。
おわり
みんな、SHEPWMやろうぜ!!!!!!!!!!!!!!!!!!!!!!!!!!!
前置き(いらない)
なんの部活に入るべきだろうか、ロボコン?それとも電気通信?
めちゃ迷ってるのである。
うーん、兼部という選択肢も可能だが…
と言うことで今回はSHEPWMを解説しようと思う。SHEPWMは貴方が思っているより簡単なので、安心して欲しい。
キャリアベースのPWMの問題点
キャリアベースのPWMでは、交流電圧・交流電流をインバーターで得ると同時に、低次の高調波を除去している。
キャリア周波数が高いほど、低次の高調波は除去されやすい。
しかし、キャリア周波数が低いと、低次の高調波は除去されにくくなり、電動機の損失が増大する。
GTOインバーターなどで高速スイッチング特性が悪い素子を使っている場合、キャリア周波数を高くすることが困難なため、低次の高調波の成分が増大し、電動機の損失も増大してしまう。
SHEPWM(Selective Harmonic Elimination PWM・特定高調波除去PWM)とは
このような低周波スイッチング時における低次高調波問題を解決する方法として、交流電圧1周期分のパルス配置・パルス幅の組み合わせ次第で低次の高調波を除去できると言うことが示されている。
したがって、キャリア周波数が低い状態でも、パルス配置・パルス幅を変えれば、特定の希望する低次の高調波を除去することが可能である。
このことから、特定の高調波を除去する方法として、SHEPWM(Selective Harmonic Elimination PWM・特定高調波除去PWM)と言うPWM方式が考案されている。
第5,7次高調波を除去する例(特定高調波2波除去PWM)
IMにとって特に問題になる第5,7次高調波を除去するPWM波形の生成方法の紹介をする。スイッチング角度をα1,α2,α3とおく。このPWM波形をフーリエ展開すると、sin項は0となり、cos項の第n次高調波のフーリエ係数Cnは以下の式のようになる。
また、基本波成分Emは次式である。
(1)
第5,7次高調波を除去したいので、
(2)
となる。したがって(1)(2)より、
となり、この連立方程式を解けば、スイッチング角度α1,α2,α3を得ることができる。
また基本波振幅Emを変えれば、各αは変化することがわかる。
このように方程式を解けば、簡単にスイッチング角度を算出することが可能である。αの数を変えても、除去したい高調波を変えても、同様に算出することができる。
SHEPWMの問題点
特定の高調波を除去できるSHEPWMだが、もちろん悪い点もある。
SHEPWMは特定の高調波を除去できるが、それ以外の高調波はおろそかになり、除去された高調波以外は増大してしまう可能性がある。
SHEPWMはスイッチング角度をあらかじめ計算してROMなどに保管して読み出すという方式をとるが、各変調率ごとのデータを保存するため、ROM容量が大きくなってしまう。ある程度ROM容量を小さくする工夫はあるが、それでも多くの容量を占有してしまう。
また、スイッチング時間のデータは飛び飛びになってしまうため、基本波周波数が低周波の時の効率が低下してしまう。
まとめ
読者の皆さんは、SHEPWMをやるべきである。SHEPWMの変調波形の音は世界最高の芸術と言っても過言ではない。
おわり
ArduinoMegaくんでVVVFの同期モード・非同期モードの実装① -PWM周波数を変える-
前置き(いらない)
春なのになんか寒いです。なんで
今回は、ArduinoMegaにVVVFの同期モード・非同期モードの実装をしていこうと思います。中3の自由研究でやったやつです。
SPWMってなんだよ?!?!?!?!!
SPWM = Sinusoidal PWM = 正弦波パルス幅変調
パルス幅を正弦波状に変化させて、正弦波作ろうぜってやつです。
この信号のONとOFFの比率をDuty比と言ったりします。
Duty比を変えることで、電圧の平均値を変化させます。
信号は三角波(キャリア)と比較することで生成できます。
ArduinoMegaくんについて
ArduinoMegaくんは、見ての通りArduinoUnoに比べて格段にインターフェースが豊富です。
実は44,45,46番ピンがPWM出力できるようなので、今回はそこを使いまくって行きます。
出力方法について
AnalogWriteは使いません。AnalogWriteのPWM周波数は固定で400Hzくらいになっているからです。嫌です。死んでください
今回はArduinoのレジスタを叩いてPWM信号を出して行きます。レジスタ叩き大好き♡チュッチュッ♡♡
非同期モードの変調
非同期モードは、名前の通り比較波の周波数と信号波の正弦波の周波数が同期してない状態です。
キャリア周波数が一定と言ったほうが分かりやすいでしょうか。
ちなみにこの図の波形は線間電圧と言って、例えばU-VとかV-Wのような相と相の間の電圧を表しています。このような波形がマイコンから直接出てくるわけではありませんので注意してください。マイコンから出るのは線間電圧ではなく、相電圧です。(前まで勘違いしてた…)
レジスタをいじってPWM周波数を変えよう
ということでプログラミングに入っていきます。まずPWM周波数を変えられないと話になりませんから、PWM周波数を変えられるようなプログラムを考えます。
Arduinoにはレジスタというのがありまして、今回はタイマーレジスタをいじっていきます。時間関係のレジスタはそのままPWM出力に関係しているので、タイマーレジスタをいじればPWM出力に関するパラメーターを変更できます。
タイマーの設定
まずはArduinoMegaのピンの配置図を見てみましょう。(画像はネットから適当に拾ってきたやつです)
この図から分かる通り、44,45,46番ピンは、OC5x、ちまりTimer5に対応しているピンなので、今回はTimer5のレジスタを容赦なくイジっていきます。
まず、仕組みが分からないと何もできないので、解説していきます。PWMを出力している仕組みを簡単に解説すると、まずTCNTxがカウント開始→OCRnxとコンペアマッチ(比較)→OCnx(出力)が変化という感じになっています。これだと正直分かりづらいので、図にしてみました:
はい。だいたいこんな感じですね。TCNTxは、Arduinoのクロックに基づいてカウントアップしていき、最大値になったら0に戻り、またカウントアップしています。この例ではノコギリ波になっていますね。ノコギリ波(キャリア)とOCRnxを比較して、出力信号を作っているといった仕組みになっています。
PWMの周期を変更するには、このTCNTxの増加する速さを変更すればいけそうですが、それはやりません。TCNTxは、Arduinoのクロック(16MHz)を分周して、その信号でインクリメントされているからです。分周比は、1,8,64,256,1024の中からしか選べないため、必然的にPWM周波数はこの5種類の中からしか選べません。
ということで、今回は最大値を変更することでPWM周期を変更するという手法を取ります。Timer5は16bitタイマーなので、最大値は0~65535までの65536通りの値をとることができ、PWMの設定の自由度がかなりあります。なおタイマーには動作モードが存在しており、
①標準モード(最大値TOPが固定されているタイマー)
②CTCモード(最大値TOPを変更できるタイマー)
③高速PWMモード(PWM出力に使える。ノコギリ波)
④位相基準PWMモード(PWM出力に使える。三角波)
⑤周波数基準PWMモード(PWM出力に使える。三角波)
この5種類があります。④と⑤の位相基準と周波数基準の違いについては時が来たら紹介します。
さて、今回は④の位相基準PWMモードを使ってキャリア周波数可変のPWMを実装していきます。キャリアはSPWMの実装を想定して三角波としました。
実装にあたってはatmega2560のデータシートを参考にしました。いちいちレジスタの説明するのとかめんどくさいので各自で見てください。
あ、言い忘れていましたがここにはソースコードを載せない方針で行きます。載せ方わかんない
脳死でコピーする輩が出そうで嫌なのでソースコードは載せません。ご了承ください。
終わり
とりあえずPWM周波数が変えられましたね!
とりあえず第一段階終了です。お疲れ様でした!
次回は非同期モードの実装をやっていきます!ではでは