"ёж птица гордая...", нужно придать направление полёта
- Войдите на сайт для отправки комментариев
Втр, 08/03/2016 - 19:34
надо(хочу) сделать зависимость хитровыкрученную штуку
есть плата управления сервоприводами, управляемая с компа, "руководит" 3-мя сервами, хочу "прикрутить" к ней ещё управление шаговиком, т.е. на дуину приходит ШИМ сигнал с платы (500-2500ms), надо правильно преобразовать его в "шаги"
малость наковырял
"вычисление ширины сигнала"
unsigned long v1 = 0; unsigned long v2 = 0; unsigned long x1 = 0; void setup() { pinMode(6, INPUT); while (digitalRead(6) == LOW); v1 = micros(); while (digitalRead(6) == HIGH); v2 = micros(); x1=v2-v1; }
в принципе - работает, правда скачет +-4ms, ну с этим будем бороться позже
дальше идет затык, как грамотно преобразовать ширину импульса в шаги? (а когда еще в программировании профан, так вообще ппц)
как я вижу(представляю) алгоритм:
есть х1, по такому же принципу снимает х2, разница (+или-) преобразуется в шаги, вроде так...
ну собственно вопрос в какую сторону читать, где коварять? конечно можно заказать, но хотелось самому разобраться
забыл добавить: драйвер - Мonster Moto Shield VNH2SP30, чтоб с запасом так сказать )
Если я вас правильно понял. Вы хотите отсчитывать количество импульсов и понимать их шагами. Тоесть послели три раза по 2500 мс это три шага. Может стоит установить счетчик вроде проверки самого события импульса типа:
А потом если понадобиться задать определенное... кажется понял. Вам нужно задавать шаги, а оно делает нужное кол-во импульсов. Да? тогда нужна конструкция вроде:
Вся суть в цикле for для которого число в значении переменной steps играет роль количества циклов для откравки импульса. Я привел пример отдельной функции. Вызвать ее нужно
Надеюсь не ошибся)
ммм, я наверно не совсем правильно обьяснил, ШИМ сигнал идёт постоянно, меняется только ширина сигнала (от 500ms до 2500ms), таким образом микросекунды надо перевести в шаги
Кстати, изначально пробовал обойтись только сервами. Взял mg996r, штатный потенциометр заменил на 10-ти оборотный, врубил цикл и... эта зараза оказывается может спокойно ошибаться на пол оборота. Есть профи по сервам, из-за чего может быть такая погрешность?
Как вы выводите импульсы по длине. Не пойму. Вам важно получать кол-во пройденных шагов или установить определенное кличество шагов. Если первое тогда как я писал в примере выше (вариант 1) Счетчик на само событие запуска испульса. Т.е. отправили ккомманду и посчитали его. Или занести определенное кол-во мс в переменную и добавить ее в место где ставиться импульс. Потом это же число заносить приплюсовуя в отдельную переменную типа 500+500+500 и т.д. Можно считать импульсы как по времени потом к примеру поделить их сумму на минимальный или максимальный импульс. (10000/500=кол-во ваших шагов) или сделать счетсчик на отдельной переменной. Если устройство выдает импульсы и вам нужно их считать. Есть же функция PulseIn. МБ ей попробовать замерить сигнали и прибавлять в общее значение, делить и узнать шаги. А если испульсы разняться типа 500 500 2500 500 То уже сложнее. Понятнее было бы иметь представление о хитроумном дэвайсе.