パルス生成関連の機能(PULSE命令)について
パルス生成関連の機能はワードデバイスを使用するため、連枝のProfessinal版が必要です。
連枝では、用意された命令のledcを用いて、指定周波数の指定デューティ比のパルスを出力することができます。
WROOM32では、0~12チャンネル用意されていますが、連枝の本体の関係で、本バージョンでは0と1のみ使用できます。
今後、チャンネル数を増やす予定です。
また、指定パルス数で停止する制御は、タイマー割込みを使用して実現できるようですので、こちらも今後機能の提供する予定です。
- 無限パルスの制御・・・周波数可変、デューティ可変
- RCサーボ制御・・・20ms周期[50Hz] 設定により0.15ms-2.5msの範囲で 制御が可能
- 指定パルス数で停止する制御(未対応)・・・指定周波数、指定デューティの波形を指定個数のパルス出力する機能です。
PULSE命令について
PULSE命令を以下に示します。
指定パルス数で停止する制御は本来の連枝でのPULSE命令です。
しかし、現在は未対応です。今後のバージョンアップでサポート予定です。
ですので、使用する場合、必ずパルス数は0を指定してください。0以外は未対応となります。
1番目:Sチャンネル番号(1桁)デューティ比(2桁)
2番目:周波数[Hz]
3番目:パルス数[回] 0回と指定
固定周波数、固定デューティ比制御
また、チャンネル番号に対して、IO番号を指定することになります。
この番号指定は、初期設定にて行います。0チャンネルのデバイス番号はD8400となります。
そのため、DIO25に50Hz60%デューティの波形を出力すると考えると
以下のようなプログラムを作成します。
ビットデバイス | 説明 | ワードデバイス | 説明 |
---|---|---|---|
M8400 | PWM0_連続出力 | D8400 | PWM0 DeviceNo |
M8401 | PWM0_入力LOWER_LIMITチェック | D8401 | PWM0 Frequency(Run中変更可)(初期値50) |
M8402 | PWM0_入力UPPER_LIMITチェック | D8402 | PWM0 Duty(Run中変更可)(初期値50) |
M8403 | PWM0_OUT_LOWER使用 | D8403 | PWM0 カウント数(初期値0) |
M8404 | PWM0_OUT_UPPER使用 | D8404 | PWM0 分解能(初期値8) |
D8405 | PWM0入力の最小値(初期値0) | ||
D8406 | PWM0入力の最大値(初期値255) | ||
D8407 | PWM0出力の最小値(初期値0) | ||
D8408 | PWM0出力の最大値(初期値255) | ||
D8409 | PWM0 予備 | ||
M8410 | PWM1_連続出力 | D8410 | PWM1 DeviceNo |
M8411 | PWM1_入力LOWER_LIMITチェック | D8411 | PWM1 Frequency(Run中変更可)(初期値50) |
M8412 | PWM1_入力UPPER_LIMITチェック | D8412 | PWM1 Duty(Run中変更可)(初期値50) |
M8413 | PWM1_OUT_LOWER使用 | D8413 | PWM1 カウント数(初期値0) |
M8414 | PWM1_OUT_UPPER使用 | D8414 | PWM1 分解能(初期値8) |
D8415 | PWM1入力の最小値(初期値0) | ||
D8416 | PWM1入力の最大値(初期値255) | ||
D8417 | PWM1 出力の最小値(初期値0) | ||
D8418 | PWM1 出力の最大値(初期値255) | ||
D8419 | PWM1 予備 |
使用例1.2軸の制御(チャンネル0:25ピン、チャンネル1:26ピン)
0チャンネル:DIO25のピンに50Hzのパルスを出力
X21:ONでデューティ比20%、X23:ONでデューティ比60%
1チャンネル:DIO26のピンに50Hzのパルスを出力
X34:ONでデューティ比30%、X35:ONでデューティ比40%
※LEDC命令で使用する、周波数および分解能の設定は、すべてのチャンネルで
共通となります。異なる周波数・分解能の波形を同時に出力することはできません。
固定周波数、可変デューティ比制御
周波数を固定し、デューティ比を可変する制御が行えます。
この場合、デューティ比の指定を0としてください。
特殊設定となるデバイスD8402またはD8412で設定された値をデューティ比の
指令値として扱います。
また、指令値の範囲は、分解能により異なります。(初期値は8ビット0-255)
使用例2.デューティ比動作中可変制御
AD変換で取り込んだ変換値をデューティ比として使用します。
ポイントとして、AD変換で取り込んだ値(D0)をD8402とD8412に書き込んでいるところです。
これにより、波形出力中にPULSEのデューティ比を変えることができます。
今回、分解能の初期値は8となっているので、0-255の指定です。
この場合、255を超えると、波形が正しく出力されなくなります。
可変周波数、可変デューティ比制御
PULSE命令の周波数設定を0と指定してください。
周波数およびデューティ比とも実行時に変更することができます。
ただし、波形出力中に周波数は変更できません。
デューティ比のみ変えることができます。
また、チャンネルごとで異なる周波数を設定し同時に出力することはできません。
(これは、CPUの仕様です)
変更する場合、周波数に対する分解能についてご注意ください。
周波数が高くなると指定できる分解能が少なくなります。当方で調べた
設定できる周波数に対する分解能の表を記載いたします。
LEDC命令で使用できる周波数に対する分解能が異なります。
そのため、使用する場合には、注意する必要がございます。
周波数 | 分解能 | 周期ms | 最低値 | 最高値 | 1デジタル値の時間us |
---|---|---|---|---|---|
50 | 20 | 20 | 0 | 1048575 | 0.019073486 |
50 | 18 | 20 | 0 | 262143 | 0.076293945 |
50 | 16 | 20 | 0 | 65535 | 0.305175781 |
50 | 15 | 20 | 0 | 32767 | 0.610332937 |
50 | 14 | 20 | 0 | 16383 | 1.220628624 |
50 | 13 | 20 | 0 | 8192 | 2.441108263 |
50 | 12 | 20 | 0 | 4095 | 4.881620698 |
50 | 11 | 20 | 0 | 2048 | 9.760858956 |
2500 | 15 | 0.4 | 0 | 32767 | 0.012207031 |
5000 | 14 | 0.2 | 0 | 16383 | 0.012207031 |
10000 | 13 | 0.1 | 0 | 8191 | 0.012207031 |
20000 | 12 | 0.05 | 0 | 4095 | 0.012207031 |
75000 | 10 | 1.33333E-02 | 0 | 1023 | 0.013020833 |
150000 | 9 | 6.66667E-03 | 0 | 511 | 0.013020833 |
200000 | 8 | 0.005 | 0 | 255 | 0.01953125 |
300000 | 8 | 3.33333E-03 | 0 | 255 | 0.013020833 |
使用例3.可変周波数、可変デューティ比制御
使用例2に変更を加えて、周波数を変更できるようにしています。
ポイントは、PULSEの周波数設定を0としたこと。
INCP命令およびDECP命令で、D8401の値を変更できるようにしたことです。
これにより、チャンネル0を実行したときは、D8401で設定した値の周波数で
パルスを生成いたします。一方、チャンネル1を実行したときは、D8411なのですが、
初期値から変更していないため、50Hzの出力となります。
RCサーボを制御する場合
RCサーボの制御では、一般的に、50Hzのパルスを使用します。
また、回転角の制御については、HIGHの幅を可変することで、角度を変更します。
可変デューティおよびスケーリング(マッピング)を使用することで、
パルス幅を1us程度で可変できることが確認できました。
以下の例がサンプルとなります。
スケーリング(マッピング)の考え方は、ADやDAと同じです。
今回、制御対象のパルスの周期は20msで、HIGHの幅は5ms~2.5msで
制御するプログラムです。
サンプル(pwm_pulse1.mbs)に入れていますのでご確認ください。