LINUX.ORG.RU

Тайминг в Расбери Пи

 , ,


0

2

Всем привет. Такая запара: надо управлять шаговым двигателем средствами расбери пи. Не могу найти четкого тактирования или хоть какой-то годный код, где бы это было сделано аппаратно. Самое приближенное, что нашлось, здесь:

http://abyz.co.uk/rpi/pigpio/code/minimal_clk.zip

но что-то я вообще не пойму, как оно работает и что ему надо послать через консоль (то ли 1k, то ли просто один 1 или просто k, если мне , например, нужно 19,2 честных МГц)

Должен же быть какой-то простой способ получить неплавающие импульсы от такой то железки, на которой, по словам очевидцев, чего только не реализовано, ну и поуправлять ими



Последнее исправление: Tumyq (всего исправлений: 2)

Ты хочешь из не-RT системы сделать RT, ничего у тебя не выйдет.

Но если сильно крутых характеристик не нужно, можешь посмотреть, как я двигал корректор. Сейчас под той же «малинкой» разрабатываю деротатор, там нужна будет очень точная скорость, похоже, намучаюсь с регуляторами...

В принципе, простейший мой код крутил ШД на скоростях ~0.1-10 шагов в секунду с точностью не хуже 0.1 шага. Мне этого достаточно.

anonymous
()

Да, если будешь реализовывать это как отдельный поток, то тебе понадобятся функции точных задержек:

    int selfd = -1;
    struct timeval tv;
    tv.tv_sec  = (time_t) delay;
    tv.tv_usec = (suseconds_t)((delay-(double)tv.tv_sec)*1e6);
    errno = 0;
    while(selfd < 0){
        selfd = select(0, NULL, NULL, NULL, &tv);
        if(selfd < 0 && errno != EINTR){
            WARN(_("Error while select()"));
            tmout = 1;
            return NULL;
        }
    }
(нет смысла заменять select на pselect: наносекунд ты на «малинке» не добьешься!). Еще, возможно, пригодится функция для определения времени:
double dtime(){
    double t;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
    return t;
}

anonymous
()
Ответ на: комментарий от Deleted

Она отлично заработала. Другое дело — драйвер на TB6560 — говно! Нужен нормальный тринамиковский драйвер, т.к. мотор мощный и всякими drv8825 его не попинаешь.

anonymous
()

Должен же быть какой-то простой способ получить неплавающие импульсы

«Колхоз» RPi + Arduino(real time), типа ©.

quickquest ★★★★★
()
Ответ на: комментарий от Deleted

Кстати, коль уж ты меня знаешь, что у тебя за ник был-то, пока я на ЛОРе не из-под анонимуса писал?

anonymous
()
Ответ на: комментарий от quickquest

Абдурина — для лохов.

Если уж делать, то на нормальных микроконтроллерах. Все схемы и исходники лежат у меня на гитхабе. Можно просто сделать (или заказать) печатные платы, распаять, прошить и пользоваться.

anonymous
()
Ответ на: комментарий от anonymous

Абдурина — для лохов.

«Абдурина» — для экономных «лентяев», не желающих тратить время на «нормальные микроконтроллеры», но жаждущих получить быстрый результат.

P.S. Вылазь из анонимусов, тебя тут все с полуслова узнают. Какой смысл прятаться? :)

quickquest ★★★★★
()
Ответ на: комментарий от anonymous

мне всего то надо меандр максимум 10кГц,и чтобы частота не плавала. 10 шагов/сек - мало. Пробовал делать это циклами с помощью библиотек bcm2835 и wiringPi. Эта затея с самого начала мне казалась сомнительной, но в примерах было так, и как результат - у движка сбивается ход - появляется стук

Tumyq
() автор топика
Ответ на: комментарий от anonymous

мне надо задержку между сменой состояния пина 5 - 30 микросекунд. А идея интересная - сделать точную задержку. Она не будет проскакивать, если система тормознет? Там же , вроде как таймер и счетчик привязан к системе, а не к тактам шины.

Tumyq
() автор топика
Ответ на: комментарий от quickquest

Вылазь из анонимусов

Смысл? Все равно ЛОР — давно не торт! Здесь теперь засилье хрюникодчиков, бубунтофилов и поцтеролизов.

anonymous
()
Ответ на: комментарий от Tumyq

