BTS7960B когда надо быстро проверить работоспособность

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Получил с али данные девайсы (несколько штук) программа несложная, но писать как-то было не с руки, озадачился. оказывается есть библиотека, клонировал и добавил проверку в прямом и реверсном режиме. Проверки работы защиты в библиотеке нет. Пример работы защиты добавлю с работающего девайса где защита  и измерение тока потребления будет применяться.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Добавил чтение датчиков тока, на выходе оных полная пурга, с высокой долей вероятности чипы поддельные, видимо и цена столь незначительная от этого, жаль... Продавцы и платы разных производителей...

Взял незамысловатый скетч, немного изменил, получаем результат:
 

// https://iarduino.ru/shop/Expansion-payments/drayver-motora-na-43a-bts7960.html

const uint8_t EN    = 10; //3;        // № вывода Arduino к которому подключены входы драйвера L_EN и R_EN. Можно указать любой вывод Arduino поддерживающий ШИМ.
const uint8_t L_PWM = 7;  //4;        // № вывода Arduino к которому подключён  вход  драйвера L_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.
const uint8_t R_PWM = 8;  //5;        // № вывода Arduino к которому подключён  вход  драйвера R_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.

volatile int aread0, aread1;
uint32_t old_m = 0;
uint16_t tau = 3000;

void setup() {
  Serial.begin(115200);
  pinMode(EN,    OUTPUT);     // Конфигурируем вывод EN    как выход (выход Arduino, вход драйвера)
  pinMode(L_PWM, OUTPUT);     // Конфигурируем вывод L_PWM как выход (выход Arduino, вход драйвера)
  pinMode(R_PWM, OUTPUT);     // Конфигурируем вывод R_PWM как выход (выход Arduino, вход драйвера)
}

void loop() {
  //  Движение вперёд на 50% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  old_m = millis();
  Serial.println("Вперёд на 50%");
  Serial.println();

  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }
  // delay(3000);                // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Движение вперёд на 100% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  analogWrite (EN,    255 );  // Устанавливаем 100% ШИМ на входах драйвера L_EN и R_EN, это скорость. Если устанавливаемое значение 255, то функцию можно заменить на digitalWrite(EN, HIGH);
  Serial.println("Вперёд на 100%");
  Serial.println();
  old_m = millis();
  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }
  // delay(3000);                // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Свободное вращение:
  digitalWrite(EN,    LOW );  // Устанавливаем логический 0 на входах драйвера L_EN и R_EN, значит выходы M+ и M- перейдут в состояние высокого импеданса и мотор будет электрически отключён.
  Serial.println("Свободное вращение");
  Serial.println();
  old_m = millis();
  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }

  //  delay(3000);                // Ждём 3 секунды. Логические уровни на входах драйвера L_PWM и R_PWM не имеют значения (могут быть любыми).
  //  Движение назад на 50% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  Serial.println("Назад на 50%");
  Serial.println();

  old_m = millis();
  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }
  //  delay(3000);                // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Движение назад на 100% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  digitalWrite(EN,    HIGH);  // Эта функция выполнит те же действия что и функция analogWrite(EN, 255);
  Serial.println("Назад на 100%");
  Serial.println();

  old_m = millis();
  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }
  //  delay(3000);                // Ждём 3 секунды. Логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Торможение с силой 50%:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это сила торможения, можно установить от 0 (0%) до 255 (100%).
  old_m = millis();
  while (millis() - old_m <= tau) {
    if (millis() % 250 == 0) {
      aread0 = analogRead(A0);
      aread1 = analogRead(A1);
      Serial.print("A0="); Serial.print(map(aread0, 0, 1023, 0, 43000));
      Serial.print(" A1="); Serial.println(map(aread1, 0, 1023, 0, 43000));
    }
  }
  //  delay(3000);                // Ждём 3 секунды. За это время мотор остановится.
}









Результат:
 

Вперёд на 50%

A0=0 A1=0
A0=0 A1=0
A0=0 A1=6893
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5884
A0=0 A1=5674
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5716
A0=0 A1=5716
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5716
A0=0 A1=5716
A0=0 A1=0
A0=0 A1=5716
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5674
A0=0 A1=5254
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5758
A0=0 A1=5716

Вперёд на 100%

A0=0 A1=4581
A0=0 A1=4665
A0=0 A1=4455
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4497
A0=0 A1=4455
A0=0 A1=4497
A0=0 A1=4539
A0=0 A1=4497
A0=0 A1=4581
A0=0 A1=4623
A0=0 A1=4581
A0=0 A1=4539
A0=0 A1=4497
A0=0 A1=4539
A0=0 A1=4455
A0=0 A1=4497
A0=0 A1=4539
A0=0 A1=4539
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4455
A0=0 A1=4497

Свободное вращение

A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0

Назад на 50%

A0=0 A1=0
A0=5128 A1=0
A0=4035 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3867 A1=0
A0=4035 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3951 A1=0
A0=3909 A1=0
A0=0 A1=0
A0=3909 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3867 A1=0
A0=3909 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3951 A1=0
A0=3909 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3951 A1=0

Назад на 100%

A0=2690 A1=0
A0=2774 A1=0
A0=2690 A1=0
A0=2732 A1=0
A0=2648 A1=0
A0=2690 A1=0
A0=2648 A1=0
A0=2690 A1=0
A0=2690 A1=0
A0=2648 A1=0
A0=2690 A1=0
A0=2648 A1=0
A0=2732 A1=0
A0=2606 A1=0
A0=2690 A1=0
A0=2606 A1=0
A0=2690 A1=0
A0=2606 A1=0
A0=2732 A1=0
A0=2732 A1=0
A0=2690 A1=0
A0=2732 A1=0

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Пост для тех, кто ориентируясь на ОЧЕНЬ низкую цену данных девайсов понадеется их применить, все 4 девайса разных продавцов и производителей 100% брак!
 

Под катом параметры всех 4-х девайсов в разных режимах.
Для оценки использовалась аккумуляторная батарея с током отдачи 100 ампер напряжением 7.5 вольта на активной нагрузке, с током в нагрузке 1280 миллиампер. Отображаемый ток с датчиков приведён к току выраженному в миллиамперах.

/****************************************************/
V01
Вперёд на 50%
A0=0 A1=35013
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5968
A0=0 A1=5968
A0=0 A1=5800
A0=0 A1=5842
A0=0 A1=5758
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5716
A0=0 A1=0
A0=0 A1=5842
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5758
A0=0 A1=5716
A0=0 A1=5758
A0=0 A1=5716
A0=0 A1=5758
A0=0 A1=0
A0=0 A1=0
A0=0 A1=5800
A0=0 A1=0
A0=0 A1=5716

Вперёд на 100%
A0=0 A1=4581
A0=0 A1=4665
A0=0 A1=4497
A0=0 A1=4539
A0=0 A1=4539
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4497
A0=0 A1=4539
A0=0 A1=4497
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4581
A0=0 A1=4539
A0=0 A1=4581
A0=0 A1=4539

Свободное вращение
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0


Назад на 50%
A0=168 A1=0
A0=0 A1=0
A0=0 A1=0
A0=4119 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=4077 A1=0
A0=3993 A1=0
A0=3951 A1=0
A0=0 A1=0
A0=3951 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3951 A1=0
A0=0 A1=0
A0=3909 A1=0
A0=0 A1=0
A0=0 A1=0
A0=3993 A1=0
A0=3951 A1=0
A0=3951 A1=0
A0=3993 A1=0

Назад на 100%
A0=2816 A1=0
A0=2774 A1=0
A0=2690 A1=0
A0=2732 A1=0
A0=2690 A1=0
A0=2732 A1=0
A0=2732 A1=0
A0=2690 A1=0
A0=2690 A1=0
A0=2732 A1=0
A0=2690 A1=0
A0=2732 A1=0
A0=2690 A1=0
A0=2648 A1=0
A0=2690 A1=0
A0=2606 A1=0
A0=2690 A1=0
A0=2690 A1=0
A0=2606 A1=0
A0=2732 A1=0
A0=2774 A1=0
A0=2732 A1=0

Торможение с силой 50%
A0=84 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=42
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0


/**************************************************/
V02

Вперёд на 50%
A0=0 A1=43000
A0=12567 A1=0
A0=12609 A1=0
A0=0 A1=23790
A0=12609 A1=7313
A0=0 A1=23538
A0=0 A1=23622
A0=0 A1=23622
A0=0 A1=23664
A0=12609 A1=0
A0=12652 A1=0
A0=12567 A1=0
A0=12609 A1=0
A0=12567 A1=0
A0=12609 A1=0
A0=3698 A1=23622
A0=0 A1=23580
A0=0 A1=23664
A0=0 A1=23622
A0=0 A1=23622
A0=0 A1=23580
A0=5758 A1=0
A0=12609 A1=0
A0=12652 A1=0
A0=12609 A1=0

