サーボモータを制御するためのデータシート製作をしよう!!
実験目的
ATmega48におけるdelay関数の誤差を求め、実時間に即したdelay関数を作る。
実験方法
- 1,マイコンにdelay関数による命令を書き込む
- 2,delayの時間をオシロスコープで測定する
- 3,データを1次関数にフィッティングし特性を求める
使用器具
- オシロスコープ Tekronix TDS 1003
- マイコン ATmega48
結果
msについて
結果は表1,図1 のようになった。最小二乗法で一次関数にフィッティングすると f(t)=7.65t 誤差率 1.268%となる。 これをプログラミングに直すには
void delay_ms(t) { while (t--) _delay_ms(0.13); } とすればいい。
usについて
結果は表2,図2 のようになった。最小二乗法で一次関数にフィッティングするとf(t)=12.50t 誤差率 0.075%となる。 しかし
void delay_us(t) { while (t--) _delay_us(0.08); }
というプログラムを書くと失敗する。なぜなら\verb|delay_us(0.08);|などという短い時間を測れる装置はないからである。このようなプロうグラミングを行うとまた新たな誤差が生じてしまう。そこで
void delay_us(t) {
int tt;
tt = 8*t/100;
while (tt--) _delay_us(1);
}
のように計算式を用いて表すとよい。ただし目安として100usよりも短い時間を入れると計算式は整数しか返せないので打ち込んだ値と大幅にずれる可能性がある。
今後の予定~サーボモータの制御へ~
次に以上のデータを用いてサーボモータを制御する
使用するサーボモータ
- Minis servo RB90
#include <avr/io.h>
#include <avr/delay.h>
void delay_ms(t) { while (t--) _delay_ms(0.13); }
void delay_us(t) {
int tt;
tt = 8*t/100;
while (tt--) _delay_us(1);
}//実測による誤差
int main()
{
int i,j,k;
int sokudo;
int kakudo1,kakudo2;
sokudo=100;
kakudo1 = 1000;
kakudo2 = 2000;
for (;;) {
DDRD = 0xff; // PORT B はすべて出力
// PORTD = _BV(PD1);
// delay_ms(1000);
for(i=0;i
delay_us(kakudo1);
PORTD = _BV(PD1);
delay_us(kakudo1);
}
for(i=0;i<sokudo;i++){
PORTD = _BV(PD0);
delay_us(kakudo2);
PORTD = _BV(PD1);
delay_us(kakudo2);
}
}
return 0;
}