強度とパルス幅
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
である.