Ви не увійшли.
Моніторити потрібно зміни опору, бо кабель не лише просто перерізати можна, а і підключити паралельно хибний, щоб справжній потім перерізати.
А тут не зрозумів, чому 8? Pulses Per Revolution - кількість імпульсів на оберт на одній фазі, так же? У імпульса два фронта, фази дві, виходить 4 фронта. Чи там прогальність не 50%? На картинці з осцилограмою наче схоже на 50%.
Якщо не 50%, або фази зсунуті не на 90°, тоді, звісно, потрібно робити поправку.
Саме так, не гарантується 90, з даташита:
Phase difference between outputs 90°±45° between A and B (1/4 T ± 1/8 T)
t = 1 / (rpm_max * 60 * ppr * 4)
t = 1 / ((rpm_max / 60) * ppr * 8)
rpm треба ділити на 60, а коефіцієнт 8, бо по даташиту 1/4 оберту з точністю +-1/8
Якщо підставити rpm_max=6000 з даташиту і мінімальний ppr=10, то t=125мкс, таке потягне лічильник, якщо живити від зовнішнього джерела (там вказано 200мкс, але то зі значним запасом), квадратурний декодер вже підтримується
Коли вмикають світло, я бачу на зарядці зеленій світлодіод, тобто до зарядки надходить живлення, проте як ви вірно підмітили, можливо спрацьовує "розумний" захист і далі зарядка не віддає нічого. Чому так відбувається, можливо зарядка отримує великий імпульс струму, і думає, що цього забагато і вмикає захист. В мене нема тестера, я це перевірити не можу.
Швидше за все, заряджаються конденсатори на вході перетворювачів, споживається великий струм і зарядка іде в захист від КЗ, при цьому напруга не встигає піднятись вище порогу відключення захисту в батареї.
Спробуйте відключити один з перетворювачів і проведіть експеримент.
Я б рекомендував у такій схемі, щоб струм споживача був <0.1C, а струм зарядки 0.5..1C.
Датчики ніяк ініціалізувати не потрібно. А ви все точно скопіювали зі старої: і схему, і прошивку, і EEPROM? (раптом ідентифікатори датчиків в EEPROM зберігались)
В avr-gcc можна об'явити глобальну змінну:
register uint8_t myregvar asm("r16");
вона гарантовано буде в r16, але код на C не буде з нею працювати оптимально.
На asm (або вставками на asm) з нею можна працювати як завгодно оптимально і одночасно мати доступ з C, це зручно, коли частина проекту на asm, а частина на C.
upd:
якщо потрібна двобайтова змінна, то:
register uint16_t myregvar asm("r16");
в коді на asm r16 буде молодшим, r17 - старшим
Забув пояснити: w1-uart реалізований через serdev.
Доречі, вам не вдавалось піднімати w1-uart на x86? У мене з наскоку не вийшло, схоже, потрібно патчити таблицю ACPI. Поки що не розібрався, як це правильно зробити.
В мене колись також з наскоку не вийшло розібратися як приєднати serdev до пристрою без використання DT, так щоб з командного рядка за бажанням, тому забив на нього і написав драйвер через ldisc. Через ldisc у драйвера нажаль відсутня можливість керувати baudrate, так би я до пари написав би і w1-uart )) , бо добре розібрався з нутрощами W1.
Драйвер для CH341A я тільки підтримую, щоб компілювався для сучасних ядер.
А що там не так з ch341, що він працює максимум на 250000 BAUD, а далі таке враження, що в нього там буфер на читання лише 32 байти? Пробував ось цей, 500000 BAUD тягне.
Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.
Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.
Подивіться ось тут ідею, як використовуючи другий CS керувати DATA/COMM та отримати додаткові бонуси від двох SPI.
Може і необхідність правити відпаде)
Honey пише:А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:
if (millis() - TimeStart > RoadTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...if (millis() - TimeStart > RainTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...та
if (TriMin < 7000) {
...
} else {
digitalWrite(outMotorOil, LOW);
...Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":
// Мигаем с частотой 2 и более Гц
if ((timeAfterStartVeryLong % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW); // Мигаем с частотой 1 Гц пока не отпустят кнопку
if ((timeAfterStartVeryLong % 1000) < 500)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW); // мигаем светодиодом с частотой 3 Гц
if ((TriMin % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW);і є ще одна в DisplayOilMode()
Спробуйте без sscanf, якось так:
#include <stdio.h>
#define TOKEN_COUNT 11
#define TOKEN_SIZE 88
char token[TOKEN_COUNT][TOKEN_SIZE];
void process() {
int i;
for (i = 0; i < TOKEN_COUNT; i++)
printf("token[%i]='%s'\n", i, token[i]);
}
int main() {
int i = 0, j = 0;
for (;;) {
char c = getchar();
if (c == EOF) {
break;
} else if (c == '\n') {
while (i < TOKEN_COUNT) {
token[i++][j] = 0;
j = 0;
}
i = 0;
process();
} else if (c == ',') {
if (i < TOKEN_COUNT)
token[i++][j] = 0;
j = 0;
} else {
if (i < TOKEN_COUNT && j < TOKEN_SIZE - 1)
token[i][j++] = c;
}
}
}Спробуйте зробити за допомогою avrdude з командного рядка по цій інструкції https://forum.arduino.ua/viewtopic.php?id=2904
Також подивіться, що за ArduinoISP.ino ви компілюєте, його потрібно брати з arduino-examples, бо в інеті валяється купа його непрацюючих модифікацій.
float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;
Доброго всем здоровья!
Просветите пожалуйста строчка в коде что означает 4000000.0F#define resistorValue 4000000.0F // change this to whatever resistor value you are using
F - суфікс для константи типу float
https://en.wikipedia.org/wiki/C_data_types
Основною фішкою рінгбуфера (якщо не псувати "оптимізаціями" стандартну реалізацію) є можливість виконувати запис і читання в двох окремих потоках без будь-яких синхронізацій між ними.
Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик
Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4
Как не крути переменный резистор, на выходе всегда 11.2.
У Вас входи підсилювача закорочені між собою.
І був ще такий just for fun проект з USB інтерфейсом: https://forum.arduino.ua/viewtopic.php?pid=35748
З езернет інтерфейсом https://github.com/honechko/snmpvm
Ще поки руки не дійшли замовити в китаї платки та оформити в пристойному вигляді
Вставив картинкою бо форумний двіжок зʼїдає бекслеші в тексті
Ставте два бекслеша підряд. При використанні "попередній перегляд" один бекслеш зникає в вікні вводу тексту, тому доводиться ще раз розставляти дублі.