第 8 回 モータの制御

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

8-1. DC モータ

DC モータの特性

DC モータは磁石で覆われたケースの中でコイルが磁界を発生させ、回転力を 生じるものです。 コイルが磁石に接近するとブラシによりコイルの極性が反転し、回転を持続す るようになっています。 これをブラシ付きモータと言うこともあります。 DC モータは安価で高出力ですが、ブラシは摩擦で摩耗するため寿命が比較的短 いです。

DC モータは動力を発生させるため、大きなエネルギーを必要とします。その ため、多くの電流が流れます。 例えばマブチモータの FA130 では電源電圧 1.5V に対して、電流は最大で 1A 流れます。 そのため、マイコンには直接接続できません。 通常はリレーやトランジスタのスイッチング回路を使用します。

ダーリントン接続

ダーリントン接続

トランジスタのスイッチング回路において、大電流を制御するにはベース電流 を多く流す必要があります。 しかし、制御側が流せる電流にも限りがあります。 この場合、一つのトランジスタではhFEが足りないということにな ります。 そのため、トランジスタを二段使い、一段目のエミッタを二段目のベースに接 続するのがダーリントン接続です。 一段目のベースに IB を流すと、一段目のコレクタには hFEIBだけ電流が流れるので、エミッタには (1+hFE)IB の電流が流れます。 これが二段目のベースに流れると、二段目のコレクタにはこの hFE 倍流れます。 したがって、一段目、二段目のコレクタ電流の合計は hFEIB+hFE(1+hFE)IB となり、ダーリントン接続により一つのトランジスタとみなすと hFE'=hFE(2+hFE) と二乗よりも大きな利得が得られます。 これにより小さな電流で大きな電流のスイッチングができるようになります。

フライバック(fly back)電圧とフリーホイール(free wheel)ダイオード

モータにはコイルが入っています。 コイルに電流を流すと、コイルは磁界としてエネルギーを蓄えます。 そして、電流を切ると磁界を維持するように電圧が発生します。 これをフライバック電圧と言います。 トランジスタのスイッチング回路を直接接続すると、トランジスタで回路を切 断したとき、トランジスタに大きな逆電圧がかかります。 そのため、トランジスタを保護するため、逆電圧は逃す必要があります。

通電時 フリーホイールダイオード

このフライバック電圧に対して、モータをダイオードで短絡するとダイオード に電流が流れるので、 トランジスタには大きな逆電圧がかからずに済みます。 このモータを短絡するダイオードをフリーホイールダイオードと 呼びます。

保護ダイオード

また、さらにトランジスタを逆電圧から守るため、コレクタ・エミッタ間やベー ス・エミッタ間にダイオードを入れることもあります。

PWM 駆動

フリーホイールダイオードを入れると、モータの電源を切ったとき、ダイ オードに電流が流れます。 これはモータが発電機として仕事をしたことになるので、モータの回転エネル ギーが電気エネルギーに変換されたことになります。 つまり、モータは仕事をした分だけ減速します。

但し、モータはフリーホイールダイオードを接続しても瞬時に回転が止まる訳ではあ りません。 つまり、高速でモータの電源を On-Off を繰り返すと、モータは低速で回転す るようになり、与えた電気エネルギーに対応した仕事をすることになります。 モータをマイコンからスイッチング回路で動作させる際、LED の明るさを変え たように duty 比を変えることでモータの速度を変化できます。

正逆転制御

Hブリッジ

図のように 4 つのスイッチを接続するとスイッチの組み合わせにより次のよ うな 4 種類の制御が可能になります。

正転
正転
逆転
逆転
停止
停止
ブレーキ
ブレーキ
モータをショートすると回転エネルギーが電気エネルギーに変換されるた め、ブレーキがかかります

このモータの制御回路をH ブリッジ回路と言います。

貫通電流

なお、このスイッチの制御において、この図のようにしてしまうと電源をショー トしてしまいます。 この時に流れる電流を貫通電流と呼びます。 制御を行う上で貫通電流が流れないようにすることが重要です。

トランジスタのスイッチング回路(発展)

さて、これをトランジスタでこれを実現するにはどうすればいいでしょうか? 通常のスイッチング回路は電源側に負荷を接続しますが、この回路では電源側 にもスイッチがあるので、原則通りのスイッチング回路では制御できません。

コンプリメント

npnスイッチング回路 pnpスイッチング回路 pnpnpnスイッチング回路

