Київський клуб аматорів астрономії "Астрополіс"

astromagazin.net
* *
Ласкаво просимо, Гість. Будь ласка, увійдіть або зареєструйтеся.
29 Вересня 2024, 05:17:03

Увійти

google


Автор Тема: «Тикалка» для шаговика (или как моторизовать монтировку-2)  (Прочитано 40152 раз)

0 Користувачів і 1 Гість дивляться цю тему.

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

период тактов чем задается? мне кажется что проблема тут зарыта.
Я уже говорил что по событию таймера бы делал, если бы хотел стабильности.
Радиатор не поможет, вы охладите корпус мотора но обмотка так и останется горячей, я бы уменьшил протекающий ток через обмотки.

Возможно это и из-за delay... Попробую, насколько эта неточность скажется на съемке...
А по поводу тока: как лучше его ограничить? Последовательно через резистор (какого сопротивления)?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

Резистор будет греться не слабо, первое что приходит на ум задействовать ШИМ и управлять полевиком, полевик соответственно напряжение на ШД,уменьшаем напряжение до тока 100мА этому ШД с головой хватит такого тока. можно без полевика задействовать логический элемент перед драйвером ШД и на него подавать тот же ШИМ
Записаний



M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

1) В некоторых версиях Ардуино вместо нормального кварца стоит более дешевый пьезоэлемент, для них разброс побольше. Но набег 0.7 секунды за минуту слишком много даже для него.

2) Использование delay() противопоказано для данной задачи. Ибо период цикла больше delay(), т.е. сам delay() + все остальные операции. Решения озвучены в ветке "И снова Ардуино".
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Больше спасибо за советы! От delay обязательно избавлюсь, а вот с ограничение тока на мотор пока торопиться не буду. Варианты с ШИМ и т.п. для меня слишком сложны и потребуют модификации уже готовой и работающей схемы. Думаю, с постепенной разрядкой батареек ток будет падать сам собой даже быстрее, чем мне хочется...
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

Варианты с ШИМ и т.п. для меня слишком сложны и потребуют модификации уже готовой и работающей схемы.

ШИМ управляется таймером. Если разберетесь с таймером, то и с ШИМ не составит труда.
Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

Варианты с ШИМ и т.п. для меня слишком сложны и потребуют модификации уже готовой и работающей схемы.

ШИМ управляется таймером. Если разберетесь с таймером, то и с ШИМ не составит труда.
Да тут на ардуино все еще проще

http://arduino.ru/Reference/AnalogWrite   
задаем на выход нужное значение и все, шоколад  ;D
Записаний



M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Больше спасибо за советы! От delay обязательно избавлюсь, а вот с ограничение тока на мотор пока торопиться не буду. Варианты с ШИМ и т.п. для меня слишком сложны и потребуют модификации уже готовой и работающей схемы. Думаю, с постепенной разрядкой батареек ток будет падать сам собой даже быстрее, чем мне хочется...
Период от напряжения питания почти не зависит. Т.е. зависит в той мере, насколько частота кварцевого генератора уходит от напряжения, температуры, влажности. А это обычно ниже 0.01%.

Замените delay() на модифицированный вариант mydelay() (см. ниже), всего делов.

ШИМ тут как корове седло.

Код: [Select]
void mydelay(unsigned long ms){
  static unsigned long currentMillis = millis();
  unsigned long dt;
  do {
   dt = millis() - currentMillis;
  }
  while (dt<ms);

  currentMillis += ms;
}
Записаний


alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

да вообще-то... можно просто подкорректировать параметр у delay().  Увеличить, или уменьшить.. в зависимости от ситуации.
Смотрю, что в скетче motorSpeed = 14. В таком случае можно просто заменить delay() на delayMicroseconds() и подобрать задержку, к примеру: delayMicroseconds(13982)
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Хорошее замечание  :up:
Если применяется округленное 14 вместо 14.7, то ошибка тоже быстро набегает.

Но хотелось бы посмотреть на алгоритм, в оригинале вопроса пробегало число с куда большей точностью:
Цитувати
Единственное "НО". Согласно рекомендаций, я делал 4075.7728395061728395061728395052 тактов на оборот, чтобы получить на валу 1 об/мин. (Движок 28BYJ-48).

В таком случае задержка в цикле должна учитывать это округление.

double errorsum = 0;
...


mydelay(14);
errorsum+=0.7; // набегающая ошибка округления
if  (errorsum>1.){ 
  mydelay(1);
  errorsum-=1;
}


При переходе от милисекунд к микросекундам принцип тот же.
Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive


ШИМ тут как корове седло.

Коля мы о регулировки питающего напряжения для ШД о ШИМ говорим, что бы ШД не кипел у товарища.
Записаний



alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

Если применяется округленное 14 вместо 14.7, то ошибка тоже быстро набегает.
В таком случае задержка в цикле должна учитывать это округление.
....
При переходе от милисекунд к микросекундам принцип тот же.
:hz:
А что мешает просто поставить  delayMicroseconds(14700)  ?
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Братцы, вот мой текущий код:
У меня там и так  delayMicroseconds )

Код: [Select]
//вывод D5 - кнопка "Назад"
//выводы D6,D7,D8,D9 - управление ШД
//вывод D12 - светодиод

const int ledPin =  12;      // the number of the LED pin
const long interval = 500;   // interval at which to blink (milliseconds)
int ledState = HIGH;         // ledState used to set the LED
long previousMillis = 0;     // will store last time LED was updated

const int buttonBack = 5;    // присвоение пина 5 кнопке "Назад"
int buttonStateBack = 0;     // переменная статуса кнопки "Назад"

const int motorPin1 = 9;    // Blue   - 28BYJ48 pin 1
const int motorPin2 = 8;    // Pink   - 28BYJ48 pin 2
const int motorPin3 = 7;    // Yellow - 28BYJ48 pin 3
const int motorPin4 = 6;    // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)

const int motorSpeed = 14721; // микросекунды, задержка между шагами ведении. ее и будем подбирать, чтобы был 1 об/мин
const int motorSpeedRev = 1000;  // микросекунды, задержка между шагами при обратном вращении (возврат на исходную позицию)

void setup() {

  pinMode(buttonBack, INPUT_PULLUP); // initialize the button pin as an input without ext resistor
  pinMode(ledPin, OUTPUT);    // set the digital pin as output   

  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
}
void loop() {
 
  buttonStateBack = digitalRead(buttonBack); // read the state of the pushbutton value
     
 // если нажата кнопка "Назад", то включаем задний ход, если не нажата, то ведем трекер
  if (buttonStateBack == LOW) {
    clockwise();              // включаем задний ход
  digitalWrite(ledPin, HIGH); // светодиод горит постоянно пока работает задний ход
  }
  else
  {
    counterclockwise(); // ведем трекер
   
  // во время ведения светодиод мигает
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
      digitalWrite(ledPin, ledState);
  }
  }
   
}

//функция возврата на исходную позицию
void clockwise() {
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeedRev);
  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds (motorSpeedRev);
  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeedRev);
  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeedRev);
  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeedRev);
  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds (motorSpeedRev);
  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeedRev);
  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeedRev);
}

//функция ведения (трекер)
void counterclockwise () { 
  // 1
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);
  // 2
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds (motorSpeed);
  // 3
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);
  // 4
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);
  // 5
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);
  // 6
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds (motorSpeed);
  // 7
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds(motorSpeed);
  // 8
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds(motorSpeed);
}

Меня единственное, что смущает, вроде бы delay очень короткий и вроде бы он особо ничему не мешает выполняться.... Неужели погрешность из-за него?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

А что мешает просто поставить  delayMicroseconds(14700)  ?

Один период стандартного цикла

while(1)
{
   do_something();
   delayMicroseconds(14700)
}

выполняется 14700 мкс + время на do_something() + время на переход в начало (очень мало, для простоты игнорируем).

Если do_something() это фиксированная процедура, занимающая, скажем, 26 мкс, то мы можем ее скомпенсировать, уменьшив  задержку 
   delayMicroseconds(14774).

Сама процедура измерения времени do_something() не слишком сложна, но требует каких-то лишних телодвижений.

Но обычно время выполения do_something() величина переменная. Там делается опрос кнопок, разных датчиков и пр. и пр. И в зависимости от состояния кнопок и датчиков время исполнения меняется.

В нашем конкретном случае можно предположить, что в основном режиме (ведение) кнопки всегда в одном положении, компенсируем именно его. Но удобно ли это? Любое косметическое изменение в программе требует пересчета или измерения этой компенсации.

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

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

И что мы тут колдуем с задержками?  ;D
Ну посадите clockwise() на таймер!
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Цитувати
И еще один вопрос: ток потребления мотора 370мА при напряжении 5,9В.
Я бы добавил 1 одноамперный силовой диод и погасил на нем 0.7 вольта.

Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

По коду.
Добавить определение функции
Код: [Select]
void myDelayMks(unsigned long mks){
  static unsigned long currentMks = micros();
  unsigned long dt;
  do {
   dt = micros() - currentMks;
  }
  while (dt<mks);

  currentMks += mks;
}

Все вызовы delayMicroseconds поменять на myDelayMks.

Чтобы не заниматься поиском/заменой по тексту, можно вначале написать

Код: [Select]
#define delayMicroseconds myDelayMks
Тогда в случае чего легко можно вернуть "как было" путем закомментаривания или удаления этой строки.
Записаний
Подякували

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

А если сделать так?   :shuffle:
Код: [Select]
#include <TimerOne.h>

//вывод D5 - кнопка "Назад"
//выводы D6,D7,D8,D9 - управление ШД
//вывод D12 - светодиод
const int ledPin = 12;      // the number of the LED pin
int key_pressed = 0;
const int buttonBack = 5;    // присвоение пина 5 кнопке "Назад"
const int motorPin1 = 9;    // Blue   - 28BYJ48 pin 1
const int motorPin2 = 8;    // Pink   - 28BYJ48 pin 2
const int motorPin3 = 7;    // Yellow - 28BYJ48 pin 3
const int motorPin4 = 6;    // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)
const int motorSpeed = 14700; // микросекунды, задержка между шагами ведении. ее и будем подбирать, чтобы был 1 об/мин
const int motorSpeedRev = 1000;  // микросекунды, задержка между шагами при обратном вращении (возврат на исходную позицию)

void setup() {

  pinMode(buttonBack, INPUT_PULLUP); // initialize the button pin as an input without ext resistor
  pinMode(ledPin, OUTPUT);    // set the digital pin as output   

  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
 
  Timer1.initialize(motorSpeed);
  Timer1.attachInterrupt(EventTimer);
}


int ind = 0;
void EventTimer()
{
  switch (key_pressed) {
    case 0: // кнопка не нажата - обычное ведение
      counterclockwise(ind); // делаем очередной шаг
      if (ind == 7) digitalWrite(ledPin, !digitalRead(ledPin));  // светодиод мигает
      break;
    case 1: // кнопка нажата - перемотка
      clockwise(ind);  // делаем очередной шаг
      digitalWrite(ledPin, HIGH); // светодиод горит постоянно
      break;
  }   
  ind++; // подготаливаем номер следующего шага   
  if (ind>7) ind = 0; // обнуляем его, если нужно
}

