PWMでサーボモーター制御(実装編)

まずは動いている動画を。

黄色のスイッチで中立。緑で時計回りに回転。青で反時計回りに回転。
それぞれ、1.0ms、2.0msを超えないように制限しています。
※使っているサーボモーターはGWServo S03T 2BBMGです。

配線はこの通り。

PWMでサーボモーター制御

PWMでサーボモーター制御


PICの電源はPICKit2から供給して、電池ボックスはサーボモーターのための電源になっています。

ソースコードは次のようになっています。

#include <htc.h>

#ifndef _XTAL_FREQ
#define _XTAL_FREQ	500000
#endif

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BORDIS);

void main(void)
{
	OSCCON = 0x03 << 4;	// 500kHz
	CMCON0 = 0x07;
	GPIO = 0x00;
	TRISIO = 0x38;	// input:3, 4, 5, output:0, 1, 2
	ANSEL = 0;
	// PWMの設定
	unsigned char pulse = 0x2F;
	unsigned char pulse2 = (pulse & 0x03) << 4;
	PR2 = 155;
	CCPR1L = pulse >> 2;
	CCP1CON = 0x0C | pulse2;
	T2CON = 0x07;
	TMR2 = 0;
	// 無限ループ
	while (1) {
		if (GPIO5 == 0) {
			if (pulse > 0x20) {
				pulse--;
				pulse2 = (pulse & 0x03) << 4;
				CCPR1L = pulse >> 2;
				CCP1CON = 0x0C | pulse2;
			}
		} else if (GPIO4 == 0) {
			pulse = 0x2F;
			pulse2 = (pulse & 0x03) << 4;
			CCPR1L = pulse >> 2;
			CCP1CON = 0x0C | pulse2;
		} else if (GPIO3 == 0) {
			if (pulse < 0x3E) {
				pulse++;
				pulse2 = (pulse & 0x03) << 4;
				CCPR1L = pulse >> 2;
				CCP1CON = 0x0C | pulse2;
			}
		}
		__delay_ms(100);
	}
}

PWMでのサーボモーターの制御を調べていてPWM周期20msとかだとかなりクロックを低く(500kHz)抑えないといけないので、多くのサイトでは16ビットタイマーを使って独自にカウントして制御していました。
確かにいろいろなセンサーからのデータを処理した結果でサーボモーターを動かすということが多いはずなので、あまり低いクロックで動かすのはもったいない。
次はセンサーを付けて、それの反応としてサーボモーターを動かしてみようと思う。

カテゴリー: PIC タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください