モータードライバでモーターを動かしてみる。PLLで。 [Arduino]
さて、ATtiny25/45/85 には、外付けのクリスタルがなくても高速なPWMを出力できるモードがありました。
これは動作クロックとは別で、64MHz(低電圧時は32MHzのモードを使用)まで行けます。
PLL (Phase Locked Loop) というらしい。
ここまで高速ではなくてもいいですが、Timer0を空けるために、Timer1をつかうのでこのモードを使ってみました。
これで前回と同様なものに仕上がったはず。
これで、Arduinoの時間系の関数を使えるはず、、。
回路は前回のそのままで。
しかし、また別に新たな問題が発覚しました。また次回。
これは動作クロックとは別で、64MHz(低電圧時は32MHzのモードを使用)まで行けます。
PLL (Phase Locked Loop) というらしい。
ここまで高速ではなくてもいいですが、Timer0を空けるために、Timer1をつかうのでこのモードを使ってみました。
これで前回と同様なものに仕上がったはず。
// モータードライバ(BD6211F)のテスト (ATtiny45 1MHz版, PLL)
// FIN RIN VREF OUT1 OUT2
// L L x HiZ HiZ スタンバイ
// H L VCC H L 正転
// L H VCC L H 逆転
// H H x L L ブレーキ(停止)
// PWM L VCC H #PWM 正転(PWM制御A)
// PWM H VCC L #PWM 逆転(PWM制御B)(PWM duty比と出力が逆になる)
#define BD6211F_FIN 1 // OC1A
#define BD6211F_RIN 0
void setup() {
pinMode( BD6211F_FIN , OUTPUT ); // OC1A
pinMode( BD6211F_RIN , OUTPUT );
// 20-100kHzほどのPWMを作成
PLLCSR = _BV(LSM) | _BV(PCKE) | _BV(PLLE); // 非同期低速PLL動作 (32MHz)
TCCR1 = _BV(PWM1A) | _BV(COM1A1) | _BV(CS11); // 2分周
OCR1C = 255; // 62.5kHz (32MHz/2分周/256clk)
}
void loop() {
int motorPWM; // モーターの出力
// ■正転(PWM制御A) スピードアップ
for( motorPWM = 1; motorPWM < 16; motorPWM++) {
OCR1A = motorPWM * 17;
digitalWrite( BD6211F_RIN , LOW );
delay( 1000 );
}
// ■ブレーキ(停止)
OCR1A = 255;
digitalWrite( BD6211F_RIN , HIGH );
delay( 2000 );
// ■正転(PWM制御A) スピードダウン
for( motorPWM = 15; motorPWM > 0; motorPWM--) {
OCR1A = motorPWM * 17;
digitalWrite( BD6211F_RIN , LOW );
delay( 1000 );
}
// ■逆転(PWM制御B) スピードアップ
for( motorPWM = 1; motorPWM < 16; motorPWM++) {
OCR1A = 255 - motorPWM * 17;
digitalWrite( BD6211F_RIN , HIGH );
delay( 1000 );
}
// ■スタンバイ
OCR1A = 0;
digitalWrite( BD6211F_RIN , LOW );
delay( 2000 );
// ■逆転(PWM制御B) スピードダウン
for( motorPWM = 15; motorPWM > 0; motorPWM--) {
OCR1A = 255 - motorPWM * 17;
digitalWrite( BD6211F_RIN , HIGH );
delay( 1000 );
}
}
これで、Arduinoの時間系の関数を使えるはず、、。
回路は前回のそのままで。
しかし、また別に新たな問題が発覚しました。また次回。
2014-08-03 22:13
nice!(1)
コメント(0)
トラックバック(0)
コメント 0