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%デューティの波形を出力すると考えると
以下のようなプログラムを作成します。

特殊設定
ビットデバイス説明ワードデバイス説明
M8400PWM0_連続出力D8400PWM0 DeviceNo
M8401PWM0_入力LOWER_LIMITチェックD8401PWM0 Frequency(Run中変更可)(初期値50)
M8402PWM0_入力UPPER_LIMITチェックD8402PWM0 Duty(Run中変更可)(初期値50)
M8403PWM0_OUT_LOWER使用D8403PWM0 カウント数(初期値0)
M8404PWM0_OUT_UPPER使用D8404PWM0 分解能(初期値8)
D8405PWM0入力の最小値(初期値0)
D8406PWM0入力の最大値(初期値255)
D8407PWM0出力の最小値(初期値0)
D8408PWM0出力の最大値(初期値255)
D8409PWM0 予備
M8410PWM1_連続出力D8410PWM1 DeviceNo
M8411PWM1_入力LOWER_LIMITチェックD8411PWM1 Frequency(Run中変更可)(初期値50)
M8412PWM1_入力UPPER_LIMITチェックD8412PWM1 Duty(Run中変更可)(初期値50)
M8413PWM1_OUT_LOWER使用D8413PWM1 カウント数(初期値0)
M8414PWM1_OUT_UPPER使用D8414PWM1 分解能(初期値8)
D8415PWM1入力の最小値(初期値0)
D8416PWM1入力の最大値(初期値255)
D8417PWM1 出力の最小値(初期値0)
D8418PWM1 出力の最大値(初期値255)
D8419PWM1 予備

使用例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
502020010485750.019073486
50182002621430.076293945
5016200655350.305175781
5015200327670.610332937
5014200163831.220628624
501320081922.441108263
501220040954.881620698
501120020489.760858956
2500150.40327670.012207031
5000140.20163830.012207031
10000130.1081910.012207031
20000120.05040950.012207031
75000101.33333E-02010230.013020833
15000096.66667E-0305110.013020833
20000080.00502550.01953125
30000083.33333E-0302550.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)に入れていますのでご確認ください。