Вперёд на 100%
A0=12609 A1=22445
A0=12483 A1=22487
A0=12609 A1=22445
A0=12567 A1=22487
A0=12567 A1=22403
A0=12525 A1=22319
A0=12567 A1=22403
A0=12609 A1=22403
A0=12567 A1=22445
A0=12567 A1=22445
A0=12694 A1=22361
A0=12609 A1=22403
A0=12525 A1=22361
A0=12525 A1=22361
A0=12609 A1=22361
A0=12525 A1=22403
A0=12525 A1=22361
A0=12525 A1=22403
A0=12525 A1=22403
A0=12567 A1=22445
A0=12525 A1=22361
A0=12567 A1=22403
A0=12525 A1=22445
A0=12652 A1=22403

Свободное вращение
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0

Назад на 50%
A0=84 A1=15636
A0=22277 A1=0
A0=0 A1=15678
A0=0 A1=15720
A0=0 A1=15636
A0=0 A1=15720
A0=21016 A1=0
A0=20974 A1=0
A0=20974 A1=0
A0=21016 A1=0
A0=20974 A1=0
A0=21016 A1=0
A0=0 A1=15636
A0=19755 A1=15720
A0=0 A1=15762
A0=0 A1=15636
A0=0 A1=15636
A0=0 A1=15678
A0=16098 A1=0
A0=20974 A1=0
A0=21016 A1=0
A0=20974 A1=0
A0=20890 A1=0
A0=20890 A1=0

Назад на 100%
A0=19839 A1=15678
A0=19797 A1=15678
A0=19797 A1=15720
A0=19713 A1=15720
A0=19671 A1=15720
A0=19755 A1=15720
A0=19755 A1=15762
A0=19755 A1=15762
A0=19671 A1=15678
A0=19713 A1=15636
A0=19755 A1=15720
A0=19713 A1=15720
A0=19629 A1=15636
A0=19755 A1=15678
A0=19671 A1=15678
A0=19713 A1=15720
A0=19671 A1=15720
A0=19713 A1=15636
A0=19713 A1=15720
A0=19671 A1=15720
A0=19797 A1=15636
A0=19671 A1=15594

Торможение с силой 50%
A0=0 A1=16350
A0=0 A1=16392
A0=0 A1=16392
A0=0 A1=16434
A0=1891 A1=42
A0=0 A1=16224
A0=13156 A1=0
A0=13114 A1=0
A0=13198 A1=0
A0=13198 A1=0
A0=13240 A1=11348
A0=0 A1=16392
A0=0 A1=16434
A0=0 A1=16434
A0=0 A1=16350
A0=0 A1=16392
A0=12525 A1=0
A0=11685 A1=0
A0=13198 A1=0
A0=13282 A1=0
A0=13156 A1=0
A0=13198 A1=0
A0=13240 A1=0
A0=13198 A1=9751

/**************************************************/
V03
Вперёд на 50%
A0=0 A1=43000
A0=14585 A1=0
A0=14459 A1=0
A0=0 A1=28120
A0=14585 A1=12357
A0=0 A1=28120
A0=0 A1=28120
A0=0 A1=27994
A0=0 A1=28036
A0=14165 A1=0
A0=7439 A1=0
A0=14585 A1=0
A0=14585 A1=0
A0=14501 A1=0
A0=14585 A1=0
A0=3488 A1=28078
A0=0 A1=28036
A0=0 A1=27952
A0=0 A1=27952
A0=0 A1=27994
A0=0 A1=28162
A0=14543 A1=0
A0=14585 A1=0
A0=14543 A1=0
A0=14627 A1=0

Вперёд на 100%
A0=14585 A1=26859
A0=14627 A1=26901
A0=14585 A1=26775
A0=14543 A1=26775
A0=14543 A1=26817
A0=14585 A1=26775
A0=14585 A1=26775
A0=14627 A1=26817
A0=14501 A1=26817
A0=14585 A1=26817
A0=14627 A1=26859
A0=14501 A1=26733
A0=14585 A1=26775
A0=14543 A1=26775
A0=14501 A1=26775
A0=14543 A1=26733
A0=14585 A1=26775
A0=14417 A1=26775
A0=14711 A1=26859
A0=14585 A1=26775
A0=14501 A1=26691
A0=14585 A1=26775
A0=14501 A1=26775
A0=14627 A1=26775

Свободное вращение
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0

Назад на 50%
A0=24421 A1=0
A0=24463 A1=19965
A0=0 A1=20049
A0=2437 A1=20007
A0=0 A1=20049
A0=0 A1=20049
A0=23076 A1=0
A0=23118 A1=0
A0=23118 A1=0
A0=23202 A1=0
A0=23202 A1=0
A0=23160 A1=0
A0=0 A1=20133
A0=23118 A1=14375
A0=0 A1=20133
A0=8196 A1=19965
A0=0 A1=20007
A0=0 A1=20091
A0=18200 A1=0
A0=23076 A1=0
A0=23118 A1=0
A0=23202 A1=0
A0=23118 A1=420
A0=8616 A1=0

Назад на 100%
A0=21983 A1=20007
A0=21983 A1=20007
A0=21899 A1=20133
A0=21983 A1=20091
A0=21899 A1=20049
A0=21941 A1=20049
A0=21899 A1=19965
A0=21857 A1=20091
A0=21941 A1=19923
A0=21983 A1=20007
A0=21899 A1=20049
A0=21941 A1=20007
A0=21857 A1=20049
A0=21899 A1=20049
A0=21941 A1=20049
A0=22025 A1=20091
A0=21941 A1=20049
A0=21857 A1=20007
A0=21857 A1=20049
A0=21983 A1=20007
A0=21857 A1=20049
A0=21941 A1=20091

Торможение с силой 50%
A0=14711 A1=20596
A0=0 A1=20680
A0=0 A1=20722
A0=0 A1=20638
A0=0 A1=20680
A0=0 A1=20722
A0=15216 A1=0
A0=15258 A1=0
A0=15258 A1=0
A0=15258 A1=0
A0=15216 A1=19797
A0=0 A1=20680
A0=0 A1=20806
A0=0 A1=20722
A0=0 A1=20638
A0=0 A1=20806
A0=0 A1=11517
A0=0 A1=20722
A0=15173 A1=0
A0=15131 A1=0
A0=15173 A1=0
A0=15216 A1=0
A0=15216 A1=14963
A0=0 A1=20680

/**************************************************/
V04
Вперёд на 50%
A0=0 A1=43000
A0=0 A1=0
A0=0 A1=0
A0=0 A1=20344
A0=0 A1=11895
A0=0 A1=20302
A0=0 A1=20217
A0=0 A1=20260
A0=0 A1=20260
A0=0 A1=0
A0=0 A1=20133
A0=0 A1=0
A0=0 A1=20302
A0=0 A1=11979
A0=0 A1=0
A0=0 A1=20175
A0=42 A1=20217
A0=0 A1=20302
A0=0 A1=20344
A0=0 A1=20344
A0=0 A1=20260
A0=0 A1=0
A0=0 A1=20302
A0=0 A1=0
A0=0 A1=20260

Вперёд на 100%
A0=0 A1=19125
A0=0 A1=19209
A0=0 A1=19083
A0=0 A1=19125
A0=0 A1=19041
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19125
A0=0 A1=19041
A0=0 A1=19083
A0=0 A1=19125
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19125
A0=0 A1=19041
A0=0 A1=19041
A0=0 A1=19041
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19083
A0=0 A1=19041
A0=0 A1=19041

Свободное вращение
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0
A0=0 A1=0

Назад на 50%
A0=126 A1=12273
A0=22151 A1=0
A0=0 A1=12273
A0=0 A1=12189
A0=0 A1=12189
A0=0 A1=12147
A0=19419 A1=0
A0=19419 A1=0
A0=19419 A1=0
A0=19377 A1=0
A0=19377 A1=0
A0=19377 A1=0
A0=0 A1=12147
A0=19419 A1=7650
A0=0 A1=12189
A0=0 A1=12189
A0=0 A1=12063
A0=0 A1=12147
A0=16687 A1=0
A0=19419 A1=0
A0=19251 A1=0
A0=19335 A1=0
A0=19461 A1=0
A0=19377 A1=0

Назад на 100%
A0=16897 A1=12189
A0=16855 A1=12105
A0=16561 A1=12189
A0=16645 A1=12189
A0=16603 A1=12189
A0=16645 A1=12147
A0=16603 A1=12189
A0=16603 A1=12189
A0=16603 A1=12147
A0=16603 A1=12105
A0=16561 A1=12147
A0=16561 A1=12147
A0=16519 A1=12231
A0=16603 A1=12189
A0=16603 A1=12105
A0=16687 A1=12105
A0=16561 A1=12105
A0=16561 A1=12189
A0=16645 A1=12189
A0=16603 A1=12147
A0=16603 A1=12105
A0=16603 A1=12147

