roboforum.ru

Технический форум по робототехнике.


Плата для сенсора AS5045.

Все что связано с изготовлением ПП

Re: Плата для сенсора AS5045.

Сообщение d00m » 14 май 2013, 01:10

да едут уже магниты.. когда только приедут с нашей почтой - хз.. микрухи заказывал в штаты - за три (3 !) дня приехали туда !
видать таки слабый магнит..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение d00m » 15 май 2013, 16:15

понял какая проблема с магнитом - нужен с диаметральным намагничиванием. я же купил видимо с аксиальным.
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение d00m » 17 май 2013, 23:41

за три для приехали халявные магниты и новые энкодеры AS5055
до этого успел найти в Питере диаметрально намагниченные магниты.
теперь у меня куча разного хлама..

итак, сегодня удалось все таки прикрепить магнит на задний конец вала.
и оно таки крутится и угол меняется ) наконецто !
но есть свои глюки..
когда вал стоит - угол все равно меняется +-2 градуса. какойто шум чтоли.. надо какото побороть.
и еще - нужно както оптимизировать алгоритм работы скетча.
прошу советов на этот счет.
по идее нужно делать проверку энкодера очень часто, чтобы при максимальной скорости прокрутки вала, код успевал отработать и выдавать результат о положении вала.
то есть наверное за каждый шаг вала (их всего 200 за полный оборот) нужно высчитывать данные датчика.. это нужно както синхронизировать, чтобы не было пропусков..
пока код выглядит так, намиксовал найденной в инете.
правда чето мотор сильно греется..

#define enablePin 3
#define MicroStep1Pin 4
#define MicroStep2Pin 5
#define MicroStep3Pin 6

#define setupTimeInMicroSec 1
int dirPin = 8;
int stepperPin = 7;

void setFullStep() {
digitalWrite(MicroStep1Pin, LOW);
digitalWrite(MicroStep2Pin, LOW);
digitalWrite(MicroStep3Pin, LOW);
delayMicroseconds(setupTimeInMicroSec);
}

void step(boolean dir,int steps) {
digitalWrite(dirPin,dir);
delay(500);
for(int i=0;i<steps;i++) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepperPin, LOW);
delayMicroseconds(1000);
}
}

//###########################

const int ledPin = 13; // LED connected to digital pin 13, used as a heartbeat
const int clockPin = 9; // output to clock
const int CSnPin = 10; // output to chip select
const int inputPin = 11; // read AS5045

int inputstream = 0; // one bit read from pin
long packeddata = 0; // two bytes concatenated from inputstream
long angle = 0; // holds processed angle value
long anglemask = 262080; // 0x111111111111000000: mask to obtain first 12 digits with position info
long statusmask = 63; // 0x000000000000111111; mask to obtain last 6 digits containing status info
long statusbits; // holds status/error information
int DECn; // bit holding decreasing magnet field error data
int INCn; // bit holding increasing magnet field error data
int OCF; // bit holding startup-valid bit
int COF; // bit holding cordic DSP processing error data
int LIN; // bit holding magnet field displacement error data
int debug = 1; // SET THIS TO 0 TO DISABLE PRINTING OF ERROR CODES

void setup() {

pinMode(dirPin, OUTPUT);
pinMode(stepperPin, OUTPUT);
setFullStep();

//#########################

Serial.begin(9600);
pinMode(ledPin, OUTPUT); // visual signal of I/O to chip: heartbeat
pinMode(clockPin, OUTPUT); // SCK
pinMode(CSnPin, OUTPUT); // CSn -- has to toggle high and low to signal chip to start data transfer
pinMode(inputPin, INPUT); // SDA
}

