Помогите с кодом

Тема в разделе "Технологии радиолюбителя", создана пользователем Рокки1945, 20 июл 2016.

  1. Рокки1945

    Рокки1945 Гуру

    Проблема следующего характера - мне надо считывать количество оборотов двигателя - на движке устанавливаем излучающий элемент - который будет перемещаться в динамике вместе с двигателем, а находящийся в статичном положении приемник будет менять состояние входа контролера с 1 на 0. Хотелось чтобы при встрече с приемником счетчик прибавлял только единицу - а не считывал много больше. Делал гестерезис 100 мс - работает но всего на 600 оборотов в минуту , а надо тысяч 10. Энкодер не ставлю - хочу программно решить с Вашей помощью. То есть при контакте он прибавлял к предыдущему результату только 1 то есть 1 оборот.
    Пока придумал только это:
    #define ser 11 // порт для 1 или 0
    long z = 0; // переменная для динамического изменения состояния входа 11
    void setup() {
    // put your setup code here, to run once:
    pinMode(11,INPUT); // подключаем вход
    Serial.begin(9600);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    int x = digitalRead (ser); //лишняя переменная))))
    if (x==HIGH)
    {
    delay(10);
    z++;// счетчик сколько проходов
    Serial.println(z);
    }
    }
     
    Последнее редактирование модератором: 20 июл 2016
  2. DIYMan

    DIYMan Guest

    Обороты надо считать не так, как делаете вы, а с помощью прерываний. Читайте про attachInterrupt.
     
  3. ANV

    ANV Гуру

    DIYMan нравится это.
  4. ostrov

    ostrov Гуру

    Иди давить дребезг программно. Но в любом случае без антидребезга он вам насчитает раз в 20 больше чем надо.
     
  5. ANV

    ANV Гуру

    Кривому железу - кривой софт. Подавать на вход прерывания шумный сигнал это из серии "слабоумие и отвага"
     
  6. ANV

    ANV Гуру

    В коде алгоритмический просчет. Если остановить двигатель в момент, когда на входе будет HIGH, то счетчик начнет бешено считать. Надо переменную x сохранить в x_old, а единицу прибавлять если x == HIGH, а x_old == LOW
     
  7. ostrov

    ostrov Гуру

    С какой стати дребезг стал кривым сигналом? Это обычная штатная ситуация для всех кнопок и прочих герконов с оптопарами. И программно отсекать его на прерывании задача не намного сложнее, чем обычный программный антидребезг, если немного подумать.. Кстати, аппаратный антидребезг можно сделать на RC цепи без всяких там триггеров Шмидта. Но если вам не нравятся простые пути, то пожалуйста продолжайте.
     
  8. ANV

    ANV Гуру

    Дребезг на прерываниях - зло.
    И по отношению к этому вопросу проходит граница между радиолюбителями и профессионалами.
     
  9. Рокки1945

    Рокки1945 Гуру

    пока только это:
    int pin = 13;
    volatile int state = LOW;


    void setup()
    {
    pinMode(pin, OUTPUT);
    Serial.begin(9600);
    attachInterrupt(0, blink, CHANGE);
    }

    void loop()
    {
    digitalWrite(pin, state);
    int z = 0;
    Serial.println(z);
    }

    void blink()
    {
    state = !state;
    //delay(10);
    z++;
    Serial.println(z);
    }
     
  10. ostrov

    ostrov Гуру

    Serial.pringtln() в прерывание вставлять не рекомендуемо, ибо оно медленное, а прерывание должно быть максимально быстрым.
     
  11. Рокки1945

    Рокки1945 Гуру

    Кто сильнее тот и прав ))))))))))))))))))))))
     
  12. Рокки1945

    Рокки1945 Гуру

    Подскажите правильно или нет

    volatile int state = LOW;

    void setup()
    {
    Serial.begin(9600);
    attachInterrupt(0, blink, RISING);
    }

    void loop()
    {
    long z=0;
    if(state==HIGH)
    {
    z++;
    Serial.println (z);
    }

    }

    void blink()
    {
    state = !state;
    }
     
  13. ANV

    ANV Гуру

    Z++ переместите в blink
     
  14. Рокки1945

    Рокки1945 Гуру

    щас попробую - отпишусь
     
  15. Рокки1945

    Рокки1945 Гуру

    почему-то цифр куча - наверное дребезг
     
  16. ostrov

    ostrov Гуру

    Код в тэг вставляйте, глаза болят уже.
     
  17. Рокки1945

    Рокки1945 Гуру

    вообщем пока резик подтянул к плюсу уже получше стало буду пробывать по Блюму - джереми
     
  18. Рокки1945

    Рокки1945 Гуру

    ну почему значения так скачат - может правду триггер надо?
     
  19. ANV

    ANV Гуру

    Какой сейчас код?
    И вывод в serial напишите
     
  20. Рокки1945

    Рокки1945 Гуру

    volatile int state = LOW;
    long z=0;
    void setup()
    {
    Serial.begin(9600);
    attachInterrupt(0, blink, RISING);
    }

    void blink()
    {
    state = !state;
    z++;
    }

    void loop()
    {

    if(state==HIGH)
    {
    Serial.println (z);
    }

    }