NPN トランジスタのスイッチング回路ではエミッタを直接接地します。 一方、 PNP トランジスタのスイッチング回路を考えると、図のようにエミッ タは電源に接続することになります。 電源側から、 PNP トランジスタのスイッチング回路、負荷、 NPN トランジス タのスイッチング回路、グランドの順に接続することで二つのスイッチで負荷 を挟むことができるようになります。

このとき、 NPN トランジスタと同等の性能の PNP トランジスタを選定する必 要があります。同等の性能である対になるトランジスタのことを コンプリメント と言います。

Hブリッジ

このコンプリメントを使った H ブリッジ回路は図の通りです。

但し、このままでは PNP トランジスタを On, Off するにはベース側に負荷に 与える電源と同じ電圧が必要になります。 マイコンで制御するにはマイコンの電圧によるスイッチング回路を付加する必要 があります。

FETによるHブリッジ

なお、大容量の電流をスイッチするための FET は パワーMOS FET と言います。 通常は N 型のパワー MOS FET を使いますが、このようにコンプリメントが必 要なときは P 型を使います。 なお、MOS FET は高性能ですが、静電気に弱いので取扱いに注意する必要があ ります。

参考: エミッタオープン回路

トランジスタによる定電流回路はベースの電圧に応じて、コレクタに(つまりエ ミッタにも)一定の電流を流す物でした。 ここで、コレクタを直接電源につなぎ、エミッタ側に負荷を接続すると、ベー スの電圧が高いときはベース・エミッタ間電圧が VBE(≒0.6V)に なるように電流が流れ、ベースの電圧が低いときは電流が流れないようになり ます。 この回路は通常 エミッタフォロワ と呼ばれます。 ベースの電圧とエミッタの電圧の変動幅は同じになるので増幅率は 1 ですが、 高周波特性が良く、出力インピーダンスが低いので、オーディオの回路の出力 段等で良く用いられます。 但し、トランジスタは完全に On にならずにベースの電流に比例してコレクタ の電流は流れる状態になります。 そのため、コレクタ・エミッタ間に発生する電圧降下の分、トランジスタに熱 が発生します。 従って、モータの制御等でこの回路を使う際には特にトランジスタの熱対策が 必要になります。

低電圧電源の電源側スイッチング

スイッチング回路では、回路の構成により、信号側の電圧(Vi)と スイッチされる電源側の電圧(Vo)を異なるように設定できます。 バイポーラトランジスタの NPN, PNP と FET の N型, P型の各回路での 制約をまとめると以下のようになります(但し Vi, Vo≥ 0 と仮定します)。

トランジスタ型回路 Vi(OFF) Vi(ON) Vo の制約
NPN BTr npnスイッチング回路 Vi<0.4V(ベース電流が流れないベース電圧) Vi> 0.8V, Ii> 20mA (ベース・エミッタが飽和するベース電圧、ベース電流) 0.2V以上(ベース・エミッタ飽和電圧の最大値)
PNP BTr pnpスイッチング回路 Vi>Vo-0.4V Vi<Vo-0.8V, Ii> -20mA 0.8+0.2V以上(ON 時のベース電圧+ベースエミッタ間飽和電圧)
N型 FET k型スイッチング回路 Vi<1.8V(ドレイン電流が流れないゲート・ソース間電圧) Vi> 4V (ドレイン電流が飽和するゲート・ソース間電圧) 自由(FET の場合ドレイン・ソース間は抵抗と等価)
P型 FET j型スイッチング回路 Vi>Vo-1.8V(ドレイン電流が流れないゲート・ ソース間電圧) Vi< Vo-4V (ドレイン電流が飽和するゲート・ソース間電圧) 4V以上(ON 時のゲート・ソース間電圧)
各スイッチング回路の電気的制限

マイコンで駆動する限り NPN, N型に関しては大した差はありません。 特に大電流が必要な場合、 NPN トランジスタだとコレクタ電流に応じてベー ス電流を多く流す必要が出てきますが、 N型 FET では定められた電圧をかけ ることが全てで、電流はほとんど流れません。 したがって、 N 型 FET の方が望ましいと言えます。 一方、電源側でスイッチングする PNP, P 型に関しては、 Vo の 制約が出てきます。 特に、 P 型 FET では 4V 以上無いと動作できません。 従って、模型のような 1.5V から 3V の電源は P 型 FET で組んだブリッジではコントロールできませ ん。 つまり、模型用のモータなどを駆動する時に、電源側のスイッチングを行うには PNP 型のトランジスタを用いる必要があります。 なお、 PNP 型の入力には Vo の制限がありますが、以下のように、 入力側に NPN のスイッチング回路を入れることで解決できます。

