エンコーダを使ってみましょう.エンコーダを使用すると,モータの回転数や回転角を知ることができます.
モータの配線を見てください.モータが回転すると,A(白)とB(黄)から,パルス波が出力されます.このパルス波をマイコンの割込み機能を使って回転角を算出します.
1.以下の回路を製作してください
2.atmega64にプログラムを書き込みます.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include<avr/io.h> #include<stdio.h> #include<avr/interrupt.h> int i=0; void AVR_init(void) { DDRA=0b11111111; DDRB=0b11111111; DDRC=0b11111111; DDRD=0b11111111; DDRE=0b00000000; DDRF=0b11111111; DDRG=0b11111111; } void interrupt_init(void) { PORTE =0b11111111; EICRB =0b00000101; EIMSK =0b00110000; } void PWM_init(void) { TCCR1A=0b10100001; TCCR1B=0b00001001; } ISR(INT4_vect) { if (PORTA & (1<<0)){i += 1;} else {i -= 1;} } ISR(INT5_vect) { if (PORTA & (1<<0)){i += 1;} else {i -= 1;} } int main(void) { AVR_init(); interrupt_init(); PWM_init(); OCR1A=255; sei(); PORTA=0b00000001; for(;;) { if (i>=2592){PORTA=0b00000010;} if (i<=0){PORTA=0b00000001;} } } |
3.プログラムを実行すると,モーターが1回転し,また逆方向に1回転するということを繰り返します.(減速比1/54の場合)
今回,一回転させるために計算した手順を載せます.
①このモータは1回転あたり12パルス出力します.しかし,減速比54の場合は,モータが54回転すると,最終的に出力される軸が1回転します.
12×54=648パルス
つまり,一回転あたり648パルス出力されます.
②パルスをどうマイコンで読み取るかというと,パルスの立ち上がり及び立ち下りで読み取ります.実際に出力されているパルスをオシロスコープで見てみましょう.
赤い矢印が立ち上がり,青い矢印が立ち下りです.ということは,ひとつのパルスで2回読み取ることができます.
648×2=1296回
つまり,一回転で,1296回信号を読み取れます.
③このエンコーダーは2相です.1相の場合はこんな感じ.
立ち上がりと立ち下りで,二回読み取れるわけですね.
2相の場合は?
1パルスで4回も読み取れます.
1296*2=2592回
このことから,立ち上がり及び立ち下りの外部割込み機能を使うと,2592回割込みしたとき,1回転したということになります.
今回のプログラムでは外部割込みが発生するとカウント値(i)に1加算し,2592以上になると,逆方向に回転させるようにしました.
このカウント値が2592の場合は回転角は360°
1296のときは,180°と計算することができます.
これでエンコーダ付きモータを使うことができました.このエンコーダのパルスを使って,フィードバック制御をすることができます.
これでAtmega64aの解説は終わりになります.
AVRマイコンを扱う上で参考にした本をまとめましたので,よかったら見てみてください.
AVR関連参考図書紹介
次からは一歩レベルをあげて,32bitマイコンというものに挑戦したいと思います.
最近話題のRaspberrypi(ラズベリーパイ)というマイコンボードを使って,もっと高度なことをやってみましょう.
1 Raspberrypiって? に続く.