Энкодер и STM32
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
Dimon456, а то, что битовым сдвигом определить количество оборотов нельзя будет! Придется использовать деление, которое, напомню, у STM32F0 СОФТОВОЕ!
- Реклама
Re: Энкодер и STM32
Что-то я совсем загнался, а может такое быть, что регистр CCR недоступен для записи? пишу туда напрямую через TIM3->CCR1, через функцию TIM_SetCompare1 (хотя это конечно одно и то же, подготовки как таковой не наблюдается), а толку ноль. Таймер в режиме интерфейса энкодера вроде как может генерировать прерывания по сигналам Capture/Compare, но упорно не хочет писать в регистры сравнения.
Вопрос, если я пытаюсь воспользоваться фильтром (TIM_ICInit), я получается отказываюсь тем самым от работы регистров CCR1 и CCR2 в режиме compare? Просто если так, тогда понятно, эти регистры содержат сигналы и доступны для чтения. Блин как быть? Хочется и фильтр чтобы был, и уставки были на прерывание.
Вопрос, если я пытаюсь воспользоваться фильтром (TIM_ICInit), я получается отказываюсь тем самым от работы регистров CCR1 и CCR2 в режиме compare? Просто если так, тогда понятно, эти регистры содержат сигналы и доступны для чтения. Блин как быть? Хочется и фильтр чтобы был, и уставки были на прерывание.
Последний раз редактировалось auric Чт окт 14, 2021 14:05:22, всего редактировалось 1 раз.
Re: Энкодер и STM32
он у вас что, крутится с бешеной скоростью? Про какой энкодер речь идет?Eddy_Em писал(а):что битовым сдвигом определить количество оборотов нельзя будет!
На атмеге делили на 8-16МГц, а F0 на 48-72МГц не поделить?Eddy_Em писал(а):деление, которое, напомню, у STM32F0 СОФТОВОЕ!
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
Dimon456, если не экономить на мелочах, можно до того "допрограммироваться", что вместо STM32F0 потребуется F7!
Что до аврки, то ардуинщики такое подчас вытворяют, что волосы дыбом встают! Да, можно микроскопом орехи колоть, но зачем?
Что до аврки, то ардуинщики такое подчас вытворяют, что волосы дыбом встают! Да, можно микроскопом орехи колоть, но зачем?
Re: Энкодер и STM32
Eddy_Em, так вы мне энкодер покажите или нет?
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
[uquote="Dimon456",url="/forum/viewtopic.php?p=4105676#p4105676"]энкодер покажете или нет?[/uquote]
Да любой энкодер с квадратурным выходом. От тупых "ручек" в формфакторе переменных резисторов до всякой оптики, устанавливаемой на вал шаговика и т.п.
В случае работы с шаговым двигателем нужно каждые несколько миллисекунд проверять, что там нащелкал энкодер. Сравнивать с тем, что нащелкал таймер, пинающий STEP шаговика, принимать решение - уменьшать скорость или же придерживаться рампа.
Я для всех трех шаговиков делаю это в суперлупе. Просто сравниваю текущее значение системного таймера (его SysTick каждую миллисекунду инкрементирует) с временем прошлой проверки. Как не равно, проводится проверка. И понятно, что если эта проверка будет занимать слишком много времени, то могут быть неравномерности хода. Ведь проверить нужно еще и концевики и т.п.
Еще один вариант - запихать проверку в само прерывание SysTick, понизив его приоритет до самого дна, но мне это как-то совсем претит. Нехорошо большие куски, выполняющиеся дольше единиц микросекунд, пихать в прерывания.
Вот если вынести проверку концевиков и всякую математику в суперлуп, то можно и в прерывании проверять заедание вала и управлять рампом. Понятно, что никаких делений в этом случае не допускается - слишком длинная операция.
Да любой энкодер с квадратурным выходом. От тупых "ручек" в формфакторе переменных резисторов до всякой оптики, устанавливаемой на вал шаговика и т.п.
В случае работы с шаговым двигателем нужно каждые несколько миллисекунд проверять, что там нащелкал энкодер. Сравнивать с тем, что нащелкал таймер, пинающий STEP шаговика, принимать решение - уменьшать скорость или же придерживаться рампа.
Я для всех трех шаговиков делаю это в суперлупе. Просто сравниваю текущее значение системного таймера (его SysTick каждую миллисекунду инкрементирует) с временем прошлой проверки. Как не равно, проводится проверка. И понятно, что если эта проверка будет занимать слишком много времени, то могут быть неравномерности хода. Ведь проверить нужно еще и концевики и т.п.
Еще один вариант - запихать проверку в само прерывание SysTick, понизив его приоритет до самого дна, но мне это как-то совсем претит. Нехорошо большие куски, выполняющиеся дольше единиц микросекунд, пихать в прерывания.
Вот если вынести проверку концевиков и всякую математику в суперлуп, то можно и в прерывании проверять заедание вала и управлять рампом. Понятно, что никаких делений в этом случае не допускается - слишком длинная операция.
Re: Энкодер и STM32
Думал, что мы про какую-то конкретную модель говорим, а вы охватили весь спектр.Eddy_Em писал(а):Да любой энкодер с квадратурным выходом. От тупых "ручек" в формфакторе переменных резисторов до всякой оптики, устанавливаемой на вал шаговика и т.п.
Я то же как-то в поисках идеального решения, и пока его не нашел, а ваше
Eddy_Em писал(а):Я в качестве пробы вот такое наваял.
Спойлер
Код: Выделить всё
if(tim3cnt != TIM3->CNT){
int32_t diff = TIM3->CNT - tim3cnt;
if(tim3upd){
if(TIM3->CR1 & TIM_CR1_DIR) diff -= 80;
else diff += 80;
tim3upd = 0;
}
tim3cnt = TIM3->CNT;Давайте поговорим про такой
Спойлер

При всех включенных "цифровых фильтров" не удается добиться его устойчивой работы при повороте вала на один шаг, хочу что бы как в магнитоле отрабатывал. Конденсаторы отсутствуют на выходах энкодера, вот все думаю попробовать поставить на 1nF.
В теме AVR программную обработку перетрясли с ног до головы, но там то же как бы без кондеров ни как.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
Dimon456, я с таким и начинал. Никаких проблем не было - поворот на 1 щелчок четко отрабатывался. Фильтр настроил - и ОК. А без фильтра - да, глючило.
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Энкодер и STM32
Этот энкодер разбирали в нескольких темах АВР, к одной и я приложил свою руку. Что могу сказать? Новый такой энкодер дребезжит действительно только на фронтах замыкания/размыкания контактов. Однако, после одной-двух тысяч поворотов он перестает быть новым, и с него лезет такое, что ой! Коллега sunjob привел осциллограммы того, что выдает этот энкодер поизносившись. Далее мы с ним общались в личной переписке, я правил программу, он пробовал ее со своим раздолбанным энкодером, результаты коллега sunjob опубликовал здесь.Dimon456 писал(а):В теме AVR программную обработку перетрясли с ног до головы, но там то же как бы без кондеров ни как.
А с красивыми оптическими энкодерами (наприме, такими) - никаких вопросов, они спокойно работают, в том числе, и с аппаратной поддержкой инкрементных (квадратурных) энкодеров STM32.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: Энкодер и STM32
afz, но как же так, ведь Eddy_Em, писал
надо было простоEddy_Em писал(а):я с таким и начинал. Никаких проблем не было
Eddy_Em писал(а):Фильтр настроил - и ОК.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
[uquote="afz",url="/forum/viewtopic.php?p=4105781#p4105781"]Однако, после одной-двух тысяч поворотов он перестает быть новым, и с него лезет такое, что ой! Коллега sunjob привел осциллограммы[/uquote]
Жесть-то какая! Хотелось бы все-таки посмотреть, как на это будет реагировать МК. Если дребезг недетерминированный, никаких проблем не должно быть: ну, подумаешь, будет младший бит дребезжать. Да даже если второй бит — хрен с ним, можно ограничить работу минимум двумя "щелчками". А вот если щелчки детерминированы, то нафиг нужен такой дурацкий энкодер? Там и RC-фильтр не поможет, т.к. поди-ка определи частоту среза, чтобы при этом еще и на быстрое вращение энкодера реагировать...
Да, кстати, а не пробовали задрать фильтр на максимум? Конечно, это ограничит частоту вращения, но для энкодера, который крутит человек, не критично. Это ж не движок какой на 10000RPM!
Жесть-то какая! Хотелось бы все-таки посмотреть, как на это будет реагировать МК. Если дребезг недетерминированный, никаких проблем не должно быть: ну, подумаешь, будет младший бит дребезжать. Да даже если второй бит — хрен с ним, можно ограничить работу минимум двумя "щелчками". А вот если щелчки детерминированы, то нафиг нужен такой дурацкий энкодер? Там и RC-фильтр не поможет, т.к. поди-ка определи частоту среза, чтобы при этом еще и на быстрое вращение энкодера реагировать...
Да, кстати, а не пробовали задрать фильтр на максимум? Конечно, это ограничит частоту вращения, но для энкодера, который крутит человек, не критично. Это ж не движок какой на 10000RPM!
Re: Энкодер и STM32
Да куда уж максимальнееEddy_Em писал(а):а не пробовали задрать фильтр на максимум?
Код: Выделить всё
TIM3->CR1 |= TIM_CR1_CKD_1;
TIM3->CCMR1 |= TIM_CCMR1_IC1F_3 | TIM_CCMR1_IC1F_2 | TIM_CCMR1_IC1F_1 | TIM_CCMR1_IC1F_0;
TIM3->CCMR1 |= TIM_CCMR1_IC2F_3 | TIM_CCMR1_IC2F_2 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_IC2F_0;- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Энкодер и STM32
Нет, коллеги. Вы не совсем четко представили себе суть происходящего. Есть два сигнала, очень похожих. И сдвинутых на 90 градусов. Высокий уровень сигнала - контакт разомкнут (скользит по голому стеклотекстолиту, без фольги. Низкий уровень с жуткими помехами - контакт скользит по фольге, время от времени обрываясь. Контактов этих два и расположены они так, что четверть периода они оба разомкнуты, следующую четверть периода первый замкнут, второй еще разомкнут, третью четверть замкнуты оба и четвертую первый уже разомкнулся, второй еще замнут. Далее все повторяется. Так вот, прочувствуйте, что там творится в момент, когда замкнуты оба контакта и на оба входа вашего устройства валится тот самый мусор от плохих сухих контактов.
Моя методика с довольно грубой программной моделью сочетания интегратора и триггера Шмитта вполне справляется с этими помехами при не очень высокой скорости вращения вала энкодера (спокойное вращение рукой). Если более тщательно подобрать константы, возможно, она справится и с резким поворотом ручки энкодера, но тут, как всегда, будет компромисс между надежностью и скоростью.
Спросите, зачем это нужно, не проще ли выкинуть этот энкодер и поставить новый? Ответ прост: чем надежнее будет распознаваться вращение энкодера, тем реже придется брать в руки паяльник, чтобы его заменить...
Моя методика с довольно грубой программной моделью сочетания интегратора и триггера Шмитта вполне справляется с этими помехами при не очень высокой скорости вращения вала энкодера (спокойное вращение рукой). Если более тщательно подобрать константы, возможно, она справится и с резким поворотом ручки энкодера, но тут, как всегда, будет компромисс между надежностью и скоростью.
Спросите, зачем это нужно, не проще ли выкинуть этот энкодер и поставить новый? Ответ прост: чем надежнее будет распознаваться вращение энкодера, тем реже придется брать в руки паяльник, чтобы его заменить...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
Dimon456, фильтр неправильно настроен! У тебя fdts/32, 8 семплов. А можно сделать 0101 - fdts/2, 8 семплов. Будет куда как лучше!
Re: Энкодер и STM32
Eddy_Em, я усе перепробовал, начиная от 0000 до 1111, и это CKD от 00 до 10.
Осталось только кондерчики припаять, еще есть вариант с DVD плеера выдрать, уж больно они мне нравятся, но они без кнопки.
Осталось только кондерчики припаять, еще есть вариант с DVD плеера выдрать, уж больно они мне нравятся, но они без кнопки.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Энкодер и STM32
Аж интересно этого "пациента" пощупать стало! С таким-то дребезгом.
Надо будет, если уж делать будет нефиг на выходных, раздраконить один свой энкодер, чтобы звенел получше, да попробовать с ним поработать...
Хотя.. Я работаю с STM32F0, может, это глюки именно STM32F1? Там-то полным-полно багов в железе...
Надо будет, если уж делать будет нефиг на выходных, раздраконить один свой энкодер, чтобы звенел получше, да попробовать с ним поработать...
Хотя.. Я работаю с STM32F0, может, это глюки именно STM32F1? Там-то полным-полно багов в железе...
Re: Энкодер и STM32
Если энкодером управляет человек, какая разница сколько именно натрещит энкодер при резком повороте. Резко крутанули - параметр +10. Я так делал.
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Энкодер и STM32
Делается довольно просто: берем тихий слабенький движок с редуктором, 30-90 об/мин, через гибкий вал (отрезок резинового шланга 6 мм внутренний) подключаем его к энкодеру и запускаем на некоторое время. Раз в полчаса смотрим, что он выдает. Заодно можно будет оценить долговечность этого энкодера и косвенно - всей партии этих энкодеров, купленной у одного продавца.Eddy_Em писал(а):Надо будет, если уж делать будет нефиг на выходных, раздраконить один свой энкодер, чтобы звенел получше
Противодействие такому дребезгу - всегда компромисс. Ладно, разряд можно сделать быстрым - если на подтяжку к +5в ставить обычные 10 кОм, поставить разрядный резистор 100 Ом, и вперед. В моей программной модели - еще проще - по замыканию контакта сразу разряжать модель интегратора в ноль. А вот с зарядом сложнее. С одной стороны за время обрыва плохого контакта при скольжении по сектору фольги интегратор не должен успеть зарядиться до порога срабатывания триггера Шмитта. С другой, при сходе контакта в просвет между секторами фольги, интегратор обязан успеть зарядиться до срабатывания триггера Шмитта за время, заметно меньшее четверти периода, иначе будут пропуски. И, при таком подходе, верхняя скорость вращения энкодера всегда ограничена.
Подозреваю, если смазать стеклотекстолитину с контактами какой-нибудь приличной консистентной смазкой, долговечность этого энкодера увеличится раз в 10. Если, конечно, освоить технологию их разборки и последующей правильной сборки. Я с этим точно не справлюсь - зрение не позволит.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: Энкодер и STM32
Решил потестировать каскад таймеров, тк так и не добился полной защиты от сбоев при анализе в прерывании, но честно говоря не понял сути каскадирования, толку у меня от него ноль, настроил таймера так:
Если переход вверх через переполнение, все нормально, а если назад через 0, то событие генерируется идентичное, но подчиненный не может понять, что это обратный переход счет идет вверх.
Код: Выделить всё
// Внутренний триггер для слейва выставляем на сигнал Update
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
//Обозначаем TIM3 как мастер
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
//Для TIM3 Master необходим TIM4 Slave TS=TIM4_ITR2
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);
//Выбираем тип связи таймеров
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);
Re: Энкодер и STM32
Вот именно, без разницы.a797945 писал(а):какая разница сколько именно натрещит энкодер при резком повороте.
Мы имеем что? таймер с аппаратной поддержкой энкодера.
А я так не делал.a797945 писал(а):Резко крутанули - параметр +10. Я так делал.
Таймер посчитает сам, мне достаточно только считать значение счетного регистра и сравнить его с предыдущим значением, и я буду знать не только в какую сторону у меня энкодер крутится но и на сколько крутанули.
Основная проблема в том, что плохо отрабатывает один щелчок.


