いっぺーちゃんの いろいろやってみよ~

Espruino on ESP32 でPWM & DAC

ESP32ではアナログ出力にPWM(Pulse Width Modulation)とDAC(Digital-Analog Converter)を使用できます。
PWM出力はDAC出力用端子を除く任意の出力端子に割り当てることができます。
DAC出力はPin25とPin26のみ指定できます。

 

PWM出力

PWMは合計8本使用できます。
指定できる周波数はデフォルト周波数(5000Hz)とその他の周波数3種類の合計4種類です。
ただし、その他の周波数は同じ周波数を設定しても使用した分カウントされます。
つまり、1000Hzを3つ指定すると、それ以上デフォルト周波数以外では使用できません。

出力値は0.0~1.0の数値でパルス周期のうちのHigh区間の比率で指定します。
1.0を指定すると全区間Highとなります。
1.0を超えた部分は無視されます。つまり、1.1を指定すると0.1を指定したとみなされます。

このPWM出力はハードウェアで生成されるので、ソフトウェアの動作に影響を受けません。

var pwm0 = Pin(19)          // 端子指定
pwm0.mode('af_output');     // ペリフェラル出力(なくても良いが念のため)

var val = 0.5;              // 出力値
var freq = 1000;            // PWM 周波数 単位Hz
// PWM出力
analogWrite(pwm0, val, {freq: freq});

以下のように周波数指定を省略 or 0を指定 すると、周波数はデフォルト周波数となります。

analogWrite(pwm0, val);
または
analogWrite(pwm0, val, {freq: 0});

デフォルト周波数は  Espruino/targets/esp32/jshardwarePWM.c の以下の部分を修正することで変更できます。
サーボモータを複数接続したい場合など、同一の周波数でたくさんPWMを使いたい場合はここを修正するのた良いでしょう。

#define PWMFreqDefault 5000

 

 

 

DAC出力

アナログ出力にPin25 or Pin26を指定すると、PWMではなく、DAC出力となります。
出力値は0.0 ~ 0.99 でVDDに対する比率で指定します。
PWMと異なり、1.0を指定すると"0V"になるので注意が必要です。
それ以上の1.0を超えた部分はPWM同様無視されます。つまり、1.1を指定すると0.1を指定したとみなされます。
DAC出力なので、周波数を指定しても当然無視されます。

var DAC0 = Pin(25);         // 端子指定
DAC0.mode('af_output');     // ペリフェラル出力(なくても良いが念のため)

var val = 0.5;              // 出力値
// DAC出力
analogWrite(DAC0, val);     // DACは周波数関係ないので設定しない

 

 

 

設定値の飽和処理を入れて欲しかったなぁ。。。