« Arduino UNO R4 minima 電源供給方法でクロックが変わる#6 | トップページ | Arduino UNO R4で2つの1Hz信号の位相変化を見る »

2025年6月 3日 (火)

UNO R4はanalogWrite(n,128)でデュティー50%の方形波が出るぞ

Arduino UNO R3のanalogWriteはちょいと欠陥品。
 ・2020年2月10日:ArduinoのanalogWrite 1/255なの?

D6ポートにデューティ50%の方形波を出すつもりで
  analogWrite(6 ,128)
としても、デューティ50.4%くらいの方形波が出てきます。
きっちり50%にしたいのなら、
  analogWrite(6,127)
としなくちゃなりません。
そして、D9,D10,D11,D3ポートへのPWMだと
  analogWrite(3 ,127)
  analogWrite(3 ,128)
これのどちらも50%にならないのです。
(D5,D6とは周波数も変わって2.040ms周期)

6つの50%デューティの方形波を得たいスケッチ

/* duty 50%の方形波を出すつもり */
void setup() {
analogWrite(6, 128); // OC0A
analogWrite(5, 128); // OC0B
analogWrite(9, 128); // OC1A
analogWrite(10,128); // OC1B
analogWrite(11,128); // OC2A
analogWrite(3, 128); // OC2B
}
void loop() { }

これだとUNO R3でもUNO R4、どちらでも動きます。
しかし、UNO R3だと前述のしがらみが残り、analogWriteと
呼ぶには誤差が大きすぎます。

UNO R4だとどうでしょか。
周波数は6つとも同じで490Hz(ほど)になってます。
   例のジッタで下位桁が変動
そしてデューティは、128できっちり50%。
さて、他の数値は・・・
  0だとLに張り付き
  1だと8μsだけHのパルス。
  254で16μsだけL。
  255で8μsだけL。
  256でHに張り付き。
エエ感じで「val/256」のanalogWriteしてます。

ただ気になったのが、6つのPWM出力ポートに出てくる
周波数が「3つ・3つ」で微妙に違うのです。
  D6=D11=D3
  D5=D9=D10
この組みになっていて、例えばD5とD6の出力波形を
オシロで観察すると、ゆっくりと波形が流れるのです。
1分ちょいで一周します。
クロックの大もとは同じですし、使ってるタイマの
分周比が微妙に異なっているのかと推測しています。

※UNO R4での微妙な周波数差
黄色がD6ポートのPWM。緑がD5ポート。
Dd11_20250603151001
16秒経過↓で1/4サイクルほどのズレが発生。
Dd12_20250603151001
緑が左へズレて行きます。

※参
Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMの例
ラズピコ analogWriteの誤差



|

« Arduino UNO R4 minima 電源供給方法でクロックが変わる#6 | トップページ | Arduino UNO R4で2つの1Hz信号の位相変化を見る »

Arduino」カテゴリの記事

Arduino UNO R4」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« Arduino UNO R4 minima 電源供給方法でクロックが変わる#6 | トップページ | Arduino UNO R4で2つの1Hz信号の位相変化を見る »