三角搬送波を用いたPWM制御の原理

# はじめに
PWM制御とは、連続的なアナログ信号（今回は正弦波とする）に対して信号の平均値が同じなるようなデジタル信号（オン・オフ信号）を用いることで、アナログ信号を『近似』する技術のことである。そこで、今回はまず、以下のグラフのように、三角搬送波を入力信号である正弦波と比較してパルス状の電圧信号を作成する。

![pwm_compare8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/7b547b7a-d020-4d48-bc76-35f5b8c74687.png)


次に、その電源に対して、抵抗負荷とインダクタンスを直列に接続することで、電流を平滑化することで電流をアナログ入力信号と相似な波形に近似できるかに挑戦する。

以下は、パルス状の電圧の波形である。

![pwm_V2_f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/2485400a-77aa-4d65-b1f7-a83d9aef39d0.png)


以下は、パルス状の電圧波形を平滑化した電流波形である。

![pwm_I2_f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/6523f208-344f-4325-ac24-e2b4c5a20104.png)

ちなみに、三角波の周波数を大きくすると以下のように正弦波に近づく。

![pwm_I2_f100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/6061ee83-9e1e-475f-8c58-330ca8fa53e0.png)



 # 導入

以下のような回路を考える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/85448a56-1595-4578-8367-ea03bde2baf4.png)



正弦波信号とそれと同じような大きさを持つ搬送三角波の大きさを比較して、信号の絶対値が搬送三角波の絶対値よりも大きい区間だけ、1もしくは-1を出力して、それ以外は0を出力する。ここで、-1を出力する場合は、信号が負の値になっている場合のときである。このような比較は、コンパレータという装置を用いる。

# コンパレータによる比較
以下のようなプログラムを作成する。

```python PWM_compare.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

num=100000
# パラメータ設定
frequency = 8  # 周波数（Hz）
Voltage_abs = 1.5   # 振幅
time = np.linspace(0, 10,num)  # 0から1秒までの時間軸

# 三角波の生成
def triangle_wave(t, freq, amp):
    return amp * ( np.abs(2 * (t * freq - np.floor(t * freq + 0.5))) )

triangle_wave_values = triangle_wave(time, frequency, Voltage_abs)

#比較用三角波の生成
triangle=[]
# 信号の生成
y=1.0*np.sin(2*math.pi*time)
# 信号と三角波の比較
for i in range(num):
    if y[i]>=0:
        triangle.append(triangle_wave_values[i])
    else:
        triangle.append(-triangle_wave_values[i])

plt.plot(time,triangle,color="red",label="三角波")
plt.plot(time,y,color="blue",label="正弦波信号")
plt.legend()
plt.savefig("pwm_compare"+str(frequency)+".png")
plt.show()
```

これにより、以下のような搬送三角波と正弦波信号の波形が出力される。

![pwm_compare8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/0d7e709e-34e4-4c23-ad4b-09123b5650aa.png)

ちなみに、搬送三角波の周波数を8から10に上昇させると以下のようになる。

![pwm_compare10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/e3f51e87-6990-4bcc-a5f2-cdceec360f33.png)

# パルス状の電圧と平滑化電流

 上記の比較アルゴリズムを参考にして以下のようなプログラムを作成した。

 ただし、電流の平滑化にはRL直列回路の電流過渡現象の数値解析を行う必要性があるので、以下の記事を参考にした。

 https://qiita.com/arairuca/items/a67df0e5116cb28470e5

 作成したプログラムは、以下の通りである。

 ```python PWM_V_I.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

num=100000
# パラメータ設定
frequency = 8  # 周波数（Hz）
Voltage_abs = 1.5   # 振幅
time = np.linspace(0, 10,num)  # 0から1秒までの時間軸

# 三角波の生成
def triangle_wave(t, freq, amp):
    return amp * ( np.abs(2 * (t * freq - np.floor(t * freq + 0.5))) )

triangle_wave_values = triangle_wave(time, frequency, Voltage_abs)

triangle=[]
# 信号の生成
y=1.0*np.sin(2*math.pi*time)
# 信号と三角波の比較　コンパレータ（ある時刻において三角波の絶対値が大きい場合は1もしくは-1を出力して、符号を合わせる。）
def pwm_v(y):

    z=[]
    for i in range(num):
        if y[i]>0:
            if y[i]-triangle_wave_values[i]>0:
                z.append(1)
            else:
                z.append(0)
        else:
            if y[i]+triangle_wave_values[i]<0:
                z.append(-1)
            else:
                z.append(0)      
    return z        
plt.xlabel('t[s]')
plt.ylabel('V[V]')
plt.plot(time,pwm_v(y))
plt.savefig("pwm_V2_f"+str(frequency)+".png")
plt.show()
 
#オイラー法による電流の計算（RL直列回路における微分方程式を数値解析で解く。）
z=pwm_v(y)
R=10
L=1000
I_ary=[]

#初期条件 
I=0

delta_t=L/num
for p in range(num):
    didt=(1/L)*(-R*I+z[p])
    I=I+didt*delta_t
    I_ary.append(I)
plt.xlabel('t[s]')
plt.ylabel('I[A]')
plt.plot(time,I_ary)
plt.savefig("pwm_I2_f"+str(frequency)+".png")
plt.show()
 ```

  これを実行すると2枚のグラフ画像が出力される。

1枚目は以下のような、電圧に関するグラフである。
  
![pwm_V2_f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/44542257-5c99-4a8c-bf26-7117292689f2.png)

このように、信号波の平均値を頼りにパルス状の電圧を出力する。

2枚目は以下のような電流のグラフが出力される。

![pwm_I2_f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/ed3a64dd-6111-4469-ba14-e5d4faf2d2ec.png)

  このように、電流はひずみがあるがおおむね正弦波のような形状をしている。

  ここで、搬送三角波の周波数を10,100に上げたときの電圧と電流の波形の推移を以下に示す。

## 搬送三角波の周波数が10のとき

![pwm_V2_f10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/89cdeadd-fc9d-45d9-b69e-de62705273ee.png)

![pwm_I2_f10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/aa3f664e-d861-461a-a471-c50a5a6d868a.png)

電圧、電流ともに、あまり8のときと比較して変化していないようである。


## 搬送三角波の周波数が100のとき

![pwm_V2_f100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/770c9bdd-a487-4790-b466-5ff0f69e7189.png)

電圧はかなり細かく変化するようになった。

![pwm_I2_f100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/0dfbf71d-c123-4903-97cd-044b8911ecc2.png)

電流は、過渡分を除くとかなり正弦波に近くなった。


# まとめ
今回は、pythonを用いて、PWM制御（インバータ）の原理についてシミュレーションを行った。結果、搬送三角波の周波数が大きいほど平滑化された電流はもとの信号の正弦波波形に近づきやすくなるということが分かった。このように、電圧をデジタル化処理したとしても、その結果となる電流は正弦波というアナログ的な波形に近くなるのは面白い。

# 参考文献

https://amzn.asia/d/cMVLMbj