Торможение с силой 50%
A0=0 A1=12820
A0=0 A1=12820
A0=0 A1=12778
A0=0 A1=12820
A0=0 A1=84
A0=1092 A1=8700
A0=2395 A1=0
A0=2395 A1=0
A0=2353 A1=0
A0=2311 A1=12105
A0=2143 A1=10844
A0=0 A1=12778
A0=0 A1=12778
A0=0 A1=12778
A0=0 A1=12820
A0=0 A1=12736
A0=0 A1=0
A0=0 A1=12820
A0=1008 A1=0
A0=2311 A1=0
A0=2311 A1=0
A0=0 A1=12105
A0=2353 A1=0
A0=0 A1=12820

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Нашёл косяк в модулях, нагрузка на пинах R_IS и L_IS вместо 1 кОм установлена 10kOm со всеми вытекающими.
Коэффициент сенсора 8500 это типовое значение, по даташиту может быть от 3000 до 14000 (при малых токах дельта больше) стр.21 даташита. Совершенно не факт, что H мосте будут подобранные микросхемы.
Непонятно каким чудным образом при ШИМ 50% к примеру с сенсора могут приходит значения в 3-5 раз больше ожидаемых при чисто активной нагрузке

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Поправил код с использованием алгоритма отсюда:
 

// https://iarduino.ru/shop/Expansion-payments/drayver-motora-na-43a-bts7960.html

#define DEBUG

#include "FlexPWM.h"

const uint8_t EN    = 10; // № вывода Arduino к которому подключены входы драйвера L_EN и R_EN. Можно указать любой вывод Arduino поддерживающий ШИМ.
const uint8_t L_PWM = 7;  // № вывода Arduino к которому подключён  вход  драйвера L_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.
const uint8_t R_PWM = 8;  // № вывода Arduino к которому подключён  вход  драйвера R_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.
#define R_IS A6
#define L_IS A7
#define Current_R_IS 50
#define Current_L_IS 27

volatile int current_Ris, current_Lis;
uint32_t old_m = 0;
uint16_t tau = 3000;

volatile int aread5, aread6, aread7;

void setup() {
  Serial.begin(115200);
  pinMode(EN,    OUTPUT);     // Конфигурируем вывод EN    как выход (выход Arduino, вход драйвера)
  pinMode(L_PWM, OUTPUT);     // Конфигурируем вывод L_PWM как выход (выход Arduino, вход драйвера)
  pinMode(R_PWM, OUTPUT);     // Конфигурируем вывод R_PWM как выход (выход Arduino, вход драйвера)
  pwmInit(10); // ШИМ 10 бит Pin10 (Timer1) 15625Hz

  // ADC
  OCR0A = 0xAF;
  TIMSK0 |= 1 << OCIE0A;
  ADMUX = 1 << REFS0; // AVCC with external capacitor at AREF pin
  ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  ADCSRB = (1 << ADTS1) | (1 << ADTS0); // Timer/Counter0 Compare Match A
  // END-SETUP
}

ISR(TIMER0_COMPA_vect) {
  static uint8_t n = 5;
  ADMUX = ADMUX & 0b11111000 | n;
  switch (n) {
    case 5: aread7 = ADC; n = 6;  current_Lis = RunMiddleArifmLis(aread7); break;
    case 6: aread5 = ADC; n = 7;   break;
    case 7: aread6 = ADC; n = 5;  current_Ris = RunMiddleArifmRis(aread6); break;
  }
}


// фильтр среднее с буфером R_IS
uint32_t RunMiddleArifmRis(uint32_t newVal) {
#define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {
    i = 0;
  }
  buff += newVal;
  buff -= buffer[i];
  buffer[i] = newVal;
  ret = buff / NUM_Array;
  return ret;
}
//
// фильтр среднее с буфером L_IS
uint32_t RunMiddleArifmLis(uint32_t newVal) {
#define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {
    i = 0;
  }
  buff += newVal;
  buff -= buffer[i];
  buffer[i] = newVal;
  ret = buff / NUM_Array;
  return ret;
}
//

