2017年3月31日金曜日

ESP8266のanalogWrite、使用上の注意


ESP8266 / ESP-WROOM-02のanalogWriteでおかしな現象に遭遇しました。回避策も合わせてご紹介します。

■複数analogWrite同時出力でちらつく■

Power LEDをドライバに接続して「じわーっと明るくする」制御をしていたところ、「じわー」のところでちらつく現象が発生しました。調べてみると
  • analogWriteの値を1ch変えただけではちらつかない
  • 2ch以上同時に変えるとちらつく

ことがわかりました。ここにたどり着くまで大変でした……。OTA処理で時間を取られているんじゃないか、温度センサーの読み込みでひっかかるんじゃないか、もしかしてPower LEDドライバに問題があるんじゃないか……。「じわー」のプログラムに問題があるんじゃないか……。など。

以下切り分けのためのコードです。ご覧の通り、単純に値を整数で加算していくので、ちらつくはずないですが、激しくチラつきます。

const int kRed = 12;
const int kGreen = 14;
const int kBlue = 15;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Init");
pinMode(kRed, OUTPUT);
pinMode(kGreen, OUTPUT);
pinMode(kBlue, OUTPUT);
}
int counter = 0;
void loop() {
analogWrite(kRed, counter);
analogWrite(kGreen, counter);
analogWrite(kBlue, counter);
counter++;
if (counter >= PWMRANGE) {
counter = 0;
}
delay(10);
}

ここで「もしかして、analogWriteをほぼ同時に複数書き換えると問題が生じるのではないか?」と思い至りました。以前、analogWriteのソースを調べたことがあったのですが、通常のカウンターとコンパレータではなく結構めんどうくさい割り込み処理を使って全部ソフトで処理されていましたので。書き換えの時に処理が追いつかない等でパルス幅が乱れるのだと思います。

で、書き換えたのがこちらです。

const int kRed = 12;
const int kGreen = 14;
const int kBlue = 15;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Init");
pinMode(kRed, OUTPUT);
pinMode(kGreen, OUTPUT);
pinMode(kBlue, OUTPUT);
}
int counter = 0;
void loop() {
if ((counter % 3) == 0)
analogWrite(kRed, counter);
if ((counter % 3) == 1)
analogWrite(kGreen, counter);
if ((counter % 3) == 2)
analogWrite(kBlue, counter);
counter++;
if (counter >= PWMRANGE) {
counter = 0;
}
delay(10);
}

問題なく動作します。ESP8288 / ESP-WROOM-02のanalogWriteを複数同時に書き換えるときにはご注意ください。

■CM■

ここで使用しているPower LEDドライバ基板、スイッチサイエンスのESPrや弊社Board1をそのまま挿して、300mA x 3chのLEDを制御できます。オンボードの温度センサーを使って、基板の温度上昇を検知して出力を下げる、なんてこともできます。

どぞよろしく▶Cap1 - LED Drivers for ESP

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。