roboforum.ru

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

серва с постоянным вращением с магнитным энкодером.

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 08 фев 2012, 22:08

Нашел магнит от актуатора сидирома, выдает вот такую картинку:
IMAG006.jpg
IMAG006.jpg (61.05 КиБ) Просмотров: 3687

Из-за того, что двигатель держу рукой, видны сильные искажения (вместо треугольника - кривые). Из-за того, что магнит - прямоугольник, в части диапазона датчик сигнал не выдает. Но в левой части есть идеальный участок, где видна прямая и четкий переход через ноль.
Этот дачик отдает абсолютное значение угла 0-360град.
Второй датчик, который у меня есть - инкрементальный. С ним пока не разбирался, но он, наверное, неплох для колес, в то время как первый - для всяких серв и т.п.

Re: серва с постоянным вращением с магнитным энкодером.

elmot » 09 фев 2012, 13:24

dccharacter писал(а):
elmot писал(а):Вполне себе получается. Магниты тоже заказал?

Неа. С холодильника сниму.

Насчет магнитов. Если взять магнит с аксиальной намагниченностью(первое что в голову пришло - дохлые наушники) и тупо его сломать. Получишь поперечно намагниченную плоскость. ею и крутить над датчиком. Я мутил энкодер на холле для машинки с таким магнитом, - оч легко делается.

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 09 фев 2012, 20:58

ае???
Вложения
IMAG004.jpg
IMAG004.jpg (63.14 КиБ) Просмотров: 3658

Re: серва с постоянным вращением с магнитным энкодером.

elmot » 09 фев 2012, 22:45

Ляпота!

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 11 фев 2012, 00:08

Че-то не выходит никак каменный цветок. На забирает STM32-Discovery по SPI данные и все. При этом Bus Pirate спокойненько все считывает и в ус не дует. Причем на осцилле вижу, что AS5043 заказ на данные получает и исправно 16 бит в сторону STM32 отправляет. Но тот кажет 65535 и все....

Добавлено спустя 41 минуту 27 секунд:
Код: Выделить всёРазвернуть
GPIO_SetBits(GPIOA, GPIO_Pin_5); //clock up
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //SS down
valEnc = 0;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //clock down
GPIO_SetBits(GPIOA, GPIO_Pin_5); //clock up
for (k = 0; k<9; k++)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_5); //clock down
    valEnc = (valEnc << 1) | GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
    GPIO_SetBits(GPIOA, GPIO_Pin_5); //clock up
}
GPIO_SetBits(GPIOA, GPIO_Pin_4); //SS up


А вот так - работает. Частота, если я правильно понимаю, в районе 6МГц.

Re: серва с постоянным вращением с магнитным энкодером.

elmot » 11 фев 2012, 00:38

У меня вот так работает. STM8s, 16МГц
Код: Выделить всёРазвернуть
int readDirection(void)
{
  u16 as5043data;
   int i;
   BitStatus s;
   GPIO_WriteLow(AS5043_PORT, AS5043_CSn);
   delay();
   //17, the first bit is insignificant, shall be dropped
   for(i = 0; i < 17;i++)   
   {
      GPIO_WriteLow(AS5043_PORT, AS5043_CLK);
      delay();
           s = GPIO_ReadInputPin(AS5043_PORT, AS5043_DO);
      as5043data = as5043data << 1 | (s ? 1 :0);
      GPIO_WriteHigh(AS5043_PORT, AS5043_CLK);
      delay();
   }
   GPIO_WriteHigh(AS5043_PORT, AS5043_CSn);
   return as5043data;
}
void delay(void)
{
   u16 i;
   for(i = 0; i <2000; i++)
   {
      nop();
   }
}

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 11 фев 2012, 03:55

А вот сейчас SPI-ем считал. Сейчас буду подпорки одну за другой убирать. Если удастся на DMA все это дело вывести, будет круто.

Добавлено спустя 1 минуту 56 секунд:
Блина, точность-то у него какая зверская... 512 честных отсчетов без дребезга практически....

Добавлено спустя 3 минуты 19 секунд:
SPI работает оно только в режиме FullDuplex. В RX-Only отмораживается и не хочет воспринимать данные.

Добавлено спустя 1 час 8 минут 28 секунд:
Так, вот рабочий код для чтения показаний с STM32 через SPI:

Дефайны для удобства:
Код: Выделить всёРазвернуть
#define AS5043_Val AS5043_Out.Value
#define AS5043_Pos AS5043_Out.Merged.Position
#define AS5043_OCF AS5043_Out.Merged.OCF
#define AS5043_COF AS5043_Out.Merged.COF
#define AS5043_LIN AS5043_Out.Merged.LIN
#define AS5043_MAGDEC AS5043_Out.Merged.MAGDEC
#define AS5043_MAGENC AS5043_Out.Merged.MAGINC


