Rotary Encoder Interfacing with ATmega8 Microcontroller - Giao diện bộ mã hóa quay với vi điều khiển ATmega8
Trong hướng dẫn này, chúng ta sẽ giao tiếp một bộ mã hóa quay với vi điều khiển ATmega8. ATmega8 là dòng vi điều khiển của Atmel được thiết kế cho các ứng dụng nhúng. Bộ mã hóa quay được sử dụng để biết vị trí chuyển động và chuyển động góc của động cơ hoặc trục. Nó thường là thiết bị ba đầu cuối, với nguồn và chân nối đất được đếm đến năm. Mô-đun bộ mã hóa quay được hiển thị bên dưới.
The pins of a rotary encoder are:
- Ground.
- Positive connected to +5V
- Output signal A pin
- Output signal B pin
- Clock pin or common pin.
ENCODER cung cấp các xung thể hiện sự thay đổi vị trí trục để hệ thống hiểu được. Hãy xem xét một NĂNG LƯỢNG XOAY được cấp nguồn và trục được di chuyển.
Như thể hiện trong bảng trên, hãy xem xét trục được di chuyển đồng hồ khôn ngoan. Với điều này, sẽ có Falling Edge ở nhà ga A sau đó ở nhà ga B.
Xem xét trục được di chuyển Chống đồng hồ khôn ngoan. Với điều này, sẽ có Falling Edge ở nhà ga B sau đó ở nhà ga A.
Cạnh này sẽ xảy ra một lần cho 360/20 = 18 độ (Đây là cho Bộ mã hóa có 20 vị trí, điều này thay đổi từ loại này sang loại khác, số lượng càng cao thì độ chính xác càng cao).
Với cả hai điều kiện trên, chúng ta có thể nhận được hướng và độ quay. Do đó, chúng tôi nhận được các thông số cần thiết để có được vị trí của trục.
Components
#include <avr/io.h>
// header to enable data flow control over pins
#define F_CPU 1000000UL
//telling controller crystal frequency attached
#include <util/delay.h>
//header to enable delay function in program
int main(void)
{
DDRD = 0xFF;// portD as output
PORTD =0;
DDRC= 0;//portC as input
int count =0;
int i=0;
while(1)
{
if (i==0)
{
if ((bit_is_clear(PINC,0))||(bit_is_clear(PINC,1)))
//If any Encoder pins show falling edge execute lop
{
i= 1;
_delay_ms(10);
if (bit_is_clear(PINC,0) )//if PINB is second to go LOW
{
if (count<255)
{
count++;
// increment binary count if count is less than 255
}
}
if (bit_is_clear(PINC,1))// if PINA is second to go LOW
{
if (count>0)
{
count--;
// if binary count is greater than 0 decrease count by 1
}
}
}
}
PORTD = count;
if ((bit_is_set(PINC,0))&&(bit_is_set(PINC,1) ))// wait till shaft position reset
{
i = 0;
}
}
}