Arduino SPWMジェネレータ回路–コードの詳細と図

問題を排除するために楽器を試してください





この投稿では、Arduinoを介して正弦波パルス幅変調またはSPWMを生成する方法を学習します。これは、純粋な正弦波インバーター回路または同様のガジェットを作成するために使用できます。

ザ・ Arduino コードは私が開発したもので、これは私の最初のArduinoコードです...そしてそれはかなり見栄えがします



SPWMとは

すでに説明しました opampsを使用してSPWMを生成する方法 私の以前の記事の1つで、ディスクリートコンポーネントを使用して作成する方法と、その重要性について理解するために、この記事を読むことができます。

基本的に、正弦波パルス幅変調の略であるSPWMは、パルスを変調して正弦波形をシミュレートするタイプのパルス変調であり、変調によって純粋な正弦波の特性を実現できます。



SPWMを実装するために、パルスは最初の狭い幅で変調され、サイクルの中心で徐々に広くなり、最後に最後に狭くなってサイクルを終了します。

より正確には、パルスは最も狭い幅で始まり、後続の各パルスで徐々に広くなり、中央のパルスで最も広くなります。その後、シーケンスは続行されますが、反対の変調で、パルスは徐々に狭くなり始めます。サイクルが終了するまで。

ビデオデモ

これは1つのSPWMサイクルを構成し、これはアプリケーション周波数(通常は50Hzまたは60Hz)によって決定される特定のレートで全体にわたって繰り返されます。通常、SPWMは、インバーターまたはコンバーターのMOSFETやBJTなどのパワーデバイスを駆動するために使用されます。

この特別な変調パターンにより、フラットな方形波サイクルで通常見られるような突然の高/低電圧スパイクをスローする代わりに、周波数サイクルが徐々に変化する平均電圧値(RMS値とも呼ばれる)で実行されることが保証されます。

SPWMのPWMを徐々に変更することは、標準の正弦波または正弦波形の指数関数的に上昇/下降するパターンを厳密に複製するように意図的に適用されるため、正弦波PWMまたはSPWMと呼ばれます。

ArduinoでSPWMを生成する

上で説明したSPWMは、いくつかの個別の部品を使用して簡単に実装できます。また、Arduinoを使用すると、波形周期の精度を高めることができます。

次のArduinoコードは、特定のアプリケーションに目的のSPWMを実装するために使用できます。

おやおや!それはひどく大きく見えます、あなたがそれを短くする方法を知っているならば、あなたは確かにあなたの最後でそれを自由に行うかもしれません。

// By Swagatam (my first Arduino Code)
void setup(){
pinMode(8, OUTPUT)
pinMode(9, OUTPUT)
}
void loop(){
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(2000)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
//......
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(2000)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
}
//-------------------------------------//

次の投稿では、上記のArduinoベースのSPWMジェネレーターを使用して 純粋な正弦波インバータ回路を作る ....読み続けます!

上記のSPWMコードは、以下に示すように、パフォーマンスを向上させるためにAtton氏によってさらに改善されました。

/*
This code was based on Swagatam SPWM code with changes made to remove errors. Use this code as you would use any other Swagatam’s works.
Atton Risk 2017
*/
const int sPWMArray[] = {500,500,750,500,1250,500,2000,500,1250,500,750,500,500} // This is the array with the SPWM values change them at will
const int sPWMArrayValues = 13 // You need this since C doesn’t give you the length of an Array
// The pins
const int sPWMpin1 = 10
const int sPWMpin2 = 9
// The pin switches
bool sPWMpin1Status = true
bool sPWMpin2Status = true
void setup()
{
pinMode(sPWMpin1, OUTPUT)
pinMode(sPWMpin2, OUTPUT)
}
void loop()
{
// Loop for pin 1
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin1Status)
{
digitalWrite(sPWMpin1, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = false
}
else
{
digitalWrite(sPWMpin1, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = true
}
}
// Loop for pin 2
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin2Status)
{
digitalWrite(sPWMpin2, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = false
}
else
{
digitalWrite(sPWMpin2, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = true
}
}
}




前:ジュール泥棒による8倍の統一–実証済みの設計 次へ:完全なプログラムコードを備えたArduino純粋な正弦波インバータ回路