Структура для показаний датчика
Код: Выделить всёРазвернуть
typedef union {
       uint16_t Value;
       struct {
          uint8_t            :1;
          uint8_t MAGDEC      :1;
          uint8_t MAGINC      :1;
          uint8_t LIN         :1;
          uint8_t COF         :1;
          uint8_t OCF         :1;
          uint16_t Position   :10;
       } Merged;
    } AS5043_Type;

    AS5043_Type AS5043_Out;


Сетап SPI:
Код: Выделить всёРазвернуть
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx ;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI1, &SPI_InitStructure);


    /* Enable SPI1 */
    SPI_SSOutputCmd(SPI1, ENABLE);


Клоки:
Код: Выделить всёРазвернуть
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE);


GPIO:
Код: Выделить всёРазвернуть
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4 |GPIO_Pin_5 /*| GPIO_Pin_6*/ | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


Ну и само чтение:
Код: Выделить всёРазвернуть
SPI_Cmd(SPI1, ENABLE);
       while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
       SPI_Cmd(SPI1, DISABLE);
       AS5043_Val = SPI_I2S_ReceiveData(SPI1);


Грабли, по которым я ходил два дня: несмотря на любую логику при использовании unidirection RX-only линии, вход от датчика подключается не к MISO, а к MOSI. Вот так вот...

Добавлено спустя 1 час 45 минут 38 секунд:
Грязный хак - за счет потери 1-го бита разрешения можно полностью автоматизировать сбор данных с датчика на STM32 (при желании - с двух датчиков). Конфигурируем USART2 (и USART3 если надо) на 9ть бит, flow control rts, врубаем клок... Максимальный клок, с которым заработало - 500кГц, около 10мкс на пакет.

Но есть большая ложка дегтя, которую я не знаю как обойти. AS5043 выкидывает данные MSB first, сериал принимает LSB first

Я вот конечно вот такое сделал, но это ж ужос, весь смысл теряется:
Код: Выделить всёРазвернуть
val1 = 0;

for (k = 0; k<9; k++)
{
  val1 = (val1<<1) | (val&1);
  val = val>>1;
}

Re: серва с постоянным вращением с магнитным энкодером.

elmot » 11 фев 2012, 09:58

Напиши таблицу пересчета байтов, возьми 2 канала dma. Один канал берет байт с датчика и пишет смещение таблицы во второй канал, а второй канал - байт из таблицы - в массив данных:)
:)))

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 13 фев 2012, 17:58

Да, даже не представляете, какой гемор эти специальные магнитики. На митино смотрят просто как на дебила - у них на радиоэлектронном рынке все стенды увешаны хренью для магнитов на холодильники, а вот магнит для датчика - не, не понимаем о чем ты. Нашел в одном инет-магазине по 50 рублей, но мин заказ - 700 и доставка 200. Стоит ли овчинка выделки?

Купил кубиков 5х5х5. Как попробую - отпишусь.

Re: серва с постоянным вращением с магнитным энкодером.

NeON79 » 13 фев 2012, 18:09

Простите за оффтоп: а чем это такие криншоты осцилограмм красивые получаются?

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 13 фев 2012, 18:32

NeON79 писал(а):Простите за оффтоп: а чем это такие криншоты осцилограмм красивые получаются?

Осцилл DSO Quad

Re: серва с постоянным вращением с магнитным энкодером.

dccharacter » 13 фев 2012, 22:54

dccharacter писал(а):Купил кубиков 5х5х5. Как попробую - отпишусь.

ну фигня, конечно. появились небольшие ступеньки. в кач-ве колесного энкодера мож пойдет, для угла - уже нет

Re: серва с постоянным вращением с магнитным энкодером.

Myp » 13 фев 2012, 22:58

зажать кубик в дрель и обточить до круга?

Re: серва с постоянным вращением с магнитным энкодером.

Michael_K » 13 фев 2012, 23:14

может тупо взять магнит от холодильника (мягкий резиновый) и вырезать?
Он полосами намагничен.

Re: серва с постоянным вращением с магнитным энкодером.

RealRobot » 14 фев 2012, 08:48

Пару лет назад переделывал серву паралах постоянного вращения. Вместо штатной платы впаивал свою платку с магнитным энкодером AS5040, получалось вроде 256 шагов на оборот. Если кому интересно могу выложить инфу.


Rambler\'s Top100 Mail.ru counter