void loop() {
  //  Движение вперёд на 50% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  pwmWrite10(512);
  // analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  old_m = millis();
  Serial.println();
  Serial.println("Вперёд на 50%");
  while (millis() - old_m <= tau)
  {
    if (millis() % 250 == 0)
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }
  
  // delay(3000);             // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.

  //  Движение вперёд на 100% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  pwmWrite10(1023);
  //  analogWrite (EN,    255 );  // Устанавливаем 100% ШИМ на входах драйвера L_EN и R_EN, это скорость. Если устанавливаемое значение 255, то функцию можно заменить на digitalWrite(EN, HIGH);
  Serial.println();
  Serial.println("Вперёд на 100%");

  old_m = millis();
  while (millis() - old_m <= tau)
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }
  // delay(3000);               // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Свободное вращение:

  digitalWrite(EN,    LOW );  // Устанавливаем логический 0 на входах драйвера L_EN и R_EN, значит выходы M+ и M- перейдут в состояние высокого импеданса и мотор будет электрически отключён.
  Serial.println();
  Serial.println("Свободное вращение");
  //  pwmWrite10(0);
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    { 
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }

  //  delay(3000);            // Ждём 3 секунды. Логические уровни на входах драйвера L_PWM и R_PWM не имеют значения (могут быть любыми).

  //  Движение назад на 50% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  pwmWrite10(512);
  //  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  Serial.println();
  Serial.println("Назад на 50%");
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }
  //  delay(3000);            // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.

  //  Движение назад на 100% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  pwmWrite10(1023);
  //  digitalWrite(EN,    HIGH);  // Эта функция выполнит те же действия что и функция analogWrite(EN, 255);
  Serial.println();
  Serial.println("Назад на 100%");
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }
  //  delay(3000);            // Ждём 3 секунды. Логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
 
  //  Торможение с силой 50%:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  pwmWrite10(512);
  //  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это сила торможения, можно установить от 0 (0%) до 255 (100%).
  Serial.println();
  Serial.println("Торможение с силой 50%");

  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * Current_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * Current_L_IS);
#endif
    }
  }
  // delay(3000);
}

Имеем в мониторе порта:
 

Вперёд на 50%
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=25 L_IS=52
R_IS=25 L_IS=52
R_IS=25 L_IS=52
R_IS=24 L_IS=49
R_IS=24 L_IS=49
R_IS=24 L_IS=49
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=49
R_IS=25 L_IS=49
R_IS=25 L_IS=49
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=24 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=49
R_IS=25 L_IS=48
R_IS=25 L_IS=48
R_IS=25 L_IS=48

Вперёд на 100%
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=25 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=25 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46
R_IS=24 L_IS=46

Свободное вращение
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0
R_IS=0 L_IS=0

Назад на 50%
R_IS=46 L_IS=32
R_IS=46 L_IS=32
R_IS=46 L_IS=32
R_IS=44 L_IS=32
R_IS=44 L_IS=32
R_IS=44 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=42 L_IS=31
R_IS=42 L_IS=31
R_IS=42 L_IS=31
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=43 L_IS=31
R_IS=43 L_IS=31
R_IS=42 L_IS=31
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=42 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32
R_IS=43 L_IS=32

Назад на 100%
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=31
R_IS=40 L_IS=31
R_IS=40 L_IS=31
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32
R_IS=40 L_IS=32

Торможение с силой 50%
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33
R_IS=26 L_IS=33

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

В примере из даташита измерение тока контроллером производится напрямую. Может имеет смысл добавить интегрирующую RC цепь и не заморачиваться с программным усреднением? Что-то мне показатели не глянулись...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Остановился на таком коде:

// https://iarduino.ru/shop/Expansion-payments/drayver-motora-na-43a-bts796...

// #define DEBUG

#include "FlexPWM.h"

const uint8_t EN    = 10; // № вывода Arduino к которому подключены входы драйвера L_EN и R_EN. Можно указать любой вывод Arduino поддерживающий ШИМ.
const uint8_t L_PWM = 7;  // № вывода Arduino к которому подключён  вход  драйвера L_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.
const uint8_t R_PWM = 8;  // № вывода Arduino к которому подключён  вход  драйвера R_PWM.       Можно указать любой вывод Arduino, как цифровой, так и аналоговый.
#define R_IS A6
#define L_IS A7
#define CW_R_IS 58
#define CW_L_IS 30
#define CCW_R_IS 35
#define CCW_L_IS 46

volatile int current_Ris, current_Lis;
uint32_t old_m = 0;
uint16_t tau = 3000;

volatile int aread5, aread6, aread7;

void setup() {
  Serial.begin(115200);
  pinMode(EN,    OUTPUT);     // Конфигурируем вывод EN    как выход (выход Arduino, вход драйвера)
  pinMode(L_PWM, OUTPUT);     // Конфигурируем вывод L_PWM как выход (выход Arduino, вход драйвера)
  pinMode(R_PWM, OUTPUT);     // Конфигурируем вывод R_PWM как выход (выход Arduino, вход драйвера)
  pwmInit(16); // ШИМ 16 бит используем на Pin10 (Timer1) 244Hz

  // ADC
  OCR0A = 0xAF;
  TIMSK0 |= 1 << OCIE0A;
  ADMUX = 1 << REFS0; // AVCC with external capacitor at AREF pin
  ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  ADCSRB = (1 << ADTS1) | (1 << ADTS0); // Timer/Counter0 Compare Match A
  // END-SETUP
}

