• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

ケロタン少佐のブログ一覧

2008年12月05日 イイね!

角度の求めかたは?・・・【角度検出その4】

角度の求めかたは?・・・【角度検出その4】
みなさん、こんにちは。
ケロタン少佐デあります・・・(^_^)ヾ




さてさてさて・・・♪


前回では、『角度センサー』からの、

データの変化量と、回転方向が分りました。




今回は実際に、これらのデータを使って、

角度を割り出してみたいと思います。



そこで、またまた例題を・・・

(例.)

【定義】

・正午位置での基準位置の、位置データを0とする。
・時計回りに回転させます。
・回転角度は30度
・データは、規定時間毎に現在データをサンプリングする
ことにより取得する
・サンプリング時間は、1/1000秒毎(1ms/)とする。



上記定義より、これから実験を行う為に、

専用実験機器を描いてみました。

これにロータリーエンコーダーを接続して、実際に

角度を表示させてみたいと思います。




【本体、回路図】







【本体、パターン図】







【表示部、回路図】







【表示部、パターン図】









今後は、実験機器を製作して、実際に角度を測ってみたいと思います。



ところで、なぜ、このようなことを

やっているかといいますと








『操舵角センサー』から、データを取出してやりたいからデあります。


ちなみに、こちらのユニットは、ハンドルシャフトにある

『操舵角センサー』にも取付できるように対応させています。






そして、ゆくゆくは、『自作AFS』とかできたらなと・・・

更には、『加速度センサー』からもデータを取出し

『DCS・TCS割込み制御ユニット』が作れないものかと

妄想しているデあります・・・(^_^;)ヾ




長々と、今回の駄ブログに、お付き合いくださいましてありがとうございました・・・m(__)m




最後に・・・


