student23 1 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба Всем привет. Я работаю на СТМ32 BluePill. Есть двигатель, силовой драйвер и источник питания. Для того, чтобы подать напряжение на двигатель через ШИМ, нужно задать коэффициент заполнения. Я настроил таймер с возможностью генерации ШИМ -сигнала. Настройки его на картинке. То есть максимальное значение, которое можно подать, это 1000. Суть в том, что я написал регулятор скорости через прерывание (выполняется каждые 10 мс, скорость вращения находится через энкодер на том же прерывании).Выходной сигнал - это нужная скорость вращения. У этого регулятора выходной сигнал ограничен до макс. диапазона шим (то есть о 0 до 1000 может быть максимальный выходной сигнал). Значение этого сигнала подается на ШИМ (Я написал в коде как TIM3 -> CCR1 = out) Но как я понимаю, этот скорость нарастания данного сигнала следует ограничивать, то есть чтобы не было такой ситуации, что выходной сигнал резко перешел от 0 до 1000. Просто источник тока я включаю немного позже, и за это время выходной сигнал естественно очень сильно возрастает. Почитав пару статей про двигатель постоянного тока, я понял, что такой ситуации следует избегать. Везде пишут про ограничение скорости нарастания сигнала. Как это можно ограничить программно? Прошу помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 35 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба Судя по названиям переменных, у вас ПИ-регулятор и обычное явление перерегулирования. Уменьшайте коэффициенты регулятора. Умножение на 0,0003333 подозрительно само по себе. У вас не целочисленные вычисления? Текст придуман как раз для того чтобы не пользоваться изображениями, если что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
student23 1 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба 20 минут назад, vov4ick сказал: Судя по названиям переменных, у вас ПИ-регулятор и обычное явление перерегулирования. Уменьшайте коэффициенты регулятора. Умножение на 0,0003333 подозрительно само по себе. У вас не целочисленные вычисления? Текст придуман как раз для того чтобы не пользоваться изображениями, если что. Это старый код) Раньше была частота прерываний 3000 Гц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex-lab 5 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба 1 hour ago, student23 said: тобы не было такой ситуации, что выходной сигнал резко перешел от 0 до 1000 Вам нужно знать, за какое минимальное число шагов допустимо такое переключение. Например за 10, тогда максимальный шаг изменения не должен превышать 100. Перед записью в CCR1 сравниваете PWM1 с его же значением на предыдущем шаге. Если разница больше 100, то 100. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
student23 1 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба 1 час назад, Alex-lab сказал: Вам нужно знать, за какое минимальное число шагов допустимо такое переключение. Огромное спасибо за дельную мысль, наконец-то понял, как реализовать) Это ведь верно? Я беру в самом начале прерываний прошлое значение с ШИМ, а затем сравниваю модуль от разности. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба 1 час назад, student23 сказал: Огромное спасибо за дельную мысль, наконец-то понял, как реализовать) Admin: Вставляйте код как текст в специально предусмотренном для этого блоке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex-lab 5 17 сентября, 2022 Опубликовано 17 сентября, 2022 · Жалоба 4 hours ago, student23 said: Это ведь верно? Я беру в самом начале прерываний прошлое значение с ШИМ, а затем сравниваю модуль от разности. Я не могу понять ваш код, почему там все закомментировано? Где начало обработчика прерывания? У вас не правильно, вы ограничили сам PWM, а нужно лишь прирост, то есть вместо if ... PWM_1=300 должно быть что-то вроде: if (PWM1-PWM1_old > 300) { PWM1 = PWM1_old + 300; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться