Перейти к содержанию
    

Реализация 32-битного квадратурного счетчика на STM32 (от энкодера)

Если за период опроса энкодер не успевает нащёлкать 2^16, то всё ещё проще

uint32_t getEncoder()
{
    static uint16_t oldCnt = 0;    // предыдущее значение счётчика таймера
    static uint32_t encoder = 0;   // а это наш 32-битный энкодер

    int16_t delta = TIM3->CNT - oldCnt;   // дельта счётчика, если он считал

    oldCnt += delta;

    return encoder += delta;
}

 

Если память не жмёт, а энкодеров несколько, то можно придумать каку-нить

typedef struct
{
    uint16_t *  ptimcnt;
    int32_t     enccnt;
    int16_t     delta;
} encoder_t;

void update_encoder(encoder_t *penc) { ...  }; // по периоду опроса энкодеров
int32_t get_encoder(encoder_t *penc) {return penc->enccnt}; // по мере необходимости

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 25.01.2023 в 14:17, tonyk_av сказал:

Ведомый настраивается как обычный счётчик. Ведомым счётчик становится после того, как в качестве источника его тактирования указывается выход другого счётчика и включается режим ведомого.

image.thumb.png.151815c7b5df7808f89aaa39da7ec655.png

вот тут сразу спрошу, а какой триггер предложите? Просто по сути тактирование от другого дает не так много вариантов, я использовал Update, есть еще Enable, Reset, CC итд, но я что-то ни один не воспринял как триггер со знаком, что я имею ввиду? Да то что у меня мой триггер срабатывал на втором счетчике как при переполнении, так и при обратном счете (переход от 65535 в 0) одинаково, то есть счет в обратную сторону не осуществлялся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, auric said:

Да то что у меня мой триггер срабатывал на втором счетчике как при переполнении

Вот тут с

 

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

image.png.a0615f29dfa01abd89d20f82b6185f35.png

3 hours ago, auric said:

а какой триггер предложите?

Если правильно помню, то нужно настроить мастера на нужный режим, а у слэйва выбрать нужный источник импульсов:

image.png.d52ca7b8ab277915fd842748987710ba.png

 

Ещё напомню, что можно прямо под отладчиком менять настройки таймеров в их регистрах и смотреть результат.

В "Руководстве по применению таймеров" было подробное описание работы и пример настройки каскада из таймеров. Оно есть на сайте СТМ и общее для всех STM32.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 26.01.2023 в 12:25, xemul сказал:

Если за период опроса энкодер не успевает нащёлкать 2^16, то всё ещё проще

uint32_t getEncoder()
{
    static uint16_t oldCnt = 0;    // предыдущее значение счётчика таймера
    static uint32_t encoder = 0;   // а это наш 32-битный энкодер

    int16_t delta = TIM3->CNT - oldCnt;   // дельта счётчика, если он считал

    oldCnt += delta;

    return encoder += delta;
}

 

 

 Спасибо, красиво и просто, возьму на заметку, я с IFами делал зачем-то 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, tonyk_av сказал:

Вот тут с

 

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

image.png.a0615f29dfa01abd89d20f82b6185f35.png

Если правильно помню, то нужно настроить мастера на нужный режим, а у слэйва выбрать нужный источник импульсов:

image.png.d52ca7b8ab277915fd842748987710ba.png

 

Ещё напомню, что можно прямо под отладчиком менять настройки таймеров в их регистрах и смотреть результат.

В "Руководстве по применению таймеров" было подробное описание работы и пример настройки каскада из таймеров. Оно есть на сайте СТМ и общее для всех STM32.

https://community.st.com/s/question/0D53W00001nBOLvSAO/stm32g431-timer-encoder-mode-master-slave

Если с пояснениями, то я не видел действительно, как передавая триггер передать и направление счета для подчиненного таймера. Триггер я тоже формировал записывая 0b010 в CR2->MMS, что означает Update.

По поводу прерывания при переходе через 0 вообще не понял, у нас нет разделения перехода Underflow и Overflow, все это по сути Update.

Изменено пользователем auric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, auric said:

я не видел действительно, как передавая триггер передать и направление счета для подчиненного таймера

Давно уже пора взять МК с подходящими таймера и не выдумывать костыли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Особенно гуманистично это предложение в нынешних условиях в ветке про STM32 звучит (-;
"ДелатьИзТогоЧтоЕсть"ModeOn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/27/2023 at 4:27 PM, Obam said:

Особенно гуманистично это предложение в нынешних условиях в ветке про STM32 звучит (-;
"ДелатьИзТогоЧтоЕсть"ModeOn

Giga Device, Geehy, Artery

Заграница нам поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...