ロータリー式エンコーダとのAVRマイクロコントローラー
-
09-06-2019 - |
質問
私の良さを知ってもらい、ロータリーエンコーダが正常に動作AVRマイクロンコントローラーがあります。エンコーダの機械式 アルプスのエンコーダ, は、私が使っている Atmega168.
解明
しかし外部からの割り込みを聞くのピンがまだ作が遅すぎます。時にピンが高まり、割り込みの手続きを開始してかどうかをチェックします端子Bが高い。この場合のピンは高の瞬間をピンでも高いので、その回転カウンタークロックました。場合は端子Bは低く、その回転時計ました。ないかなと思い、AVR時間がかかりすぎているチェックピンでインターンシップで、必ずお読みとなります。
私はもうプログラムを作成することでブロックまでピンBまたはピンで変化します。ものであることがありすぎてノイズのエンコーダを回転させれば、この働きません。私の前の試みているタイマーの最終値8バッファやチェックだから低高い。このなかったです。
しかしスコーピング、エンコーダが利用2-4msから最初のピンの変化のその他の端子に変わります。
解決
私のウェブページ約 ロータリエンコーダとしての手, るのを感じるかもしれませんが便利です。
残念なことにな情報はできないトラブルシューティング特定の問題です。
るマイクロコントローラピンに接続されたエンコーダは、コードして、現在お使いにデコード、パルス?
Ok、いくつかの異なる課題は、最初の問題は、これは機械的なエンコーダですから、対応スイッチノイズ(バウンス、chatter).の データシート のいずれかにまっすぐに引き抜いてください3mSのパーツを停バウンシングをfalseにします。<br></p><
を作成する必要がありますデバウンス。最も簡単なのは継続的かどうかを取得しまう。または開始タイマーおよびチェックも3ms.場合でもを確認することができない高それを無視して、誤パルスを継続を探して高い。チェックイン時にお億すので、開始タイマーのための3msをもとに、Bます。また同時に、それを利用することができ値が変更内3msしいです(読み取B、3ms、そしてもう一回読んで、いずれかにマッチするかどうか).
のatmegaにあるのとないと思いますが気にこれらのチェックにゆっくりませんが、シンガポール、オーストラが遅いクロック速度です。
一度に取り組んでいただき、機械ノイズするために使うことができる眺めを適切に灰色のコードを通常のアルゴリズムん下記のないも減る場合がBが低い。一般的に人店舗の価値を入力しと比較することで、新たな価値を入力用の小さな機能が増分または減分のたんですよ。(チェックアウトの高解像度の読み方"に当っては、前述のとおりにいことがあります。私はふたつの組み合わせで読み込つのビット数を、シンプルな配列を教えてくるかどうかは別として増分または減分のカウンターがあり、ソリューションも進化し、最適化のためのコードサイズ、速度、または容易にコードをメンテナンス。
他のヒント
追加のアナログlowpassフィルターを大幅に改善さい。のlowpassフィルタのコードを削減したシンプルです。
_________
| |
| Encoder |
|_________|
| | |
| | |
100n | O | 100n
GND O-||-+ GND +-||-O GND
| |
\ /
3K3 / \ 3K3
\ /
| |
VCC O-/\/-+ +-\/\-O VCC
15K | | 15K
| |
O O
A B
あの素晴らしさをアスキーアートp
このプログラムのAVR.接続およびB入力PORTBのavr:
#include <avr/io.h>
#define PIN_A (PINB&1)
#define PIN_B ((PINB>>1)&1)
int main(void){
uint8_t st0 = 0;
uint8_t st1 = 0;
uint8_t dir = 0;
uint8_t temp = 0;
uint8_t counter = 0;
DDRD = 0xFF;
DDRB = 0;
while(1){
if(dir == 0){
if(PIN_A & (!PIN_B)){
dir = 2;
}else if(PIN_B & (!PIN_A)){
dir = 4;
}else{
dir = 0;
}
}else if(dir == 2){
if(PIN_A & (!PIN_B)){
dir = 2;
}else if((!PIN_A) & (!PIN_B)){
counter--;
dir = 0;
}else{
dir = 0;
}
}else if(dir == 4){
if(PIN_B & (!PIN_A)){
dir = 4;
}else if((!PIN_A) & (!PIN_B)){
counter++;
dir = 0;
}else{
dir = 0;
}
}else if(PIN_B & PIN_A){
dir = 0;
}
PORTD = ~counter;
}
return 0;
}
このコードの作品がいない場合のエンコーダを回転させて早いですね。それを見なステップは、まずはしているが、それにともない、人にエンコーダなど多くのステップいたします。
速すべきとは問題にならないはずである。ほぼすべての機械的スイッチが必要デバウンスがありました。だんだことの障害に割り込みがトリガー起動タイマーまで戻した後、カップルのms.預けプログラムのポーリングフ>:)
うお困りです。いをすることが出来るフックのピンのエンコーダーを日替としての技術仕様にリンクをFarnellページのやりくりは夫婦で別にされていまでは、問題の読み込みデータはもらえますか?いませんからのデータのエンコーダ?してもらうようにはいかないかを解釈するデータを取得しているのだろうか。
/* into 0 service rutine */
if(CHB)
{
if(flagB)
Count++;
FlagB=0;
}
else
{
if(FlagB)
count--:
FlagB=0:
}
/* into 1 service rutine */
FlagB=1;
/* make this give to you a windows time of 1/4 of T of the encoder resolution
that is in angle term: 360/ (4*resolution)
*/