chottoshitahanashi’s diary

基本的に間違ったことばかり書いてるブログ。検索ひっかかるな

PWMの実効値

Arduino GPIOの最大電流値40mAを超えていないか知りたい実効値かピーク値かわからないけどおそらくピーク値と考えてピーク電流値を考えてみる。

『パルス波』の実効値・平均値の求め方 - Electrical Informationの計算によりPWMで0Vと5Vが同じ時間現れる場合(analogWrite(.., 127))実効値はピークの1/√2(0V, 0AとピークV,ピークIが交互に現れるから消費電力0とピークVxピークIが交互に現れて平均消費電力0.5xピークVxピークI=(1/√2ピークV)x(1/√2ピークI)でも計算可)。今使ってるテスターは真の実効値を出すのでピークを見るには√2すればよい。前のエントリの測定結果をピーク値換算して

[抵抗149.1Ω]
電流値は19.176mA、ブザー間電圧0.256V、抵抗間電圧2.828V。
ブザーを外した場合の電流20.2mA、抵抗間電圧3.03V。
[抵抗99.8Ω]
電流値26.0mAmA、ブザー間電圧0.337V、抵抗間電圧2.454V。


電流値は超えてないけどブザーを外した時の電圧、つまりGPIOの電圧が5Vのはずなのに3V程度しか出てない。
この値あんまり信用できないな、どうやって確かめたらいいだろう?

追記1:Arduino IDEのSerial Plotterというのを使ってみた。シリアル通信が9600bpsで6番ピンのPWM周波数が980Hzなんでサンプリングにちょうどいい。
f:id:name-3333:20220404125731p:plain

#define PROBE_PIN A0
#define SOUND_PIN 6
 
void setup() {
  Serial.begin(9600);
  pinMode(PROBE_PIN,  INPUT);
  pinMode(SOUND_PIN,  OUTPUT);
  analogWrite(SOUND_PIN, 128);
}
 
void loop() {
  int value = analogRead(PROBE_PIN);
  Serial.println(value);
}

analogWrite()に128を出してるのにグラフを見ると等間隔になってない。
見るとだいたいデューティ比0.4くらい。上のリンクを参考に補正して

>>> math.sqrt(0.4)
0.6324555320336759
>>> 2.14*1.0/0.632
3.386075949367089

GPIO PIN6-GND間電圧直接測定2.54V (AC)。
2.54*1.0/0.632=4.02Vピーク。まだ足りない。


追記2:
オリックス・レンテック | 方形波の性質と計測上の扱い - 計測器・測定器玉手箱 | ORIX Rentec Corporation こちらに大事なことが書かれてあった。

さらに、方形波は多くの場合直流分を含みますが、交流計測器の多くは入力がAC結合されているため、直流分を除いた値が表示されます。
直流分を含む値を求める場合は、直流分だけを取り出して別途計測し、両者の二乗の和の平方根から算出します。

あーこれか。もう一度計算してみる。面倒なのでもう画像で。
f:id:name-3333:20220404212119p:plain
4.45V。惜しい!
ん、あそうかなぜ直流分電圧に交流電圧の実効値足したらピークが出ると思ったんだろう?てか電圧と電流の実効値は同じように計算されるんだから電流ピークは電流実効値x(電圧ピーク/電圧実効値)=13.56x(5.0/2.181)=31mA。
更に計算続けるとkをデューティー比、Veを実効値としてV=Ve*√(k-k^2)で計算できそうなことがわかった。また写真張り付け
f:id:name-3333:20220404215301j:plain
これで計算するとピークは5.18V、デューティー比の値読み取りが適当なことを考えればまあまあじゃないか。テスターの実効値は信用できそう。じゃあ上のピーク電流値も信用できそう。


結論、オシロが欲しい