前置き(いらない)
春なのになんか寒いです。なんで
今回は、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周波数が変えられましたね!
とりあえず第一段階終了です。お疲れ様でした!
次回は非同期モードの実装をやっていきます!ではでは