День добрый!
Вчера подрубил шаговый двиг и энкодер к ардуине. Двиг работает без нареканий. Через драйвер. Добится нужно в идеале - одна ступенька энкодера : один шаг ШД. Поигрался с задержками, но как хотел так и не получается.
С энкодером маюсь. Вообщем, если его быстро крутить, то он пропускает шаги. Если случайно или при медленном вращении, ручку энкодера остановить между фиксированными положениями (ступеньками) - врубается обратный шаг.
Т.е. крутим направо - шаговый шагает направо, если случайно между ступеньками остановим - шаговый влево, потом вправо. Итог - шаговик вращается рвано.
Управление энкодером сделал по образу: http://www.compcar.ru/forum/showthre...EA%EE%E4%E5%F0
т.е. без кондеров, как в этом посте: http://www.compcar.ru/forum/showthre...EA%EE%E4%E5%F0
может это как то влиять?
****
Еще вопросец. Когда ничего не происходит(т.е. ШД не вертится), то его даже рукой очень трудно вращать. Ротор стоит намертво . Как я понимаю это из-за того, что он шагнул к текущей обмотке и она его там удерживает. Вообщем при этом двиг нормально так греется. Надо убрать питание с обмоток? Если да, то для этого достаточно подать на драйвер все LOW (не успел вчера проверить)?
Цитата:
int encoder_left = 3;
int enc_pos = 0;
byte pos[4];
void setup()
{
pos[0] = HIGH;
pos[1] = LOW;
pos[2] = LOW;
pos[3] = LOW;
enc_pos = 0;
...
}
void loop_forward(int time, int pause)
{
for (int i = 0; i<=time; i++)
{
pos[enc_pos] = LOW;
enc_pos++;
if (enc_pos>3) enc_pos = 0;
if (enc_pos<0) enc_pos = 3;
pos[enc_pos] = HIGH;
digitalWrite(motorPin1, pos[0]);
digitalWrite(motorPin2, pos[1]);
digitalWrite(motorPin3, pos[2]);
digitalWrite(motorPin4, pos[3]);
delay(pause);
}
}
void loop()
{
...
//Encoder rotate left
if(digitalRead(encoder_left) == LOW)
{
delay(4);
if(digitalRead(encoder_left) == LOW)
{
loop_forward(2,22);
}
}
...
}
|
Спасибо.
|