void loop() {

step(true,1);
delay(1000);
//##########################

// CSn needs to cycle from high to low to initiate transfer. Then clock cycles. As it goes high
// again, data will appear on sda
digitalWrite(CSnPin, HIGH); // CSn high
digitalWrite(clockPin, HIGH); // CLK high
delay(1000); // wait for 1 second for no particular reason
digitalWrite(ledPin, HIGH); // signal start of transfer with LED
digitalWrite(CSnPin, LOW); // CSn low: start of transfer
delay(100); // delay for chip -- 1000x as long as it needs to be
digitalWrite(clockPin, LOW); // CLK goes low: start clocking
delay(10); // hold low for 10 ms
for (int x=0; x < 18; x++) // clock signal, 18 transitions, output to clock pin
{
digitalWrite(clockPin, HIGH); // clock goes high
delay(10); // wait 10ms
inputstream = digitalRead(inputPin); // read one bit of data from pin
//Serial.print(inputstream, DEC); // useful if you want to see the actual bits
packeddata = ((packeddata << 1) + inputstream); // left-shift summing variable, add pin value
digitalWrite(clockPin, LOW);
delay(10); // end of one clock cycle
} // end of entire clock cycle
//Serial.println(" ");
digitalWrite(ledPin, LOW); // signal end of transmission
// lots of diagnostics for verifying bitwise operations
//Serial.print("packed:");
//Serial.println(packeddata,DEC);
//Serial.print("pack bin: ");
// Serial.println(packeddata,BIN);
angle = packeddata & anglemask; // mask rightmost 6 digits of packeddata to zero, into angle.
//Serial.print("mask: ");
//Serial.println(anglemask, BIN);
//Serial.print("bin angle:");
//Serial.println(angle, BIN);
//Serial.print("angle: ");
//Serial.println(angle, DEC);
angle = (angle >> 6); // shift 18-digit angle right 6 digits to form 12-digit value
//Serial.print("angleshft:");
//Serial.println(angle, BIN);
//Serial.print("angledec: ");
//Serial.println(angle, DEC);
angle = angle * 0.08789; // angle * (360/4096) == actual degrees
Serial.print("angle: "); // and, finally, print it.
Serial.println(angle, DEC);
//Serial.println("--------------------");
//Serial.print("raw: "); // this was the prefix for the bit-by-bit diag output inside the loop.
if (debug)
{
statusbits = packeddata & statusmask;
DECn = statusbits & 2; // goes high if magnet moved away from IC
INCn = statusbits & 4; // goes high if magnet moved towards IC
LIN = statusbits & 8; // goes high for linearity alarm
COF = statusbits & 16; // goes high for cordic overflow: data invalid
OCF = statusbits & 32; // this is 1 when the chip startup is finished.
if (DECn && INCn) { Serial.println("magnet moved out of range"); }
else
{
if (DECn) { Serial.println("magnet moved away from chip"); }
if (INCn) { Serial.println("magnet moved towards chip"); }
}
if (LIN) { Serial.println("linearity alarm: magnet misaligned? Data questionable."); }
if (COF) { Serial.println("cordic overflow: magnet misaligned? Data invalid."); }
}

packeddata = 0; // reset both variables to zero so they don't just accumulate
angle = 0;
}
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение elmot » 18 май 2013, 00:01

+- 2 градуса??? или +-2 единицы в результате?
вообще-то этот датчик может фигачить данные с такой скоростью, что никаким шаговиком ты за ним не угонишься
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 00:04

даже +-5 единиц в результате.
но я думаю это и есть градусы, так в коде написано ж..

еще обнаружил неприятность - при сбросе питания он обнуляет позицию.
например, выключаю питания когда вал на 50 градусов. то есть код выводит 50.
выключаю ардуину и мотор. включаю и на вывод отображается 360 (+-5, то есть то 0, то 358 и т.д.) - это фигня.. я думал там абсолютный отсчет..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение elmot » 18 май 2013, 00:23

ищи косяки. Точность этой штуки 0.06 град, и это абсолютный энкодер

Добавлено спустя 4 минуты 16 секунд:
что там со светодиодами индикации поля?
что идет в служебных битах?
Осцил есть?
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 00:24

то есть не должно быть таких "шумов" и если вал не крутится, то значение не должно меняться ?

а как быть насчет сброса значения ? я чтото читал об установке zero position.. может стоит туда копнуть ?

upd:
они не горят. я так пониммаю это значит, что магнит установлен правильно.

про служебные биты не вкурсе, как их читать смотреть ?

осцила нету. я и не умею им пользоваться..
IMG_20130518_003111.jpg

IMG_20130518_003219.jpg
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение elmot » 18 май 2013, 00:51

d00m писал(а):то есть не должно быть таких "шумов" и если вал не крутится, то значение не должно меняться ?

а как быть насчет сброса значения ? я чтото читал об установке zero position.. может стоит туда копнуть ?

