"ёж птица гордая...", нужно придать направление полёта

kg-nomad
Offline
Зарегистрирован: 08.03.2016
надо(хочу) сделать зависимость хитровыкрученную штуку
есть плата управления сервоприводами, управляемая с компа, "руководит" 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, разница (+или-) преобразуется в шаги, вроде так...
ну собственно вопрос в какую сторону читать, где коварять? конечно можно заказать, но хотелось самому разобраться

 

kg-nomad
Offline
Зарегистрирован: 08.03.2016

забыл добавить:  драйвер - Мonster Moto Shield VNH2SP30, чтоб с запасом так сказать )

Voltage max: 16V
Maximum current rating: 30 A
Practical Continuous Current: 14 A
Current sensing available to Arduino analog pin
MOSFET on-resistance: 19 mΩ (per leg)
Maximum PWM frequency: 20 kHz
Thermal Shutdown
Undervoltage and Overvoltage shutdown
 
мотор Nema17
Модель: 17HS4401
Ток: 1.7А
Крутящий момент: 4000g/cm
Фазы: 2
 
Ардуино Уно
UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Если я вас правильно понял. Вы хотите отсчитывать количество импульсов и понимать их шагами. Тоесть послели три раза по 2500 мс это три шага. Может стоит установить счетчик вроде проверки самого события импульса типа:

if (любой event который включает наш импульс==1) 
{
посылаем сам импульс
counter++;
}

А потом если понадобиться задать определенное... кажется понял. Вам нужно задавать шаги, а оно делает нужное кол-во импульсов. Да? тогда нужна конструкция вроде:

void stepController(int steps){
for (i=0, i < steps, i++)
{
посылаем испульс. Он повториться ровно столько сколько было задано в переменной steps
} 
}

Вся суть в цикле for для которого число в значении переменной steps играет роль количества циклов для откравки импульса. Я привел пример отдельной функции. Вызвать ее нужно 

stepController(30);
или переменной с числом вместо цифр

Надеюсь не ошибся)

kg-nomad
Offline
Зарегистрирован: 08.03.2016

ммм, я наверно не совсем правильно обьяснил, ШИМ сигнал идёт постоянно, меняется только ширина сигнала (от 500ms до 2500ms), таким образом микросекунды надо перевести в шаги

kg-nomad
Offline
Зарегистрирован: 08.03.2016

Кстати, изначально пробовал обойтись только сервами. Взял mg996r, штатный потенциометр заменил на 10-ти оборотный, врубил цикл и... эта зараза оказывается может спокойно ошибаться на пол оборота. Есть профи по сервам, из-за чего может быть такая погрешность?

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Как вы выводите импульсы по длине. Не пойму. Вам важно получать кол-во пройденных шагов или установить определенное кличество шагов. Если первое тогда как я писал в примере выше (вариант 1) Счетчик на само событие запуска испульса. Т.е. отправили ккомманду и посчитали его. Или занести определенное кол-во мс в переменную и добавить ее в место где ставиться импульс. Потом это же число заносить приплюсовуя в отдельную переменную типа 500+500+500 и т.д. Можно считать импульсы как по времени потом к примеру поделить их сумму на минимальный или максимальный импульс. (10000/500=кол-во ваших шагов) или сделать счетсчик на отдельной переменной. Если устройство выдает импульсы и вам нужно их считать. Есть же функция PulseIn. МБ ей попробовать замерить сигнали и прибавлять в общее значение, делить и узнать шаги. А если испульсы разняться типа 500 500 2500 500 То уже сложнее. Понятнее было бы иметь представление о хитроумном дэвайсе.