void loop() {
    // основной цикл
   
    // если ничего не нажато, то проверим...
    if (key_pressed == 0) {
      // ... нажатие клавиши
      if (digitalRead(buttonBack)==LOW) {
        // выждем паузу... (защита от дребезга контактов)
        delay(300);
        // и снова проверим состояние кнопки
        if (digitalRead(buttonBack)==LOW) {
          // если клавиша осталась нажатой
          // значит можно зафиксировать это состояние
          key_pressed = 1;
          // выключим прерывание
          Timer1.detachInterrupt();
          // настроим его на новую скорость (скорость перемотки)
          Timer1.initialize(motorSpeedRev);
          // и снова запустим таймер (уже с новой скоростью)
          Timer1.attachInterrupt(EventTimer);           
        }
      }
    } 
    else
    // если мы находимся в состоянии перемотки, то...
    if (key_pressed == 1) {
      // проверим, не отпустили ли мы кнопку
      if (digitalRead(buttonBack)==HIGH) {
        // защита от дребезга
        delay(300);
        // есди отпустили кнопку, то...
        if (digitalRead(buttonBack)==HIGH) {
          // зафиксируем это состояние
          key_pressed = 0;
          // и переведем таймер в режим обычного ведения
          Timer1.detachInterrupt();
          Timer1.initialize(motorSpeed);
          Timer1.attachInterrupt(EventTimer);           
        }
      }
    } 

    // не помешает   
    delay(200);
}

//функция возврата на исходную позицию
void clockwise(int stepNum) {
  switch (stepNum) {
  case 0:
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  break;
 
  case 1:
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  break;
 
  case 2:
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  break;
 
  case 3:
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  break;
 
  case 4:
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  break;
 
  case 5:
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  break;
 
  case 6:
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  break;
 
  case 7:
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  break;
  }
}

//функция ведения (трекер)
void counterclockwise (int stepNum) { 
  switch (stepNum) {
  case 0:
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  break;

  case 1:
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  break;

  case 2:
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  break;

  case 3:
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  break;

  case 4:
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  break;
 
  case 5:
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  break;
 
  case 6:
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  break;
 
  case 7:
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  break;
  }
}
« Останнє редагування: 24 Липня 2015, 22:18:13 від alex~ »
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

В TimerOne
вместо
Код: [Select]
          // выключим прерывание
          Timer1.detachInterrupt();
          // настроим его на новую скорость (скорость перемотки)
          Timer1.initialize(motorSpeedRev);
          // и снова запустим таймер (уже с новой скоростью)
          Timer1.attachInterrupt(EventTimer);           

Можно просто написать
Код: [Select]
Timer1.setPeriod(motorSpeedRev);

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

=================

Внимание!
Еще немного по поводу micros() и delayMicroseconds().
Во время проверки вышеописанной функции myDelayMks наткнулся на замедление хода часов. Воткнул осциллограф для изучения.

Сформировал меандр, проще не бывает:

Код: [Select]
void loop() {
  digitalWrite(13,0);
  delayMicroseconds(10000);
  digitalWrite(13,1);
  delayMicroseconds(10000);
}
Ну и поигрался с разными значениями задержки и разными функциями (штатными delay и вышеописанными myDelay).

Обнаружил, что микросекунды правильно считаются только первые несколько секунд. Потом скачком микросекунды начинают отсчитываться медленнее примерно на ~5%.

Милисекундные версии работают правильно.

В "левом" клоне ардуино этого эффекта не обнаружил. Возможно - в связи с другой частотой кварца.

В интернете обнаружил несколько способов фикса этого бага. А также всяческие советы вроде рекомендаций не формировать длинные задержки с помощью micros.

Надо писать свои версии функций micros() и delayMicroseconds(). Но поскольку они аппаратно-зависимы, общее решение будет сложным.
 :pain:

Хотя в данном конкретно случае можно воспользоваться библиотекой TimerOne и написать micros() на его базе. Или ограничиться конкретной версией платы, написав micros для нее.
Записаний

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

Как там амбарка ?  :shuffle:
Что там "натикало" за ночь ?

Пароли, явки, схемы, фотки будут ?
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Как там амбарка ?  :shuffle:
Что там "натикало" за ночь ?

Пароли, явки, схемы, фотки будут ?

В общем, из-за просто катастрофической занятости на работе, а также ввиду наличия и домашних дел, было крайне мало времени для хобби (

В итоге публикую фотки самой амбарки (тут все стандартно, как у всех) и тестовые фотки...
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56