avatar
Ха, нужно было притвориться предприятием «tqfp.org» :)
avatar
Этой микросхемы уже нет в списке бесплатных сэмплов. Вчера еще на этапе добавления в корзину ругнулось. Мол «Not in free sample program». другие микросхемки спокойно зааппрувили. Ах да, хорошо быть предприятием :)
avatar
Я писал нечто такое. Забрать можно вот тут. Писал я это очень быстро, но оно работает в реальном проекте и работает хорошо. Обратной связи, как у автора там нет, ускорение просто по шажкам шагового двигателя.
avatar
Спасибо за статью.
Есще такой вопрос: Есть шаговый двигатель, он управляется сигналами step(шаг) и dir(направление вращения) через хардварный драйвер. Каким образом реализовать функцию которая бы предовала параметры (в функцию обработки срабатывания таймера) или вызывалась по срабатыванию таймера и выдавала соответсвующие сигналы step и dir, при этом параметры следующие: начальная скорость вращения; конечная скорость вращеня; значение ускорения.
avatar
Благодарю, поправил.
avatar
Согласен, но в данном вараинте меня устроило именно такое решение.
avatar
Да, кстати. Точки разделения прямых нужно не ручками от балды выбирать, а юзать соответствующий мат.аппарат.
avatar
есть такой метод минимизации ошибки — наименьших квадратов. Он бы совсем не так прямые провел…
avatar
ложит и бурет в заголовке функций не по русски…
avatar
1/ Вынеси data из структуры fifo_t, оставь только указатель на внешний массив. Это позволит создавать очереди разной длины. Нужно вбудет объявлять сначала массив, потом экземпляр fifo_t и инициализировать указатель.
2/ Не нужна функция fifo_init() — структуру можно инициализировать при объявлении как обычную переменную
3/ Каждый экземпляр очереди должен работать с элементами одного типа/длины. Соответственно, в fifo_t стоит внести поле element_size и тогда при чтении и записи будет уже известно, сколько байт читать или писать — не потребуется указывать параметры этим функциям.
4/ Зачем функциям чтения и записи параметр offset? Фифо очередь должна сама знать, с какого элемента писать и с какого элемента читать и есть ли элементы вообще. ???
avatar
Перехвачена то может быть, но инкремент хвоста ведется только в прерывании. А в основном потоке ведется инкремент головы. В итоге, они между собой не конфликтуют. Нет, бывают конечно конфликты, когда нужно выяснить сколько элементов в буфере, но тогда уж можно и прерывания запретить.

Как это должно выглядеть? Что-то вида:
Ну, точно не «const», так как ты его только на этапе компиляции заполнить сможешь.

А вообще, правильно. Вообще. нужно как-то найти силы, оформить и выложить свой Fifo.
avatar
Да, реализация действительно красивее :) Особенно понравилось решение с маской, избавляемся от условного перехода, что есть гут ) Да и от лишней переменной…
avatar
Мне понравилась реализация Работа с кольцевым буфером, теперь постоянно использую. Как говорят «просто, дешево, сердито» :)
avatar
Вот кстати не мог вспомнить 3й пункт в вопросы, а это как раз были потоковые обращения… Да, на данный момент отключаю прерывания перед вызовом функций, внутрь библиотеки это не вносил, т.к. считаю что про манипуляции с прерываниями нужно помнить в контексте проекта… И кстати без count тоже вопрос… Конструкция вида
fifo->data[fifo->tail++] =((u8*) data)[i];

тоже ведь может быть не атомарной, управление может быть перехвачено уже после обращения к массиву, но до инкремента «хвоста»… Или я не прав?
Вот кстати на данном этапе почитываю C# Троелсена, и действительно в С хочется иметь плюшки ООП =) Теперь понимаю, почему ты на плюсах пишешь… Наверное тоже попробую, только пока углубиться в изучение не получится, боюсь что вместе с шарпом в голове каша получится — буду путать нюансы…
А по поводу длины буфера внутри структуры — вот как-то проскакивала такая мысль, но потом решил что не получится, и даже не проверил…
Как это должно выглядеть? Что-то вида:

typedef struct {
  u8 const len;
  u8 data[len];
  u8 head;
  u8 tail;
  u8 count;
} fifo_t;

Но подозреваю что не совсем так, компилятор то должен знать длину массива уже на этапе объявления… (Сейчас IAR не стоит, точнее стоит только для STM8)
Все, мне пора убегать :) Спасибо за пояснение.
avatar
FIFO_LENGTH — это длина буфера, которую нужно задефайнить в заголовке.
Предлагаю тебе внести в fifo_t количество элементов в этому буфере :)
Можно использовать класс и один из чего методов будет количеством записей.

если мы укажем к примеру 5 байт в первом вызове, то мы запишем 4 байта полезных данных
Если ты пишешь на Си, то можно сделать кучу функций «fifo_put_int», «fifo_put_char» итп. Если на C++, то можно перегрузить fifo_put для работы с нужным типом данных, можно сделать шаблон fifo_putв котором вызывать внутреннюю fifo_put c sizeof(T) в качестве размера.

Еще, буферы с count — не потокобезопасны. Если одни поток (прерывания) будут писать, а другой (задача) будет читать, то это все нужно объявлять как volatile и блокировать прерывания на время обращений к count.

В качестве альтернативы можно обойтись без count, используя только head, tail запас в один байт :)
avatar
Аналогично. Лишь бы у вас была переменная, которая соответствовала бы скорости работы шаговика. Преобразование задания скорости в период переключения обмоток шаговика — это уже задача преобразователя. Но тут встает проблема — зависимость между процентным значением скорости и абсолютным значением периода переключения — обратная, то бишь — гиперболическая.
Один из простых методов преобразования одной переменной в другое — метод линеаризации. Про него будет моя сегодняшняя статья.
avatar
А возможно данный метод «прикрутить» к шаговому двигателю? То есть, я могу расчитать по основным характеристикам двигателя его максимальную частоту вращения, максимальное ускорение. Соответсвенно как может быть выглядить код управления шаговым двигатемем по интенсивности?
avatar
Идея отличная.
avatar
С Альтиум работаю почти два года, если есть вопросы, могу также ответить.
avatar
Обычно стоит, но когда нужно избавиться от синфазной помехи в каком-то медленном и мега-чувствительном аналоге, можно и резистор в землю поставить. Такое я пару раз видел в аудио ЦАПах, там рекомендовали ставить бусинки в землю. Естественно, падение на этом резисторе не должно превышать неких разумных пределов, обычно 0.3 вольта.