今回も、長ったらしいプログラムを・・・(笑



【プログラム】
/*************************************************************************************************

AVR Studio 4 C言語用 Ver1.0(ATtiny2313用) 2008.12.2

ロータリーエンコーダーのテスト プログラム (R・E・T)

Program Name : rotary-encoder-test-program-ver1.0.c
Version : 1.0
Language : AVR C言語 (WinAVR)
Device : ATtiny2313
Clock : 1MHz(内蔵RC発振)
Author : ケロタン少佐


**************************************************************************************************

I/O

RESET,PA2 | 1****20| VCC
PD0 | 2****19| PB7
PD1 | 3****18| PB6
XTAL2,PA1 | 4****17| PB5
XTAL1,PA0 | 5****16| PB4.OC1B
INT0,PD2 | 6****15| PB3,OC1A
INT1,PD3 | 7****14| PB2,OC0A
T0,PD4 | 8****13| PB1
OC0B,T1,PD5 | 9****12| PB0
GND |10****11| PD6,ICP


PORTA2 ; 入力 ; 内部プルアップ,立下り検出- ; RESET
PORTA1 ; 出力 ; LED(red),作動確認用
PORTA0 ; 出力 ; LED(green),パイロット用

PORTB7 ; 出力 ; seg_a
PORTB6 ; 出力 ; seg_b
PORTB5 ; 出力 ; seg_c
PORTB4 ; 出力 ; seg_d
PORTB3 ; 出力 ; seg_e
PORTB2 ; 出力 ; seg_f
PORTB1 ; 出力 ; seg_g
PORTB0 ; 出力 ; seg_p

PORTD6 ; 出力 ; tr_1000
PORTD5 ; 出力 ; tr_100
PORTD4 ; 出力 ; tr_10
PORTD3 ; 出力 ; tr_1
PORTD2 ; 出力 ; def
PORTD1 ; 入力 ; 内部プルアップ,立下り検出- ; rsw_b
PORTD0 ; 入力 ; 内部プルアップ,立下り検出- ; rsw_a



**************************************************************************************************

動作仕様
1.4桁の7セグメントに回転情報を表示する。
2.操舵角センサーにも取付可能

STATUS LEDの動作
点滅・・・(2Hz)
セッティングモード中
点灯・・・(1Hz)
通常モード中


*********************************************************************************************** */

#include
#include
#include

// PORTA
#define RESET 2
#define LED_red 1
#define LED_green 0

// PORTB
#define seg_a 7
#define seg_b 6
#define seg_c 5
#define seg_d 4
#define seg_e 3
#define seg_f 2
#define seg_g 1
#define seg_p 0

// PORTD
#define def 7
#define tr_1000 6
#define tr_100 5
#define tr_10 4
#define tr_1 3
#define def 2
#define rsw_b 1
#define rsw_a 0


/*************************************************************************************************
******* グローバル宣言 */

volatile char s1,s0,t1,t0;
volatile uint16_t cnt,cnt4;


// 7セグ表示用データ

uint8_t seg_dat[] = {
0b11111100, ;0
0b01100000, ;1
0b11011010, ;2
0b11110010, ;3
0b01100110, ;4
0b10110110, ;5
0b10111110, ;6
0b11100100, ;7
0b11111110, ;8
0b11110110 ;9
};

/*************************************************************************************************
******* プロトタイプ宣言 */

void init_io(void);
void init_tim(void);
void init_dat(void);

void wait_100us(uint16_t);


/*************************************************************************************************
******* タイマ0割込み 1ms毎にエンコーダのデータを取得 */

SIGNAL(SIG_OVERFLOW0){ // 1MHz/64 = 16kHz

TCNT0=241; // タイマーのカウンタセット 256-16=241  →1000Hz
s0=s1; // swを調べる 新データを旧データ変数に入れて

s1= (PIND & 0b00000011); // 新データを読み込む bit1-0 にrswがあるから off=1 on=0

if (s1 == 3){
s1 = 2; // 3→2へ変換
} else if (s1 == 2){
s1 = 3; // 2→3へ変換
}

if (((s1 - s0 == 1)||(s1 - s0 == -3)) && (cnt < 39997)){ // Max 39997 = 9999 × 4ターム
cnt++; // 3→0も正回転(CW)
}
if (((s1 - s0 == -1)||(s1 - s0 == 3)) && (cnt > 0)){ // Min 0
cnt--; // 0→3も逆回転(CCW)
}

cnt4=cnt; // クリック付きは4ターム1セットなので cnt4=cnt/4に変更
}

/*************************************************************************************************
******* メイン */

int main(void){
uint8_t d1,d10,d100,d1000,i; // 符号なし8bit変数宣言
uint16_t j; // 7seg桁変換用の一次変数

// 初期化
init_io(); // I/O初期化
init_tim(); // タイマー初期化
init_dat(); // データ初期化

sei(); //

PORTA |= _BV(LED_green); // LED点灯


// セッティング記録の読込み

// 中立位置の検出
s0 = PIND & 0b00000011; // 入力信号初期値を代入

d1 = 0; // クリア
d10 = 0; // クリア

// メインループ
while(1) {

// ステータスLED点滅(red)
PORTA ^= _BV(LED_red); // LEDを反転


// 7セグメント表示用にBCD変換
j = cnt4; // 表示数字のカウントアップ
d1000 = j / 1000; // 1000の位抽出
j = j - d1000 * 1000; // 1000の位除外
d100 = j / 100; // 100の位抽出
j = j - d100 * 100; // 100の位除外
d10 = j / 10; // 10の位抽出
j = j - d10 * 10; // 10の位除外
d1 = j; // 1の位抽出

// 7セグメント表示処理
for(i=1;i<250;i++){
PORTD |= ~_BV(tr_1000); // 最上位桁表示
PORTB = seg_dat[d1000]; // 1000の位
wait_100us(5); // 500us
PORTD &= ~_BV(tr_1000); // 全表示消灯

PORTD |= ~_BV(tr_100); // 100の位表示
PORTB = seg_dat[d100]; //
wait_100us(5); // 500us
PORTD &= ~_BV(tr_100); // 全表示消灯

PORTD |= ~_BV(tr_10); // 10の位表示
PORTB = seg_dat[d10]; //
wait_100us(5); // 500us
PORTD &= ~_BV(tr_10); // 全表示消灯

PORTD |=_BV(tr_1); // 最下位桁表示
PORTB = seg_dat[d1]; // 1の位
wait_100us(5); // 500us
PORTD &= ~_BV(tr_1);
}

}
}

/*************************************************************************************************
******* init_io I/O 初期化処理  */

void init_io(void){

PORTA = 0b00000100; // 2プルアップ
DDRA = 0b00000011; // 1-0出力

DDRB = 0b11111111; // 全出力
PORTB = 0b00000000; // 0=all

PORTD = 0b00000011; // 1-0プルアップ
DDRD = 0b01111100; // 6-2出力

}

/*************************************************************************************************
******* init_tim タイマー 初期化処理 */

void init_tim(void){

TCCR0=3; // タイマ0の分周比=1/64
TIMSK=(1<<TOIE0); // タイマ0 割り込み許可
TCNT0=241; // タイマーのカウンタセット

}

/*************************************************************************************************
******* init_dat 各種データ 初期化処理  */

void init_dat(void){

cnt = 0; // 初期値0

}

/*************************************************************************************************
******* wait関数_100us */

void wait_100us(uint16_t time) { // 100us wait ルーチン。 クロック設定のこと。
// 25MHzでも 260ms までとれる。
time*=1; // 8MHzのとき。timeにF_CPU(MHz)をかける。重要!!

uint8_t lpcnt;
__asm__ __volatile__("\n"
"Entry%=: \n\t"
"ldi %0,24\n" // 計算値は25。24の方が実測値は良い。
"Loop%=: \n\t"
"nop\n\t"
"dec %0\n\t"
"brne Loop%=\n\t"
"sbiw %1,1\n\t"
"brne Entry%=\n\t"
:"=&a"(lpcnt)
:"w"(time)
);
return;
}

/*************************************************************************************************
******* END */
Posted at 2008/12/05 16:00:53 | コメント(2) | トラックバック(0) | 電子工作 | 日記
2008年12月05日 イイね!

角度検出の仕組みは?・・・【角度検出その3】

角度検出の仕組みは?・・・【角度検出その3】みなさん、こんにちは。
ケロタン少佐デあります・・・(^_^)ヾ




さてさて・・・♪


では、『角度センサー』は、いかにして

角度データを作り出しているのでしょう?




(例)を出して考えてみます。


今、手元にボリューム(ロータリーエンコーダ)が1つあるとします。

このボリュームは正午の位置で中立基準となっています。

ここで、時計回りに30度程傾けてみましょう。




【図1.】







はい、時計回りに30度程傾きましたね。



では、この時、『角度センサー』は、どの様なデータを生成しているのでしょう?









と、その前に、『角度センサー』の内部構造について

みてみましょう。



【図2.】







はい。これは、『角度センサー』の内部構造を簡略化した図になります。

一般的な『角度センサー』には、『機械式』と『光学式』の2つが

使われています。


・機械式の場合は、2つの接点を開け閉めすることにより、
合計4パターンのデジタルデータを生成しています。

・光学式の場合は、2つのフォトダイオードを使用して、
同じく合計4パターンのデジタルデータを生成しています。


どちらの場合も、AとBの出力があり、BはAよりもワンテンポずれて

信号を出力しています。この信号は、単純なON・OFFのデジタル

信号になっており、どちらもパルスを形成しています。

そして、このパルスのズレによって、4つのデジタルパターンが

形成されています。





それでは、その4パターンのデータから、どの様にして

角度情報を得るかですが・・・


【図3.】







こちらが、実際に生成されるデータ配列になります。

『機械式』でも『光学式』でも合計4つのデータが

生成されるのは、先ほど述べました。

今、仮にその4つのデータを、0・1・3・2と定義します。

すると、時計回りにボリュームを回し続けると、



0・1・3・2・0・1・3・2・・・・・・0・1・3・2・・・


と生成データは出力され続けます。


ここでこの配列パターンを分り易く置き換えてみます。

定義として・・・

・0_→_0
・1_→_1
・3_→_2
・2_→_3

と置き換えます。


すると、データの遷移パターンは、


・0_→_1_は_1_-_0_=_+1
・0_→_2_は_2_-_0_=_+2
・0_→_3_は_3_-_0_=_+3
・1_→_2_は_2_-_1_=_+1
・1_→_3_は_3_-_1_=_+2
・2_→_3_は_3_-_2_=_+1


と、+1、+2、+3の変化があることがわかります。(ちょっと簡略化してます)


ここで変化量が+値の場合は、時計回り

-値の場合は反時計周りであることが分りました。



次に、角度の求め方ですが・・・




こちらは次回に・・・♪





【角度検出その4】へつづく・・・

Posted at 2008/12/05 15:08:23 | コメント(2) | トラックバック(0) | 電子工作 | 日記
2008年12月05日 イイね!

ロータリーエンコーダ・・・【角度検出その2】

ロータリーエンコーダ・・・【角度検出その2】
みなさん、こんにちは。
ケロタン少佐デあります・・・(^_^)ヾ




さて、つづきデあります♪


ネットにて色々と調べていくと・・・

歯車の角度検出には、『角度センサー』なるものが

使われていることが、分りました。



さてさて・・・

では『角度センサー』とは、どの様な仕組みなのでしょう?



そこで、身近に『角度センサー』が組み込まれている

ものを探してみることにしました。




色々と調べていくと、表題の『ロータリーエンコーダ』にも

使われていることが分りました。



ロータリーエンコーダとは・・・


そう、アレです。


最近のオーディオのボリューム調整とか

電子レンジのダイヤルとかに使われていたり。

自動車だと、エアコンの温度調整ダイヤルなどにも

使用されていますね。


アレって、回せど回せど終わりがなく、

無限にまわりますよね。



みなさんは、気になったことはありませんか?

ケロタンちょっと調べて、考えました。



考察は次回に・・・♪





【角度検出その3】へつづく・・・

Posted at 2008/12/05 12:54:08 | コメント(6) | トラックバック(0) | 電子工作 | 日記
2008年12月05日 イイね!

歯車を回してみる!?・・・【角度検出その1】

みなさん、こんにちは。
ケロタン少佐デあります・・・(^_^)ヾ




最近、ながったらしいプログラムの記事ばかりで
ファンを無くしているとか、しないとか・・・(汗



ところで、歯車の角度検出ってどうやっているのでしょう?

みなさんは、気になったことはありませんか?

ケロタンちょっと調べて、考えました。



考察は次回に・・・♪





【角度検出その2】へつづく・・・
Posted at 2008/12/05 12:13:09 | コメント(2) | トラックバック(0) | 電子工作 | 日記

プロフィール

「お仕事ちうデあります・・・(^_^)ヾ」
何シテル?   09/04 11:33
めぐりめぐって初マツダです。 皆さんよろしくお願いします。 お約束ですが、当ブログの内容を見て整備、修理して不具合が生じても、当プログ主は責任を負えませ...
みんカラ新規会員登録

ユーザー内検索

<< 2008/12 >>

 1234 56
78910111213
1415 1617 181920
21222324 252627
28293031   

愛車一覧

マツダ MPV マツダ MPV
家族の為にミニバンにしました。 新型MPVのあまりの出来に家族で 大満足です。 これ ...
ホンダ シビック ホンダ シビック
私に操る楽しさを教えてくれた車です。 VTECのハイカムに入ったときの 加速がたまりま ...
日産 スカイライン 日産 スカイライン
私に整備の楽しさを教えてくれた車です。 かなり高齢でしたが、まだまだ元気でした。 一 ...
その他 その他 その他 その他
ブログ用画像倉庫

過去のブログ

2009年
01月02月03月04月05月06月
07月08月09月10月11月12月
2008年
01月02月03月04月05月06月
07月08月09月10月11月12月
2007年
01月02月03月04月05月06月
07月08月09月10月11月12月
2006年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation