artos5 Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 Всем доброго времени суток! Необходима стабилизация частоты вращения двигателей по энкодерам. Энкодеры состоят из одного датчика холла на валу двигателя. Эту задачу на АВР я решил при помощи INT0 и аппаратного таймера , попробовал перенести код на STM32 . Попробовал через EXTI , результат не понравился .. Решил через таймер . void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint8_t InpCaptIndexL=0, InpCaptIndexR=0; if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value if(InpCaptIndexR==0) { Motor.TimerOldR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=1; } else { Motor.TimerNewR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=0; } if (Motor.TimerOldR > Motor.TimerNewR) { Motor.MotorRData = (Motor.TimerOldR - Motor.TimerNewR); } else { Motor.MotorRData = (Motor.TimerNewR - Motor.TimerOldR); } // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value if(InpCaptIndexL==0) { Motor.TimerOldL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=1; } else { Motor.TimerNewL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=0; } if (Motor.TimerOldL > Motor.TimerNewL) { Motor.MotorLData = (Motor.TimerOldL - Motor.TimerNewL); } else { Motor.MotorLData = (Motor.TimerNewL - Motor.TimerOldL); } // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed1(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } в интернете подсмотрел применение захвата но получается какая то каша . Осциллографом четко вижу меандр одинаковой частоты , а в юарт сыпет постоянно разные значения ... (имею ввиду переменную Motor.MotorLData и Motor.MotorRData) Тактирование 64МГц настройки таймера такие: TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 6400; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } что то я или недопонимаю , или что то не так приготавливаю.. Пробовал и так: void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value Motor.TimerR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value Motor.TimerL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } Результат тоже хуже чем на АВР , и в юарт сыпет каша (имею ввиду переменную Motor.TimerL и Motor.TimerR) Помогите пожалуйста разобраться в чем дело. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 Первое, что надо сделать - отказаться от говноHAL. И ровно с этого момента все станет понятно и работоспособно. 31 минуту назад, artos5 сказал: Необходима стабилизация частоты вращения двигателей по энкодерам. А ПИД уже готов? 32 минуты назад, artos5 сказал: в юарт сыпет каша Совсем каша или значение можно проследить? Ну и отправка по UART как организована и где вызывается? Почитайте про захват вот тут https://hubstub.ru/stm32/128-stm32-rezhim-zahvata.html 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
artos5 Опубликовано 2 декабря, 2018 Автор Поделиться Опубликовано 2 декабря, 2018 11 минуту назад, BARS_ сказал: Совсем каша или значение можно проследить? Совсем каша. 12 минуты назад, BARS_ сказал: А ПИД уже готов? Нет У меня на AVR без пид работало хорошо. Измерял период и подстраивал ШИМ если были расхождения . В двигателей тех инерционности практически нет . 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторовОбязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
GOR23 Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 А эта штука StabMotorSpeed() не сильно тяжёлая? Может она прерывание вешает на долго? Данные в юарт выкидываете периодически, или каждый раза как прерывания таймера срабатывает? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 2 декабря, 2018 Автор Поделиться Опубликовано 2 декабря, 2018 11 минуту назад, GOR23 сказал: А эта штука StabMotorSpeed() не сильно тяжёлая? Нет , там регулятор ШИМ , максимум 5 строчек кода . Юарт в вечном цикле пару раз в секунду выводит показания с датчиков 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 Особо не вникал, напишу то что бросилось в глаза: if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =RISING= EDGE DETECTED Не уверен что так определяется фронт, я бы вычитывал состояние соответствующего пина. При чем что в настройках: sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; только восходящий фронт. И второе, попробуйте завернуть весь колбэк в такую штуку: if(htim->Instance == TIM2) { } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 2 декабря, 2018 Автор Поделиться Опубликовано 2 декабря, 2018 2 минуты назад, GOR23 сказал: только восходящий фронт. Да мне и так сойдёт . Нужно считать период и немного подстраивать ШИМ . 4 минуты назад, GOR23 сказал: Не уверен что так определяется фронт, я бы вычитывал состояние соответствующего пина. При чем что в настройках: Я пробовал и в лоб , через модуль EXTI и таймер. Тоже результат хреновый . Значение таймера (что насчитал ) сильно отличалось . Например было так: 5 10 82 1 30 При том что меандр на осциллографе хороший показывает. 7 минут назад, GOR23 сказал: И второе, попробуйте завернуть весь колбэк в такую штуку: Ооо, это завтра попробую , спасибо ) 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 Тогда ещё вопрос, к какой ноге датчик хола подключен? Нога правильно настроена? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 2 декабря, 2018 Автор Поделиться Опубликовано 2 декабря, 2018 Нашел такую ерунду в ерата , и как мне это временное решение применить? Если мне надо постоянно захватывать сигнал?)) 4 минуты назад, GOR23 сказал: Нога правильно настроена? Щас не помню на память какие ноги (их две настроено) второй таймер , вход 1 и 2 . Настроено все 100% правильно и ноги те выбраны. На импульсы они откликаются , но какая-то каша происходит , вплоть до того что они друг на друга влияют ) 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 2 декабря, 2018 Поделиться Опубликовано 2 декабря, 2018 Мыши плакали, кололись, но продолжали жрать кактус! Я вот не пойму, нафиг вы вцепились в HAL? Чем вас не устроила прямая запись в регистрыс возможностью нормальной проверки кода по даташиту? Я уже и пример дал, где считается период, а в конце статьи ссылка на подсчет частоты. Да выбросьте вы это убожество, напишите 5 строк кода и никогда о нем не вспоминайте. Передача по uart, небось, тоже через hal идет, а что hal делает при передаче вы и не знаете. Может он прерывания запрещает. И кстати, вы данные в буфер складывание, а потом предаете, или просто выдергиваете переменную в случайный момент времени и передаете? Если второй вариант, то вы никогда и не увидите стабильных значений.... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
AVI-crak Home Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 7 часов назад, artos5 сказал: Необходима стабилизация частоты вращения двигателей по энкодерам. Вход захвата таймера имеет аппаратный фильтр от дребезга, его обязательно нужно настроить. Но как это сделать на хале - не подскажу. Вообще, хал использует 10% от всех возможностей периферии, и это требование обратной совместимости. Дело в том что в серии st есть откровенно дохлые чипы, которые тоже должны работать через хал. Вот так самое слабое звено гасит всё остальное. Чтоб было легче разобраться. https://arm-stm.blogspot.com/2016/01/stm32f-timer-diagramm.html 0 RtoS Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 3 декабря, 2018 Автор Поделиться Опубликовано 3 декабря, 2018 Да я тут походу готовлю неправильно... Я не совсем понимаю как таймер считает . Я то знаю что он считает вверх и он подсчитывает период сигнала . Кто может пояснить , нужно ли этот счётчик обнулять? Или он сам обнуляется аппаратно? Хочу все же использовать этот режим , так как он максимально подходит для данной задачи.. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
snn_krs Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 Попробуйте PWM Input mode. Это режим измерения PWM сигнала. Настраиваются 2 канала на один вход, и измеряется длительнось общая и длительность 0. В этом режиме счетчик автоматически сбрасывается. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 3 декабря, 2018 Автор Поделиться Опубликовано 3 декабря, 2018 Как тут в 6м посте?? : http://www.cyberforum.ru/arm/thread2090357.html Два пина получается нужно соединять вместе? 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
snn_krs Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 4 minutes ago, artos5 said: Два пина получается нужно соединять вместе Соединять не надо просто вход 1 выбирается и для канала 1 и для канала 2. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 Блин, ну референс же есть. Там все ПОДРОБНО описано. Вот что мешает прочесть? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterElectric Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 Вот как это так вышло что дубовый АВР на прерываниях справился, а СТМ32 нет))) ну не может такого быть 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 3 декабря, 2018 Автор Поделиться Опубликовано 3 декабря, 2018 Чёт нихрена не пойму .. Я могу настроить один вход захвата второго таймера на ножку TI1 и читать регистр TIM2->CCR1 , и также настроить второй вход TI2 и читать с TIM2->CCR2 ? мне нужно на двух физически разных энкодерах получать период импульсов. Что то первый канал влияет на второй а второй на первый ... Я уже регистры считываю по мануалу. Или мне нужно для второго энкодера выбрать другой таймер с его входом захвата? Мне PWM_INPUT_MODE не нужен мне достаточно по любому из фронтов получать период сигнала. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterElectric Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 Ну ты бы написал какой МК, а то есть различия. Если просто режим захвата 1 и 2 каналы на 1 датчик, 3 и 4 на второй, хотя может так и не получиться. Каналы настрой на разные фронты (в 103 иначе и никак, по обоим не работает), фильтрацию подбери, посмотри что там анализатор показывает. А если в режиме энкодера, то нужно 2 датчика на 1 двигатель. А если просто период измерить то после захвата вызывай прерывание. Да и статью ж дали я все по ней делал и все работало правда задача совсем другая. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 3 декабря, 2018 Автор Поделиться Опубликовано 3 декабря, 2018 Короче решил задачу) Взял два отдельных таймера в режиме pwm input mode . , Но считываю с одного регистра таймеров в лоб. Довольно стабильно работает 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.