-
Энкодеры AS5045,AS5040...
от R6DT Павел 31 Мар, 2013 22:50
-
Кто-нибудь писал программы для них?
-
Ответ #1
от RW3TU Сергей 31 Мар, 2013 23:10
-
VK5DJ - на его сайте есть разные прошивки на контроллеры под эти энкодеры..
-
Ответ #2
от R6DT Павел 31 Мар, 2013 23:20
-
VK5DJ - на его сайте есть разные прошивки на контроллеры под эти энкодеры..
Cпасибо, я в курсе.
Вопрос остаётся
-
Ответ #3
от ut3lk 31 Мар, 2013 23:43
-
http://www.ok2tpq.net/
-
Ответ #4
от R6DT Павел 31 Мар, 2013 23:57
-
http://www.ok2tpq.net/
Я спрашиваю, кто лично писал проги,а не ссылки.
-
Ответ #5
от RM5P 01 Апр, 2013 12:38
-
Я немного экспериментировал с AS5048 под Arduino.
-
Ответ #6
от PavelS 01 Апр, 2013 14:16
-
Программировал PIC16F628 под AS5040. Но уже склероз не знает где исходники.
-
Ответ #7
от OlegG 24 Май, 2013 23:33
-
Если будет интересно то недавно писал под С8051F350, считываются данные с двух энкодеров и шлются через UART:
///////////Encoder based AS5045 chip///////////////
#include "C8051F350.h"
#include "Pin_designator.c"
#include "stdio.h"
///////////// Function ////////////////////
void del_10us(void);
void del_500ms(void);
void read_encod_1(void);
void read_encod_2(void);
void TXDataUART(void);
///////////Extern function/////////////////
extern void Init_Device (void);
///////////Variable////////////
unsigned int enc_1, enc_2; //дані з енкодера (D11, D10,....D2, D1, D0)
unsigned int enc1_avg, enc2_avg; //дані з енкодера for averaging
unsigned char stat_bits; //статус биты OCF COF LIN
unsigned char n;
unsigned char DataTxUART[8]; //8 byte for TX
static bit flag1_error; //flag1 oszibok
static bit flag2_error; //flag2 oszibok
///////////////////////////////MAIN///////////////////////////////
void main (void) //Osnownyj cykl
{
Init_Device(); //Inicializacia kontrolera
//-------------------Початкові установки -----------------------
CS_1 = 1; //dla Az-encodera
CLK_1 = 1;
CS_2 = 1; //dla El-encodera
CLK_2 = 1;
del_500ms(); // na perechidni procesy
while(1) //---------- mean loop --------------------------
{
enc1_avg=0; // обнуляем 1
enc2_avg=0; // обнуляем 2
flag1_error = 0; // обнуляем flag1 oszibok
flag2_error = 0; // обнуляем flag2 oszibok
for (n=0;n<8;n++) read_encod_1(); //useredniujem 8 raz
enc1_avg = enc1_avg >> 3; //here enc1_avg - averaging in 8 time
for (n=0;n<8;n++) read_encod_2(); //useredniujem 8 raz
enc2_avg = enc2_avg >> 3; //here enc2_avg - averaging in 8 time
TXDataUART(); //prepare data
for (n=0;n<8;n++) //Here send to UART 8 byte
{
SBUF0=DataTxUART[n];
while (!TI0); //wait while the transmission is going on
TI0=0; //Clear TI0
}
}
}
//*****************************************************
//------------Процедура зчитування енкодера N1---------
//-----------------------------------------------------
void read_encod_1(void)
{
unsigned char i;
stat_bits=0; // обнуляем
enc_1=0;
CS_1 = 0; //устанавливаем 0 CS1
del_10us(); //delay, ne menee 500ns
CLK_1 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
for (i=0;i<12;i++)
{
CLK_1 = 1; // устанавливаем 1 CLK
del_10us(); //delay, ne menee 500ns
if (DO_1 == 1) //Czytajemo
{
enc_1=((0x0800>>i)|enc_1);
}
CLK_1 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
}
for(i=0;i<3;i++) // Проверяем статус биты OCF COF LIN
{
CLK_1 = 1; // устанавливаем 1 CLK
del_10us(); //delay, ne menee 500ns
if (DO_1 == 1) //
{
stat_bits=((0x04>>i)|stat_bits);
}
CLK_1 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
}
CS_1 = 1; // устанавливаем 1 CS
del_10us(); //delay, ne menee 500ns
if (stat_bits == 0x04) //0000 0100 проверка правильности биты OCF COF LIN
{
enc1_avg = enc1_avg + enc_1;
}
else flag1_error = 1;
}
//*****************************************************
//------------Процедура зчитування енкодера N2---------
//-----------------------------------------------------
void read_encod_2(void)
{
unsigned char i;
stat_bits=0; // обнуляем
enc_2=0;
CS_2 = 0; //устанавливаем 0 CS1
del_10us(); //delay, ne menee 500ns
CLK_2 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
for (i=0;i<12;i++)
{
CLK_2 = 1; // устанавливаем 1 CLK
del_10us(); //delay, ne menee 500ns
if (DO_2 == 1) //Czytajemo
{
enc_2=((0x0800>>i)|enc_2);
}
CLK_2 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
}
for(i=0;i<3;i++) // Проверяем статус биты OCF COF LIN
{
CLK_2 = 1; // устанавливаем 1 CLK
del_10us(); //delay, ne menee 500ns
if (DO_2 == 1) //
{
stat_bits=((0x04>>i)|stat_bits);
}
CLK_2 = 0; // устанавливаем 0 CLK
del_10us(); //delay, ne menee 500ns
}
CS_2 = 1; // устанавливаем 1 CS
del_10us(); //delay, ne menee 500ns
if (stat_bits == 0x04) //0000 0100 проверка правильности биты OCF COF LIN
{
enc2_avg = enc2_avg + enc_2;
}
else flag2_error = 1;
}
//---------------------------------------------
//////////////// Zaderzky ///////////////////
void del_10us(void) //~10 us
{
unsigned char j;
for (j = 0; j < 60; j++);
}
void del_500ms(void) ///~500 ms
{
unsigned char l,m,n;
for (l = 0; l < 38; l++)
{
for (m = 0; m < 255; m++)
{
for (n = 0; n < 255; n++);
}
}
}
///////////////////////////////////////////////////////////////
// --------------- Prepary data to send -----------------------
//-------------------------------------------------------------
void TXDataUART(void)
{
DataTxUART[0]= 0xE1;
DataTxUART[1]= 0xE1;
if(flag1_error) //jesli byla oszibka wo wremija sczitywanija
{
DataTxUART[2]= 0xEE; //MSB
DataTxUART[3]= 0xEE; //LSB
}
else
{
DataTxUART[2]= (enc1_avg & 0xFF00)>>8; //MSB
DataTxUART[3]= enc1_avg & 0x00FF; //LSB
}
DataTxUART[4]= 0xE2;
DataTxUART[5]= 0xE2;
if(flag2_error) //jesli byla oszibka wo wremija sczitywanija
{
DataTxUART[6]= 0xEE; //MSB
DataTxUART[7]= 0xEE; //LSB
}
else
{
DataTxUART[6]= (enc2_avg & 0xFF00)>>8; //MSB
DataTxUART[7]= enc2_avg & 0x00FF; //LSB
}
}
//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
void uart_tx(void) interrupt 4
{
if (RI0 == 1) // Check if receive flag is set
{
RI0 = 0; // Clear interrupt flag RX
}
if (TI0 == 1) // Check if transmit flag is set
{
//TI0 = 0; //Clear interrupt flag TX
}
}
//-----------------------------------------------------------------------------
-
Ответ #8
от R6DT Павел 26 Май, 2013 20:39
-
Если будет интересно то недавно писал под С8051F350, считываются данные с двух энкодеров и шлются через UART:
Спасибо OlegG.
Считывание работает нормально. Но когда попытался записать в AS5045, то AS5045 перестала отвечать.Видимо испортил. Не пробовали?
-
Ответ #9
от UD2F 01 Мар, 2014 13:15
-
-
Ответ #10
от R3TGM Дмитрий 02 Мар, 2014 18:26
-
Валентнин приветствую , это немного не те энкодеры о которых шла речь выше . Те имют разрешение в 1/16 градуса или 0,0625градуса. А то что вы выложили на фото - это энкодер из разряда примитивных так сказать - механический, предназначен для применения в различного рода дешёвых изделий из разряда аудиотехники.искал в нете даже не нашёл сколько у него импульсов на оборот . Но точно можно сказать - что навряд ли он может быть применён в качестве датчика угла положения , разве только по азимуту 4 или 8 положений антены определять ....
Предлагаю Вам ознакомится с данным документом - там есть то как это работает ......
http://www.heidenhain.ru/ru_RU/php/dokumentacija-informacija/dokumentacija/katalogi/popup/media/media/file/view/file-0561/file.pdf
Речь идёт о правильных энкодерах .....
С такими конткретно работал -- http://www.psystem.ru/datchiki/Pologenie-Honeywell-4.html
RPN1A111
-
Ответ #11
от RA3EME Александр 18 Сен, 2017 11:34
-
Нужна помощь в написании простой проги под AS5045 простой вывод информации (числа) с энкодера на светодиодный индикатор с кнопкой сброса в ноль. Предложения в личку.
-
Ответ #12
от RA3WDK 18 Сен, 2017 13:44
-
Нужна помощь в написании простой проги под AS5045 простой вывод информации (числа) с энкодера на светодиодный индикатор с кнопкой сброса в ноль. Предложения в личку.
Саша, с какой точностью? Если точность 10 бит устроит, то 12 ножки с PWM можно на ОУ подать, на выходе которого китайский вольтметр поставить.
-
Ответ #13
от RM5P 18 Сен, 2017 14:19
-
Интерфейс какой, SPI или I2C ?
-
Ответ #14
от RA3EME Александр 18 Сен, 2017 16:33
-
Точность нужна максимальная, делаю показометр для УДГ фрезерного станка.