roboforum.ru

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


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

СРУВЧ!

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

Сообщение dccharacter » 08 фев 2012, 22:08

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

Из-за того, что двигатель держу рукой, видны сильные искажения (вместо треугольника - кривые). Из-за того, что магнит - прямоугольник, в части диапазона датчик сигнал не выдает. Но в левой части есть идеальный участок, где видна прямая и четкий переход через ноль.
Этот дачик отдает абсолютное значение угла 0-360град.
Второй датчик, который у меня есть - инкрементальный. С ним пока не разбирался, но он, наверное, неплох для колес, в то время как первый - для всяких серв и т.п.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение elmot » 09 фев 2012, 13:24

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

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

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

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

Сообщение dccharacter » 09 фев 2012, 20:58

ае???
Вложения
IMAG004.jpg
IMAG004.jpg (63.14 КиБ) Просмотров: 3662
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение elmot » 09 фев 2012, 22:45

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

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МГц.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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();
   }
}
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

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;
}
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение elmot » 11 фев 2012, 09:58

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

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

Сообщение dccharacter » 13 фев 2012, 17:58

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

Купил кубиков 5х5х5. Как попробую - отпишусь.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение NeON79 » 13 фев 2012, 18:09

Простите за оффтоп: а чем это такие криншоты осцилограмм красивые получаются?
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили “Титаник“
2:5020/2140.1979@fidonet
Аватара пользователя
NeON79
 
Сообщения: 536
Зарегистрирован: 09 май 2011, 16:43
Откуда: Украина, Киев
прог. языки: Нецензурный
ФИО: Евгений НеОН

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

Сообщение dccharacter » 13 фев 2012, 18:32

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

Осцилл DSO Quad
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение dccharacter » 13 фев 2012, 22:54

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

ну фигня, конечно. появились небольшие ступеньки. в кач-ве колесного энкодера мож пойдет, для угла - уже нет
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение Myp » 13 фев 2012, 22:58

зажать кубик в дрель и обточить до круга?
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение Michael_K » 13 фев 2012, 23:14

может тупо взять магнит от холодильника (мягкий резиновый) и вырезать?
Он полосами намагничен.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение RealRobot » 14 фев 2012, 08:48

Пару лет назад переделывал серву паралах постоянного вращения. Вместо штатной платы впаивал свою платку с магнитным энкодером AS5040, получалось вроде 256 шагов на оборот. Если кому интересно могу выложить инфу.
http://igrybogov.com - ну о.о.очень интересно
сознание определяет бытие, улыбнись своему отражению
RealRobot
 
Сообщения: 340
Зарегистрирован: 18 окт 2007, 23:46
Откуда: Москва
прог. языки: С++ , 1С :-)
ФИО: Михаил

Пред.След.

Вернуться в CRAZY PROJECTs

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

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