Повторяю: линукс — не рилтаймовая система! А уж на совершенно тупой «малинке» никто не гарантирует постоянных задержек.

Да, ты хоть в wiringPi ногами через DMA дрыгаешь (требует запуска от рута или установки suid-бита)? Потому как sys-интерфейс слишком тормозной для такой затеи.

На малых скоростях меандр идет вполне стабильный, но скорости выше 200 шагов в секунду при дроблении шага на 8 тебе никак не добиться. И уже на 100 ш/с меандр совершенно кривой получается.

В общем, либо покупай готовый контроллер ШД, либо лепи свой. «Малинка» в этом тебе не поможет.

anonymous
()
Ответ на: комментарий от anonymous

На самом деле, я тоже так считаю, но у меня есть коллеги, которые настаивают, что там есть высокочастотный кварц, есть шина, от которой всё тактируется,

и система Линукс должна сама строго тактироваться, чтобы не было в ней сбоев. Таким образом сподвигая меня искать доступ к аппаратным средствам Расбери.

Посмотри, если не сложно, тот код, который я в вопросе выложил. Он, вроде как, мапит ножки, но я не вижу в нем, как он добирается до аппаратных средств. Там есть какой-то GPCLK - что это за зверь?

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Да, я совсем забыл о том, что на «малинке» есть ШИМ-выход. Ты можешь использовать его для тактирования драйвера ШД. Вот только считать количество шагов ты при этом не сможешь.

У «малинки» GPIO совсем никакущее. И ты не сможешь, как на микроконтроллере, связать два таймера, чтобы считать шаги и с изменяющейся скоростью (рампы разгона/торможения) дергать STEP драйвера ШД.

anonymous
()
Ответ на: комментарий от anonymous

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

Не подскажешь. как его запустить?

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Глянул код, который ты выложил. Похоже, автор кода через mmap инициализирует какой-то таймер «малинки» и этот таймер с заданной частотой дергает ногу.

Сдается мне, это как раз управление ШИМ-выходом. Т.е. то, о чем я говорил: ты сможешь весело гонять ШД с разными скоростями, но не сможешь повернуть его на заданное количество шагов.

anonymous
()
Ответ на: комментарий от anonymous

Мне шаги считать не нужно.

Я этот код скомпилировал, запускаю - он фигню выдает, не понятно, что надо прописать -

там толкового описания по командам нет, пишет, что код успешно завершен 0 или закрывает консоль

Tumyq
() автор топика

управлять шаговым двигателем средствами расбери пи

Поставь рядом контроллер и им рули, а с Pi только команды передавай.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от quickquest

Он ЛОР прошёл, теперь ему положено быть анонимусом.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Tumyq

Возьми -rtai ядро, с его помощью можно много стабильнее и меньше задержки получить. И вообще глянь как сделано в linuxcnc

timdorohin ★★★★
()
Ответ на: комментарий от timdorohin

Спасибо, гляну. Просто сейчас уже есть почти готовый проект с системой расбиан, перерабатывать все остальное - не вариант

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Ты нормальных таймингов без RT-расширений, которые суть навес кооперативной многозадачности рядом с ядром, не добьёшься. Потому что любой чих в виде нагрузки на проц больше определённой, отправит тайминги к херам.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Tumyq

Ты справку читал?

void usage()
{
   fprintf
   (stderr,
      "\n" \
      "Usage: minimal_clk x.x[KM] [OPTION]...\n" \
      "       minimal_clk x.xD [OPTION]...\n\n" \
      "    x.x, frequency, must be between 4.6875 KHz and 500 MHz.\n"\
      "    K kilo multiplier\n"\
      "    M mega multiplier\n\n"\
      "    x.xD, divider, must be 2.0 or greater and less than 4096.\n\n"\
      "   -q, leaves clock set on gpio4 at exit, default, disables clock\n"\
      "   -c clock, %d=GPCLK_0 or %d=GPCLK_2, default %d\n" \
      "   -m MASH, %d-%d, default %d\n" \
      "   -s prefer clock source, %d=PLLD, %d=OSC, %d=HDMI, %d=PLLC, default %d\n\n" \
      "EXAMPLE\n" \
      "minimal_clk  36.23m\n" \
      "  Sets frequency 36.23 MHz.\n" \
      "minimal_clk  234.179d\n" \
      "  Sets integer divider to 234 and fractional divider to 733.\n" \
      "\n",
      OPT_C_1, OPT_C_2, OPT_C_DEF,
      OPT_M_F, OPT_M_L, OPT_M_DEF,
      OPT_S_1, OPT_S_2, OPT_S_3, OPT_S_4, OPT_S_DEF
   );
}
Если ты не введешь флаг '-q', то будет выведена надпись «Press return to exit and disable clock...» и когда нажмешь какую-нибудь клавишу, выхлоп остановится.

