強度とパルス幅

PWM信号のDuty比と超音波出力の間には非線形な関係がある. この関係を補正するために, PulseWidthEncoderを使用できる.

ファームウェア内部には, Gain/FociSTM/GainSTMの強度 (EmitIntensity) 値 () とModulationの振幅データ () をかけ合わせたものをで割った強度値 () をインデックスにして, PWM信号のパルス幅 () を決定するテーブルがある. PulseWidthEncoderを送信することで, このテーブルを変更できる. なお, PWM信号の周期は512である.

デフォルトでは, 強度値と超音波の出力が (理論上) 線形になるように, となるテーブルが書き込まれている. ここでは最も近い整数を表す.

例えば, 以下のようにすると, 強度値とパルス幅の関係が線形になる (すなわち, 強度値と超音波出力は非線形になる).

use autd3::prelude::*;
fn main() {
let _ =
PulseWidthEncoder::new(|_dev| |i| PulseWidth::from_duty(i.0 as f32 / 510.0).unwrap());
}
#include<autd3.hpp>
#include<autd3/link/nop.hpp>
#include<vector>
int main() {
using namespace autd3;
auto autd =
Controller::open({AUTD3{}}, link::Nop{});
PulseWidthEncoder([](const auto& dev) {
  return [](const auto i) {
    return PulseWidth::from_duty(static_cast<float>(i.value()) / 510.0f);
  };
});
return 0; }
using AUTD3Sharp;
new PulseWidthEncoder(_dev => i => PulseWidth.FromDuty((float)i.Item1 / 510.0f));
from pyautd3 import PulseWidthEncoder, PulseWidth
PulseWidthEncoder(lambda _dev: lambda i: PulseWidth.from_duty(i.value / 510.0))

コンストラクタの引数は各デバイスに対して, テーブルのインデックスを引数にパルス幅を返す関数を返す関数Fn(&Device) -> Fn(EmitIntensity) -> PulseWidthである.