k型スイッチング回路

モータドライバ

このようにモータを動作させるための回路はスイッチング回路の組み合わせで 構成します。 特に、H ブリッジを組むためには、最低でも 4 つのトランジスタが必要です。 モータをコントロールするためのトランジスタを一つの IC にまとめた物 を モータドライバ と呼びます。 モータドライバにはDC モータ用の H ブリッジもありますが、これとは別にス テッピングモータ用の二組二対の回路の入った物もありますので選定する際は 注意する必要があります。

DCモータ用のモータドライバとして代表的なのが東芝の TA7291 シリーズです。 データシートを参照すると下図のような等価回路が書かれています。 全て NPN のトランジスタによりスイッチングが行われます。 従って、グランド側のスイッチング回路は通常のオープンコレクタのスイッチ ング回路です。 一方、電源側のスイッチング回路はエミッタオープンになっています。 エミッタオープンによりベース電圧 Vref を基準電圧としてモータ に与える電圧をコントロールできます。 しかし、Vs と Vrefの差は常に熱エネルギーに変わっ てしまいます。

TA7291

実験

実験8-1

以下の回路を組み、モータの特性を調べます。 A,B と C,D にオシロスコープをつなぎます。 スイッチを入り切りして、その時の電圧の変化を調べます。

回路図
実験1
部品表
機材 数量
ブレッドボード 一式
マブチモータ FA-130RA 1個
ダイオード 1N4007 1本
基板用タクトスイッチ 1個
0.1Ω 5W抵抗 1本
電源装置 1式
オシロスコープ 1式

実験8-2

実験 8-1 のスイッチの部分をパワー MOS FET に変更し、マイコンで制御します。 マイコンには演習 7-3 のスイッチにより Duty 比が変わるプログラムを用意し、 PORTD に FET につなぎます。 Duty 比や全体の周期を切替えて、どのようにモータが回り、どのように電圧 が変化するか調べなさい。

回路図
実験2
部品表
機材 数量
ブレッドボード 一式
電池と電池ボックス(4.5V) 一式
ATtiny2313 一式
マブチモータ FA-130RA 1個
パワー MOS FET 2SK2231 1石
ダイオード 1N4007 2本
10kΩ 1本
22kΩ 1本
基板用タクトスイッチ 1個
0.1Ω 5W抵抗 1本
電源装置 1式
オシロスコープ 1式

なお、ここで指定している FET の 2SK2231 は廃番予定になっている。 代替品としては以下の仕様のものを選択すること。

  1. Nチャネル
  2. 4V駆動
  3. ドレイン電流 3A 以上
  4. オン抵抗が低い(0.2Ω以下など)
  5. オン状態で1Aの電流を流しつづけても安全なこと
プログラム

前回の例6-5または演習6-2 のプログラムをそのまま使います。

注意点

パワー MOS FET は静電気に弱いので取扱いに注意すること

実験8-3

実験 8-2 のスイッチング回路を電源側の PNP トランジスタの構成に変更します。 マイコンの制御は実験 8-2 同様に行います。

電源マークのうち、黒には電源装置を繋ぎます。 モータに 1.5V をかけるには何 V の電源が必要か測定しなさい。

回路図
実験3
部品表
機材 数量
ブレッドボード 一式
電池と電池ボックス(4.5V) 一式
PATtiny2313 一式
マブチモータ FA-130RA 1個
トランジスタ 2SB1018A 1石
トランジスタ 2SC1815 1石
ダイオード 1N4007 2本
100Ω 1本
1kΩ 3本
10kΩ 1本
基板用タクトスイッチ 1個
0.1Ω 5W抵抗 1本
電源装置 1式
オシロスコープ 1式
プログラム

前回の例6-5または演習6-2 のプログラムをそのまま使います。

補足

