PWMオン幅の変化量
さて、前回のプログラムで2[ms]前後を読み取ることに成功しましたが、このままの値をPWM用のレジスタに放り込むとオン時間がほぼMAX値しかとらなくなります。
そこで、読み取った値をなんかしらで変化させ、変化量をゼロからマックスまで持っていきたいとおもいます。
まず、プロポからくる信号の中点は1.5[ms]とします。すると、タイマーで読み取られる値は、
count = 1.5(m)/8(u)
count = 187.5
となります。1より小さい数は誤差として、その時のノイズ状況等により繰り上がったり繰り下がったり、変動します。この数字の時に出力は0にしたいわけです。また、信号の最大値を2.0[ms]最小値を1.0[ms]とすると、カウントの最大値countmaxと、最小値countminは、
countmax = 250
countmin = 125
とまります。これは入力信号をxとおくと、countは、
count = x / 8(u)
となり、入力信号xに対し比例であるといえます。つまりこの比例の式を平行移動と、傾きを何倍かしてやればよいとわかります。まず、countmaxは最大値255、countminは最小値0を取りたいわけですから、この関係式の傾きは
(255-0)/(2.0-1.5)*10^-3=510*10^3
また、元の式の傾きは
(250-125) / (2.0-1.0)*10^-3 = 125*10^-3
であるとわかります。ここで、
510 / 125 ≒4
であるため元の式からある数を引いてから4倍すればよいとわかります。
ある数とは、信号が1.5[ms]の時に0になってもらいたいので引く数は
187 or 188
とします。ここで問題点がアセンブラでは複雑な式を代入することはできません。よって一段階づつ記述します。まずは信号を読み取った値から188を引きます。その数が0以上であれば元の数を4回足し算することで4倍します。
こうすることで、PWMオン幅を0-255ほどに伸ばすことができます。(最大値は255にはならない)
0コメント