PULSE命令(P版)

パルス生成関連の機能(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)に入れていますのでご確認ください。