抵抗値 R の算出方法は次の通りです。 モータの適正負荷時の電流は 500mA です。 スイッチング回路なので、2SB1018A を飽和させるには 1A 以上のコレクタ電 流が望めるようにベース電流を考えます。 2SB1018A の hFE はコレクタ電流が 1A の時、 70 から 240 です。 そのため、ベース電流は最大 1A/70=14.3...mA 必要になります。 ここで、余裕を見てベース電流に 20 mA 流すことにします。 2SB1018A の電源電圧を仮に 3.0V と仮定します。 すると、トランジスタが On になるとき、ベースの電圧は 3.0-0.8Vになりま す。 従って、求める抵抗にかかる電圧は 2.2V、流す電流は 20mA なので、 R=2.2/0.02=110 Ω となります。 E24 系列ではそのままこれでも良いですが、大目に電流を流す分には問題ない ので、 E12(E6) 系列で R=100Ω とします。

実験 8-4

図のようにモータドライバ TA7291P を使ってモータの制御を行いなさい。 二つのスイッチを使ってモータの動作を制御しなさい。 なお、 LED は動作確認用です。

回路図
実験4
部品表
機材 数量
ブレッドボード 一式
電池と電池ボックス(4.5V) 一式
PIC 16F628A と 18pin 以上のゼロプレッシャー IC ソケット 一式
マブチモータ FA-130RA 1個
モータドライバ TA7291P 1個
基板用タクトスイッチ 2個
LED 2本
330Ω 2本
10kΩ 3本
0.1Ω 5W抵抗 1本
3Ω 5W抵抗 1本
10μF 電解コンデンサ 2本
電源装置 1式
オシロスコープ 1式
プログラム

入力スイッチを PD4、 PD5 とし、モータのコントロールは PD0、PD1 で 行うものとします。 接続は回路図の通りとします。

データシートにあるように、入力を切替える際に貫通電流が流れますので、指 示通り切替時に STOP モードに移るようにします。

トランジスタを一定時間 Off にする必要があるので、ここでは割り込みのタ イミングで次のような動作をするとします。

  1. スイッチの位置が保存した物と変わってなければ処理終了
  2. Off になってなければ Off にして処理終了
  3. スイッチの位置を保存する
  4. PD4 が Onの時
    1. PD5 が On ならブレーキ
    2. PD5 が Off なら正転
  5. PD4 が Offの時
    1. PD5 が On なら逆転
    2. PD5 が Off なら Off

なお、データシートで指定されている一定時間は 100μs です。 ATtiny2313 は DIV8ヒューズビットが on の時(デフォルト値)ではプ リスケーラ無しでも 256μs 間隔で割り込みがかかります。 この場合は、割り込み一 回分だけOff にすれば良いです。

訂正報告

プログラム中、ボタンを読むところが、in work,PINDとならな ければならないところ、in work,PORTDとなってました。


;**********
;*  実験8-4 *
;**********
.include <tn2313def.inc>

.cseg
.org 0x0000
	rjmp reset
.org	OVF0addr
	rjmp	timer0vec
.org INT_VECTORS_SIZE
reset:
	ldi	r16,low(RAMEND)
	out	SPL,r16
	ldi	r16,0xff
	out	ddrb, r16
	ldi	r16,0x0f
	out	ddrd, r16
initsleep:
	in	r16,mcucr
	cbr	r16, 1<<sm0 | 1<<sm1	;idlemode
	sbr	r16, 1<<se	; enable sleep
	out	mcucr, r16
inittimer0:
	ldi	r16,0b00000000	;normal mode
	out tccr0a,r16
	ldi	r16,0b00000101	; normal mode, prescaler=1024
	out	tccr0b, r16
	ldi	r16, 0b00000010 ; enable interruption for overflow
	out	timsk, r16

	sei
main:
	sleep	
	rjmp	main

timer0vec:
	rcall	hbridgecnt
	reti

 
 
.def	prev = r16
.def	now = r17
.def	work = r18

.equ	swmask		=	0b00110000
.equ	cntmask		=	0b00000011
.equ	offpattern	=	0b11111100
.equ	breakon		=	0b00000011
.equ	seiten		=	0b00000001
.equ	gyakuten	=	0b00000010

hbridgecnt:
	in		work,PIND	;訂正箇所
	mov		now,work
	andi		now,swmask
	cp		now,prev
	brne	h1
	ret
h1:
	in	work,PORTD	;訂正箇所
	andi	work,cntmask
	brne	setoff
	mov		prev,now
readkey:
	sbrs	now,4
	rjmp	rd4off
rd4on:
	sbrs	now,5
	rjmp	rd4on5off
rd4on5on:	;breakon
	in		work,PORTD
	ori		work,breakon
	out		PORTD,work
	ret