upd:
они не горят. я так пониммаю это значит, что магнит установлен правильно.

про служебные биты не вкурсе, как их читать смотреть ?

осцила нету. я и не умею им пользоваться..
IMG_20130518_003111.jpg

IMG_20130518_003219.jpg


Не должно быть. Не стоит туда копать. Установка Zero position - это и есть тот самый режим програмиирования PROG.

Если сместить плату, то загораются светодиоды?

Полную схему в студию.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 00:55

если сместить плату то оба загораются
magnet moved out of range
angle: 338
magnet moved out of range
angle: 225
magnet moved out of range
angle: 9
magnet moved out of range
angle: 117
magnet moved out of range
angle: 152
magnet moved out of range

схему счас сделаю..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение elmot » 18 май 2013, 00:58

еще можно воспроизвести схему из раздела 10 и померять напряжение.

и да, не вижу на схеме конденсаторов.


ЗЫ учи англ, чтобы не спрашивать всякую фигню, которая написана в ДШ прямым текстом.

Добавлено спустя 2 минуты 58 секунд:
magnet moved out of range - это значит, что магнит вне диапазона, схема выдает фигню. почему не горят светики - не знаю.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 01:16

я не понял коментария насчет инглиша.. канеш не особо знаю, но доку прочесть могу вроде.. на какой странице в ДШ написано чтото, на что я должен сейчас обратить внимание ?

как переводится "magnet moved out of range" я знаю. это вывод после того как я снял плату. оба диода зажглись. если плата установлена - они НЕ горят. я думаю так и надо.

кондер там в схеме подключен к выводу 3.3 вольта. я питаю от ардуины 5 вольтами.. думаю кондер не нужен..
IMG_20130518_005821.jpg

IMG_20130518_005947.jpg


схему готовлю..

Добавлено спустя 9 минут 34 секунды:
собрано по такой схеме:

as5045-2.JPG
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение elmot » 18 май 2013, 02:39

насчеткондеров -см даташит. по-моему они его предписывают.
судя повсему датчик работает, а с дуиной что-то криво. ищи косяк
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 12:32

да есть такое в ДШ

For 5V operation, the 5V supply is connected to pin VDD5V, while VDD3V3 (LDO output) must be buffered by a
2.2...10µF capacitor, which is supposed to be placed close to the supply pin (see Figure 16).

Добавлено спустя 1 час 44 минуты 9 секунд:
а есть какито ограничения на конструтив кондеров ? или можно купить в чип (SMD) формате ?
прийдется ехать опять в микронику - нету дома кондеров нужных..
я вот хотел еще спросить
download/file.php?id=24010&mode=view
зачем там у вас еще пара микрух и такой большой желтый кондер или что это такое..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение d00m » 18 май 2013, 19:38

так.. чет опять не пойму..
припаял два кондера.
as5045-2.JPG

вроде стало без шума работать..

но при этом исчезла проблема, когда обнулялся счетчик энкодера ) теперь после сброса питания он показывает тот угол на котором остался до этого )
кажется у меня все начинает получаться )

Добавлено спустя 1 час 48 минут 44 секунды:
мда.. кажется я лоханулся с драйвером для шаговика - Stepper Motor: Bipolar, 200 Steps/Rev, 28×45mm, 4.5V, 0.67 A/Phase
http://www.pololu.com/catalog/product/1206

а драйвер купил такой

http://www.pololu.com/catalog/product/1182
и он рассчитан на напряжение от 8 волт.. и шаговик греется как утюг.
надо было такой брать
http://www.pololu.com/catalog/product/2134
или можно както помочь беде ?
счас подаю на драйвер 7.5V - бп с регулятором..
если выставлю <=5V - вобще не крутится..
а на при 6V мотор свистит - издает очень похожий звук. даже когда не крутится )) и этот свист прекратился при 7.5V.. но стало греться..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Re: Плата для сенсора AS5045.

Сообщение d00m » 19 май 2013, 22:17

как правильно калибровать энкодер ?
так как сейчас он не сбрасывает показания угла после выключения питания, то мне нужно сейчас выставить 0.. не магнитом же его выставлять ? это не очень просто..
d00m
 
Сообщения: 152
Зарегистрирован: 02 ноя 2012, 23:46
Откуда: SPB

Пред.След.

Вернуться в Печатные платы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11