В зависимости от выбранного источника меандр будет либо на ноге GPIO_4, либо GPIO_6.

Каким местом ты в код смотришь?

Добавь туда еще отладочных сообщений, если он не доходит до инициализации таймера, чтобы понять, в чем проблема.

И да, с чего бы вдруг тебе «не разрешат ставить микроконтроллер»? Все равно он будет меньше по размерам, чем драйвер ШД. Можно интегрировать драйвер с МК, получится небольшая платка — контроллер. Хотя, боюсь, истинная причина в том, что ты не умеешь программировать. И если не смог даже этот небольшой исходник прочитать, то осилить 1000-страничный мануал и 150-страничный даташит на простенький МК не можешь.

anonymous
()
Ответ на: комментарий от timdorohin

как сделано в linuxcnc

linuxcnc запускается на десктопе с аппаратным LPT-портом. Через LPT и рулит. И никто там не парится насчет нестабильных задержек, т.к. полноценный комп способен обеспечить точность в 10% и лучше, чего предостаточно. (конечно, если ты в момент работы не будешь втыкать флешки или как-то иначе нагружать IO).

anonymous
()
Ответ на: комментарий от anonymous

аааа... Зачем я полез в исходники linuxcnc? Это говнище вообще на пхытоне написано!

Оооо... Мои глаза…

anonymous
()
Ответ на: комментарий от Dark_SavanT

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

что все летит к хренам, и уже полноправно требовать решения со сторонними приблудами.

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Еще раз тебе повторяю: читай внимательно код. Он должен работать. Но более простой вариант — запустить при помощи wiringPi ШИМ-генератор. Он и даст тебе нужную частоту.

И вообще, есть же частотники всякие... Или от тебя требуется из говна и палок конфетку сделать?

anonymous
()
Ответ на: комментарий от anonymous

Куда уж там нам)

На деле работает так: открывается консоль, нажимаешь хоть что, вылезает надпись

---------------------------
(program exited with code:0)
Press return to continue

Потом можно писать вот эти k multiply x или нажимать ESC, Backspace, delete

все равно после Enter консоль свернется и тю-тю.. Сижу с тестером, и уже проверил все ноги во время выполнения программы, после и даже до(тут шутка). Нигде нет ничего

Tumyq
() автор топика
Ответ на: комментарий от anonymous

говнопалочный вариант. драйверы купили от Тошиба и еще какой-то покруче, контроллер вешать не хотят

Tumyq
() автор топика

Программно - никак. У RPi есть GPU со своей прошивкой который выполняет функции Intel ME и мешает работе программ. Если хочешь realtime программно - выбирай например BBB или хотя бы что-то на Allwinner. Там тебе будет вполне вменяемый софтовый realtime.

Железячно - копай в сторону PWM. Надеюсь звук тебе в девайсе не нужен (в RPi аудио тоже сделано через жопу PWM ).

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Спасибо, да так и копаю к PWM. Неужели нельзя просто послать команду запуска аппаратного ШИМ, чтобы он лупился сам по себе до тех пор, пока не будет послана команда остановиться?

Или абсолютно все регистры и DMA завязаны на ось?

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

В общем, у этой истории есть конец (неплохой).

Поковырявшись, таки разобрался, как запустить тот пример кода, который был в моем вопросе, и он дал чистые 7.999 кГц, то есть 8, держит вполне хорошо, скоро прикручу движок, обучу его отключаться и будет мне счастье на Земле.

Кому интересно: качаете код, компилируете, и полученный исходник запускаете в консоли с параметрами вот так:

sudo /path/to/executable/file/minimal_clk 8000