rd4on5off:	;seiten
	in		work,PORTD
	ori		work,seiten
	out		PORTD,work
	ret
rd4off:
	sbrs	now,5
	rjmp	rd4off5off
rd4off5on:	;gyakuten
	in		work,PORTD
	ori		work,gyakuten
	out		PORTD,work
	ret
rd4off5off:	;off
setoff:
	in		work,PORTD
	andi	work,offpattern
	out		PORTD,work
	ret

.exit
補足

R の計算。 R はモータ側のトラブルなどで回路が短絡したときに、 IC を守るための電流 制限抵抗です。 そのため、 Vs が GND に短絡したときに、 IC を流れる電流が最 大定格以下になるようにします。 Pタイプの場合、平均出力電流は 1.0A 以下ですので、Vs=3.0V の 時、 3Ω 以上であれば IC を守れます。 この時、抵抗が消費する電力は 3 W になるので、抵抗の電力は 5W 程度のも のを選ぶ必要があります。

実験 8-5

図のように FET とトランジスタなどでH ブリッジを作りなさい。 また、ATtiny2313 のportPIC にはタクトスイッチを二つつなぎます。 そして、一方のスイッチを押すと正転し、もう一方のスイッチを押すと逆転す るようにしなさい。 但し、切替える時と、両方スイッチを押した時はブレーキがかかるようにしな さい。

回路図
実験5
部品表
機材 数量
ブレッドボード 一式
電池と電池ボックス(4.5V) 一式
ATtiny2313 一式
マブチモータ FA-130RA 1個
パワー MOS FET 2SK2231 2石
トランジスタ 2SB1018A 2石
トランジスタ 2SC1815 2石
ダイオード 1N4007 4本
LED 4本
100Ω 2本
330Ω 4本
1kΩ 6本
10kΩ 2本
22kΩ 2本
基板用タクトスイッチ 2個
0.1Ω 5W抵抗 1本
電源装置 1式
オシロスコープ 1式
プログラム

マイコンでFET などのトランジスタを制御して、正転、逆転の操作を可能にします。 ここで注意しなければならないのは、絶対に貫通電流を流さないようにするこ とです。 トランジスタの性能は同じ品番でも微妙に異なっているのが普通なので、同時 に On や Off の信号を送っても同時に On や Off になる保証はありません。 そのため、切替時は一定時間すべて Off にする必要があります。

入力スイッチを PD4、 PD5 とし、モータのコントロールは PD0 から PD3 で 行うものとします。 接続は回路図の通りとします。

プログラムは実験 8-4 と同様で、出力パターンのみを変えたものになります。


;**********
;*  実験8-5 *
;**********
.include <tn2313def.inc>

.cseg
.org 0x0000
	rjmp reset
.org	OVF0addr
	rjmp	timer0vec
.org INT_VECTORS_SIZE
reset:
	ldi	r16,low(RAMEND)
	out	SPL,r16
	ldi	r16,0xff
	out	ddrb, r16
	ldi	r16,0x0f
	out	ddrd, r16
initsleep:
	in	r16,mcucr
	cbr	r16, 1<<sm0 | 1<<sm1	;idlemode
	sbr	r16, 1<<se	; enable sleep
	out	mcucr, r16
inittimer0:
	ldi	r16,0b00000000	;normal mode
	out tccr0a,r16
	ldi	r16,0b00000101	; normal mode, prescaler=1024
	out	tccr0b, r16
	ldi	r16, 0b00000010 ; enable interruption for overflow
	out	timsk, r16

	sei
main:
	sleep	
	rjmp	main

timer0vec:
	rcall	hbridgecnt
	reti

 
 
.def	prev = r16
.def	now = r17
.def	work = r18

.equ	swmask		=	0b00110000
.equ	cntmask		=	0b00001111
.equ	offpattern	=	0b11110000
.equ	breakon		=	0b00000101
.equ	seiten		=	0b00000110
.equ	gyakuten	=	0b00001001

hbridgecnt:
	in		work,PIND	;訂正箇所
	mov		now,work
	andi	now,swmask
	cp		now,prev
	brne	h1
	ret
h1:
	in		work,PORTD	;訂正箇所
	andi	work,cntmask
	brne	setoff
	mov		prev,now
readkey:
	sbrs	now,4
	rjmp	rd4off
rd4on:
	sbrs	now,5
	rjmp	rd4on5off
rd4on5on:	;breakon
	in		work,PORTD
	ori		work,breakon
	out		PORTD,work
	ret