ISR(TIMER0_COMPA_vect) {
  static uint8_t n = 5;
  ADMUX = ADMUX & 0b11111000 | n;
  switch (n) {
    case 5: aread7 = ADC; n = 6;  current_Lis = RunMiddleArifmLis(aread7); break;
    case 6: aread5 = ADC; n = 7;   break;
    case 7: aread6 = ADC; n = 5;  current_Ris = RunMiddleArifmRis(aread6); break;
  }
}


// фильтр среднее с буфером R_IS
uint32_t RunMiddleArifmRis(uint32_t newVal) {
#define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {
    i = 0;
  }
  buff += newVal;
  buff -= buffer[i];
  buffer[i] = newVal;
  ret = buff / NUM_Array;
  return ret;
}
//
// фильтр среднее с буфером L_IS
uint32_t RunMiddleArifmLis(uint32_t newVal) {
#define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {
    i = 0;
  }
  buff += newVal;
  buff -= buffer[i];
  buffer[i] = newVal;
  ret = buff / NUM_Array;
  return ret;
}
//

void loop() {
  //  Движение вперёд на 50% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  pwmWrite10(32767);
  // analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  old_m = millis();
  Serial.println();
  Serial.println("Вперёд на 50%");
  while (millis() - old_m <= tau)
  {
    if (millis() % 250 == 0)
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CW_L_IS);
#endif
    }
  }
  
  // delay(3000);             // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.

  //  Движение вперёд на 100% скорости:
  digitalWrite(L_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S-
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S+
  pwmWrite10(65535);
  //  analogWrite (EN,    255 );  // Устанавливаем 100% ШИМ на входах драйвера L_EN и R_EN, это скорость. Если устанавливаемое значение 255, то функцию можно заменить на digitalWrite(EN, HIGH);
  Serial.println();
  Serial.println("Вперёд на 100%");

  old_m = millis();
  while (millis() - old_m <= tau)
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CW_L_IS);
#endif
    }
  }
  // delay(3000);               // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
  //  Свободное вращение:

  digitalWrite(EN,    LOW );  // Устанавливаем логический 0 на входах драйвера L_EN и R_EN, значит выходы M+ и M- перейдут в состояние высокого импеданса и мотор будет электрически отключён.
  Serial.println();
  Serial.println("Свободное вращение");
  //  pwmWrite10(0);
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    { 
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CW_L_IS);
#endif
    }
  }

  //  delay(3000);            // Ждём 3 секунды. Логические уровни на входах драйвера L_PWM и R_PWM не имеют значения (могут быть любыми).

  //  Движение назад на 50% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  pwmWrite10(32767);
  //  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это скорость, можно установить от 0 (0%) до 255 (100%).
  Serial.println();
  Serial.println("Назад на 50%");
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CCW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CCW_L_IS);
#endif
    }
  }
  //  delay(3000);            // Ждём 3 секунды. ШИМ и логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.

  //  Движение назад на 100% скорости:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1 на входе драйвера L_PWM, значит на выходе драйвера M- будет установлен потенциал S+
  digitalWrite(R_PWM, LOW );  // Устанавливаем логический 0 на входе драйвера R_PWM, значит на выходе драйвера M+ будет установлен потенциал S-
  pwmWrite10(65535);
  //  digitalWrite(EN,    HIGH);  // Эта функция выполнит те же действия что и функция analogWrite(EN, 255);
  Serial.println();
  Serial.println("Назад на 100%");
  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CCW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CCW_L_IS);
#endif
    }
  }
  //  delay(3000);            // Ждём 3 секунды. Логические уровни останутся без изменений, значит мотор продолжит вращаться с указанной скоростью и направлением.
 
  //  Торможение с силой 50%:
  digitalWrite(L_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  digitalWrite(R_PWM, HIGH);  // Устанавливаем логическую 1, но можно установить и логический 0, главное что бы уровни на входах драйвера L_PWM и R_PWM совпадали.
  pwmWrite10(32767);
  //  analogWrite (EN,    127 );  // Устанавливаем 50% ШИМ на входах драйвера L_EN и R_EN, это сила торможения, можно установить от 0 (0%) до 255 (100%).
  Serial.println();
  Serial.println("Торможение с силой 50%");

  old_m = millis();
  while (millis() - old_m <= tau) 
  {
    if (millis() % 250 == 0) 
    {
#ifdef DEBUG
      Serial.print("R_IS="); Serial.print(current_Ris);
      Serial.print(" L_IS="); Serial.println(current_Lis);
#else
      Serial.print("R_IS="); Serial.print(current_Ris * CW_R_IS);
      Serial.print(" L_IS="); Serial.println(current_Lis * CCW_L_IS);
#endif
    }
  }
  // delay(3000);
}