Из IDE вы ничего не увидите. Код проверяет, на BCM4(реальная нога 7) или BCM6 ноге возможно реализовать эту частоту, выводит об этом инфу в консоль и , собственно, запускает ее там. Так что , проверяйте вторую , если первая не дает ее

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

«полученный исполняемый файл», пардон

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

Посмотри как драйвер «саундкарты» сделан. Оно там как раз лупится.

Stanson ★★★★★
()

А может лучше отдельный МК прикупишь? Он-то и будет рулить твоим двигателем, а с малины будешь команды по i2c посылать.

Unicode4all ★★★★★
()
Ответ на: комментарий от Unicode4all

I2C — говеный интерфейс. А т.к. обычно UART малинки занят консолью, то остается только SPI (тоже не айс) или USB. Собираем CDC-устройство и управляем по USB (если расстояния небольшие, конечно).

anonymous
()
Ответ на: комментарий от Tumyq

Из IDE вы ничего не увидите

вот подозревал, что ТС что-то делает не так. А он, оказывается, вендузятник!

anonymous
()
Ответ на: комментарий от anonymous

I2c привел как пример. Обычно я пользуюсь SPI. Тут всё зависит от предпочтений ТСа. Может он через gpio захочет байтики гонять. Всяко лучше, чем с малины рулить.

Unicode4all ★★★★★
()
Ответ на: комментарий от Unicode4all

Привет. Да мне не сложно МК прикрутить, и я это даже cделал на STM32F103 непосредственно для этой задачи, но там не хватало 3.3V, надо 5, трансформатор мне не выделили, мою «операцию „Ы“» завернули), просто такое решение для проекта не понравилось по вышеупомянутым причинам

Tumyq
() автор топика
Ответ на: комментарий от anonymous

Слабая попытка начать халевар на почве «религиозных» взглядов линуксоидизма)

На rasbian есть штатный редактор кода для С Geany, если из консоли компилируется лучше(тут шутка) - пожалуйста.

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

На F103 ЕМНИП есть пины с 5В (в зависимости от типа корпуса чипа). Поройся в даташите на чип, там на какой-то странице есть таблица с пинами. Те, что с I/O Level = FT могут давать и принимать 5В. А вот к портам малины я бы 5В не подключал :) В любом случае отдельный МК для двигателей — лучшее решение.

Unicode4all ★★★★★
()
Ответ на: комментарий от Unicode4all

Ясно, у меня был не ЕМНИП, так - завалялся stm32f103c8t6, платка за сто рублей с Али, его с ардуинкой еще путают. на нем есть пины только на прием 5V. Но говорю же, этот вариант не рассматривается

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

там не хватало 3.3V, надо 5

Ты опять что-то делал не так. Почему-то у меня все на 3.3В прекрасно работает и согласуется с пятивольтовой периферией!!!

anonymous
()
Ответ на: комментарий от Unicode4all

Давать 5В они никак не могут. Зато можно их перевести в режим opendrain и подтянуть резистором к +5В. И все будет отлично работать.

ТС же, похоже, только-только начал с одноплатниками, микроконтроллерами и программированием. Но странно, что он не хочет нормально документацию читать, а сразу забивает, как только что-то не получилось.

Я ему ссылку на свой гитхаб давал, где контроллер на STM32F030 управляет парой шаговиков. Еще есть подобные штуки на STM8 (для управления униполярными и биполярными движками). Плюс писал давно на F103 (правда, через жопу: с использованием opencm3 вместо чистого CMSIS'а) управление спектрографом (там куча всяких терморезисторов, 5 шаговиков, затвор и еще всякое). Еще начал когда-то код для сверлильного станка (на макете оно у меня работало, но надо было еще немного чего добавить), там один шаговик, один двигатель постоянного тока и включение/выключение шпинделя (ну и кнопочки всякие).

Да и вообще, можно готовых поделок миллион найти на просторах интернета: с готовыми прошивками и печатными платами!

Но ТС чего-то уперся в «малинку».

Хоть бы вкратце техзадание изложил, вдруг там можно вообще выкрутиться значительно проще?

anonymous
()

Должен же быть какой-то простой способ получить неплавающие импульсы от такой то железки, на которой, по словам очевидцев, чего только не реализовано, ну и поуправлять им

Там есть один аппаратный PWM, с помощью которого удалось транслировать FM радио на 100 MHz.

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.