rd4on5off:	;seiten
	in		work,PORTD
	ori		work,seiten
	out		PORTD,work
	ret
rd4off:
	sbrs	now,5
	rjmp	rd4off5off
rd4off5on:	;gyakuten
	in		work,PORTD
	ori		work,gyakuten
	out		PORTD,work
	ret
rd4off5off:	;off
setoff:
	in		work,PORTD
	andi	work,offpattern
	out		PORTD,work
	ret

.exit

8-2. サーボモータ

ラジコンなどで使用されるサーボモータはパルスにより角度を制御するモータ です。 サーボモータには電源、グランド、制御信号の三本の線があります。 制御信号は周期 20ms 程度のパルスを使用します。そして、 duty 比で角度を調整しま す。 1.5ms ± 0.5ms で向きが変化します。 duty 比だと 5% から 10% の範囲です。

実験

実験 8-6

サーボモータをコントロールするパルスをマイコンで発生します。 そして、サーボモータに接続し、実際に制御を行い、サーボモータの特性を調 べなさい。

機材表
機材 数量
ブレッドボード 一式
電池と電池ボックス(4.5V) 一式
ATtiny2313 一式
基板用タクトスイッチ 2個
10kΩ抵抗 2本
GWS サーボ S03T/2BB または S03T/2BBMG/F 1個
0.1Ω 5W抵抗 1本
電源装置 1式
オシロスコープ 1式
パルス発生

マイコンにスイッチを二個とオシロスコープを繋ぎ、周期20ms のパルスを発生さ せなさい。スイッチと duty 比の関係は次のようになるように、オシロスコー プで確認しなさい。

スイッチ duty 比
全部 off または全部 on 15%
左が on, 右が off 10%
左が off, 右が on 20%
プログラム

例 6-4 2 のプログラムを参考にします。 プリスケーラを使用しない場合、割り込みは 256 μs 間隔で発生します。 従って、周期を 20 ms にするには 20/0.256 = 78.125 となります。 そこで、 duty_period(周期)を 78 にします。

duty_ratio は ATtiny2313 にふたつのボタンをつけて、増減させるようにします。 また、 duty_ratio の値を 7seg LED で表示するようにします。 このため、 PD4, PD5 にはスイッチを繋ぎ、出力は PD0 にします。 main 部分で、duty_ratio の値は、 PORTB を利用して表示させた後、 スイッチの値を読み込み、PD4 と PD5 の値に依り、 duty_ratio を変化させます。 なお duty_ratio の上限値は duty_period にしてますが、 getpat を呼び出 すときに duty_ratio が用意したパターンの数を越えると暴走してしまいます。 そのため、チェックを行っています。


;***********
;* 実験 8-6*
;***********

.include <tn2313def.inc>

.cseg
.org 0x0000
	rjmp reset
.org	OVF0addr
	rjmp	timer0vec
.org INT_VECTORS_SIZE
reset:
	ldi	r16,low(RAMEND)
	out	SPL,r16
	ldi	r16,0xff
	out	ddrb, r16
	ldi	r16,0x0f
	out	ddrd, r16
initsleep:
	in	r16,mcucr
	cbr	r16, 1<<sm0 | 1<<sm1	;idlemode
	sbr	r16, 1<<se	; enable sleep
	out	mcucr, r16
inittimer0:
	ldi	r16,0b00000000	;normal mode
	out tccr0a,r16
	ldi	r16,0b00000001	; normal mode, no prescaler訂正箇所
	out	tccr0b, r16
	ldi	r16, 0b00000010 ; enable interruption for overflow
	out	timsk, r16


	ldi	duty_period,dutycycle
	mov	duty_counter,duty_period
	ldi	duty_ratio,initposition
	sei
main:
	cpi		duty_ratio,countmax
	brcc	errorout
	mov		counter,duty_ratio
	cbi		PORTD,3
	rjmp	disp
errorout:
	sbi		PORTD,3
disp:
	rcall	dispcounter
	rcall	watchsw
	rjmp	main
    
.def	pattern = r16
.def	counter		= r17
.def	duty_period = r18
.def	duty_counter = r19
.def	duty_ratio	= r20
.def	sw_prev	=	r21
.def	work	=	r22
	.equ	dutycycle	= 78
	.equ	initposition = 5



watchsw:
	in		work,PIND 	;訂正箇所
	eor		work,sw_prev
	andi	work,swmask
	brne	w1
	ret