Библиотека:
 

// https://arduino.ru/forum/programmirovanie/shim-proizvolnogo-razresheniya-na-unonano-328
/*
Бит Макс                               Частота контроллера (МГц)
             1            2           4             8             16           20
2   3      250 000,0   500 000,0  1 000 000,0     2 000 000,0   4 000 000,0   5 000 000,0
3   7      125 000,0   250 000,0    500 000,0     1 000 000,0   2 000 000,0   2 500 000,0
4   15      62 500,0   125 000,0    250 000,0       500 000,0   1 000 000,0   1 250 000,0
5   31      31 250,0    62 500,0    125 000,0       250 000,0     500 000,0     625 000,0
6   63      15 625,0    31 250,0     62 500,0       125 000,0     250 000,0     312 500,0
7   127      7 812,5    15 625,0     31 250,0        62 500,0     125 000,0     156 250,0
8   255      3 906,3     7 812,5     15 625,0        31 250,0      62 500,0      78 125,0
9   511      1 953,1     3 906,3      7 812,5        15 625,0      31 250,0      39 062,5
10  1 023      976,6     1 953,1      3 906,3         7 812,5      15 625,0      19 531,3
11  2 047      488,3       976,6      1 953,1         3 906,3       7 812,5       9 765,6
12  4 095      244,1       488,3        976,6         1 953,1       3 906,3       4 882,8
13  8 191      122,1       244,1        488,3           976,6       1 953,1       2 441,4
14  16 383      61,0       122,1        244,1           488,3         976,6       1 220,7
15  32 767      30,5        61,0        122,1           244,1         488,3         610,4
16  65 535      15,3        30,5         61,0           122,1         244,1         305,2
 */
 
#ifndef  FlexPWM_h
#define FlexPWM_h

#define __bit(b) (1u << (b))

inline void pwmInit(const int8_t bitRate = 16) {
  noInterrupts();
  TCCR1A = __bit(WGM11);
  TCCR1B = __bit(WGM13) | __bit(WGM12) | __bit(CS10);
  TCCR1C = TCNT1 = OCR1A = OCR1B = TIMSK1 = TIFR1 = 0;
  ICR1 = (1u << bitRate) - 1u;
  interrupts();
}

inline void pwmWrite9(const uint16_t v) { 
  DDRB |= __bit(PB1);
  TCCR1A |= __bit(COM1A1);
  OCR1A = v;
}

inline void digitalWrite9(const uint8_t v) {
  DDRB |= __bit(PB1);
  TCCR1A &= ~__bit(COM1A1); 
  if (v) PORTB |= __bit(PB1); else PORTB &= ~__bit(PB1);
}

inline void pwmWrite10(const uint16_t v) {
  DDRB |= __bit(PB2);
  TCCR1A |= __bit(COM1B1);
  OCR1B = v;
}

inline void digitalWrite10(const uint8_t v) {
  DDRB |= __bit(PB2);
  TCCR1A &= ~__bit(COM1B1);
  if (v) PORTB |= __bit(PB2); else PORTB &= ~__bit(PB2);
}

#endif  // FlexPWM_h

 

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

В примере из даташита измерение тока контроллером производится напрямую. Может имеет смысл добавить интегрирующую RC цепь и не заморачиваться с программным усреднением? Что-то мне показатели не глянулись...

Ты чего получить-то хочешь, в конечном итоге? Защиту от перегруза? Тупо измерить ток мотора?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

ua6em пишет:

В примере из даташита измерение тока контроллером производится напрямую. Может имеет смысл добавить интегрирующую RC цепь и не заморачиваться с программным усреднением? Что-то мне показатели не глянулись...

Ты чего получить-то хочешь, в конечном итоге? Защиту от перегруза? Тупо измерить ток мотора?

хочу измерять токи, с достаточной точностью, выходит, что этом девайсе два датчика и они разные, для верхнего ключа и для нижнего ключа

rkit
Offline
Зарегистрирован: 23.11.2016

Ты видел какой в даташите разброс характеристики датчика тока? Там без калибровки нечего делать. И еще непонятно с температурными коэффициентами. Я бы не страдал с этим совсем и поставил другой датчик.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

Ты видел какой в даташите разброс характеристики датчика тока? Там без калибровки нечего делать. И еще непонятно с температурными коэффициентами. Я бы не страдал с этим совсем и поставил другой датчик.

да, видимо девайс очень очень старый, прямо по писаному - "не гонялся бы ты...за дешевизной" )))