w1:
	in	sw_prev,PIND	;訂正箇所
	sbrs	sw_prev,4
	rjmp	rd4clr
rd4set:
	sbrs	sw_prev,5
	rjmp	pat10
	rjmp	pat11
rd4clr:
	sbrs	sw_prev,5
	rjmp	pat00
	rjmp	pat01

pat00:
pat11:
	nop
	ret
pat01:
	subi	duty_ratio,1
	brcs	pat01a
	ret
pat01a:
	inc		duty_ratio
	ret


pat10:
	inc		duty_ratio
	cpi		duty_ratio,countmax
	brcc	pat10a
	ret
pat10a:
	dec		duty_ratio
	ret

.equ	swmask		=	0b00110000

 timer0vec:
	push	work
	in		work,SREG
	push	work
	push	sw_prev
	rcall	duty
	pop		sw_prev
	pop		work
	out		SREG,work
	pop		work
	reti

	
	
duty:
	inc		duty_counter
	cpi		duty_counter,dutycycle
	brcs	duty1
	clr		duty_counter
duty1:
	cp		duty_counter,duty_ratio
	brcs	onstate
	rjmp	offstate
onstate:
	sbi		PORTD,0
	ret
offstate:
	cbi		PORTD,0
	ret
 
dispcounter:	;counter	の値を表示
	ldi	ZH,high(startdata<<1)
	ldi	ZL,low(startdata<<1)
	add	ZL,counter
	brcc	dispcounter1
	inc	ZH
dispcounter1:
.equ	mask = 0b00001000
	cli
	in	work,portb
	andi	work,mask
	lpm	pattern,Z
	or	work,pattern
	out	portb,work
	sei
	ret

inccounter:
	inc	counter
	cpi	counter,countmax
	breq	inccounter1
	ret
inccounter1:
	clr	counter
	ret

startdata:
	.db	0b01110111,	0b00010100	;0,1
	.db	0b10110011,	0b10110110	;2,3
	.db	0b11010100,	0b11100110	;4,5
	.db	0b11100111,	0b00110100	;6,7
	.db	0b11110111,	0b11110110	;8,9
	.db	0b11110101,	0b11000111	;A,b
	.db	0b01100011,	0b10010111	;C,d
	.db	0b11100011,	0b11100001	;E,F
enddata:
.equ	num_start_adr = startdata <<1
.equ	num_end_adr = enddata << 1
.equ	countmax = low(num_end_adr - num_start_adr)
.exit
サーボに接続

次にサーボに接続します。サーボの配線は次のようになっています。

信号線 電源+ GND
JR
フタバ

信号線をマイコンの出力に繋ぎ、一方、サーボの電源は 0.1Ω 5W の抵抗を 介して 5V の電源装置に繋ぎます。

あるいは、 マイコンと電源を共有する場合は、マイコンの電源ピンのそばに 0.1μF のセラミックコンデンサと、 10μFの電解コンデンサをマイコンの電源とGND の間 につなぎ、モータから出るノイズをカットします。

これでもダメな場合は、サーボとマイコンの電源を分けます。 具体的には、GND は共通にし、サーボの電源+だけ別の電池をつなぎます。

  1. ボタンによりサーボがコントロールできることを確認しなさい
  2. duty 比とサーボの角度の関係をグラフに表しなさい。
  3. サーボの待機電流と、動作電流を調べなさい

簡単のため、 duty_period を 78 から 80 に変えても良い。

8-3. ステッピングモータ

ステッピングモータはパルスを送ることで回転角を制御します。

8-4. 一班分の必要部品

部品個数
マブチモータ FA-130 1個
GWS サーボ S03T/2BB(JR またはフタバ) 1個
モータドライバ TA7291P 1個
パワー MOS FET 2SK2231 2石
トランジスタ 2SB1018A 2石
トランジスタ 2SC1815 2石
ダイオード 1N4007 4本
LED 4本
0.1Ω 5Wセメント抵抗 1本
3Ω 5Wセメント抵抗 1本
100Ω 2本
330Ω 4本
1kΩ 6本
10kΩ 3本
22kΩ 2本
0.1μF (積層)セラミックコンデンサ 1本
10μF 電解コンデンサ 2本
基板用タクトスイッチ 2個
3V 分の電池と電池ボックスセット 1式
3pinの電源用の基板コネクタ(千石通商) 1個

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科