А точно так можно?
а что не так?
Всегда было страшно пихать пин на +5
а на землю значит можно ![]()
Это второй вопрос ![]()
резистор 100ом яб поставил со средней ноги переменника на пин.
Но это я, поэтому может быть неправильно
да правильно все ![]()
но када хочется на скорую, а контрацептива тьфу, резистора нет, можно рискнуть))
Можно и так, но зачем? Никакие параметры не выйдут за пределы же.
@Diagnost , если заработает то для бОльшей точности установки FREQ можно использовать:
- Ручку на резистор БОЛЬШОГО (просто ОГРОМНОГО) размера.
- Многооборотный резистор
А я бы еще зашунтировал вход керамикой на 0.1.
Но это (как им резистор на 100 Ом) уже “улучшательство”.
Сегодня проверил: работает регулировка частоты. При подключении к эбу меняется управление форсунками и искрой. BOOM ![]()
Спасибо за обратную связь))
А то ведь большинство тем заканчивается фразой: «Опробую и напишу» ![]()
Еще один момент. Попытался сейчас подключить 7-ми индикатор тм1637. При прокрутке потенциометром частота меняется на индикаторе , но на осциллограмме проскакивает большое расстояние между пучками импульсов. Может под этот индикатор я с кодом намудрил.
#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK 8
#define DIO 9
#define wheel_len 240
#define pt_pin A0
#define out1_pin 2
#define out2_pin 3
uint32_t tick_delay, mill;
uint32_t FREQ = 900; //rpm
uint16_t pt;
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);
const char Table1[wheel_len] = {
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
void setup() {
pinMode(out1_pin, OUTPUT);
pinMode(out2_pin, OUTPUT);
// Инициализируем дисплей
tm1637.init();
tm1637.set(6); // Устанавливаем яркость дисплея (0-7)
// Выводим начальные нули на дисплей
tm1637.display(0, 0);
tm1637.display(1, 0);
tm1637.display(2, 0);
tm1637.display(3, 0);
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
mill = millis();
}
void loop() {
for (uint8_t i = 0; i < wheel_len; i++) {
digitalWrite(out1_pin, Table1[i]);
digitalWrite(out2_pin, !Table1[i]);
// digitalWrite(out3_pin, !Table2[i]);
delayMicroseconds(tick_delay);
}
if (millis() - mill > 1000) {
mill = millis();
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
}
// Разбиваем на отдельные цифры
int8_t digits[] = {0, 0, 0, 0};
digits[0] = FREQ / 1000; // тысячи (десятки км/ч)
digits[1] = (FREQ / 100) % 10; // сотни (единицы км/ч)
digits[2] = (FREQ / 10) % 10; // десятки (десятые км/ч)
digits[3] = FREQ % 10; // единицы (сотые км/ч)
// Отображаем скорость на дисплее
tm1637.point(false);
tm1637.display(0, digits[0]);
tm1637.point(false);
tm1637.display(1, digits[1]);
tm1637.point(false); // Включаем точку для разделения целой и дробной части
tm1637.display(2, digits[2]);
tm1637.point(false);
tm1637.display(3, digits[3]);
}
В код вставил только данные для отображения частоты на тм1637. После этого пропущенных зубьев стало больше.
Как будто процессор отвлекается на индикацию и сбиваются импульсы.
Перенеси код работы с ТМ в if(). Я же его не зря завёл, а чтобы уменьшить влияние на основной алгоритм.
Если не поможет - значит нужно полностью переписывать код на работу БЕЗ делеев.
Вот так:
#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK 8
#define DIO 9
#define wheel_len 240
#define pt_pin A0
#define out1_pin 2
#define out2_pin 3
#define timeout 1000
uint32_t tick_delay, mill;
uint32_t FREQ = 900; //rpm
uint16_t pt;
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);
const char Table1[wheel_len] = {
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
void setup() {
pinMode(out1_pin, OUTPUT);
pinMode(out2_pin, OUTPUT);
// Инициализируем дисплей
tm1637.init();
tm1637.set(6); // Устанавливаем яркость дисплея (0-7)
// Выводим начальные нули на дисплей
tm1637.display(0, 0);
tm1637.display(1, 0);
tm1637.display(2, 0);
tm1637.display(3, 0);
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
mill = millis();
}
void loop() {
for (uint8_t i = 0; i < wheel_len; i++) {
digitalWrite(out1_pin, Table1[i]);
digitalWrite(out2_pin, !Table1[i]);
delayMicroseconds(tick_delay);
}
if (millis() - mill > timeout) {
mill = millis();
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
// Разбиваем на отдельные цифры
int8_t digits[] = {0, 0, 0, 0};
digits[0] = FREQ / 1000; // тысячи (десятки км/ч)
digits[1] = (FREQ / 100) % 10; // сотни (единицы км/ч)
digits[2] = (FREQ / 10) % 10; // десятки (десятые км/ч)
digits[3] = FREQ % 10; // единицы (сотые км/ч)
// Отображаем скорость на дисплее
tm1637.point(false);
tm1637.display(0, digits[0]);
tm1637.point(false);
tm1637.display(1, digits[1]);
tm1637.point(false); // Включаем точку для разделения целой и дробной части
tm1637.display(2, digits[2]);
tm1637.point(false);
tm1637.display(3, digits[3]);
}
}
Даже вот так будет “по красивее” ))
#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK 8
#define DIO 9
#define wheel_len 240
#define pt_pin A0
#define out1_pin 2
#define out2_pin 3
#define timeout 1000
uint32_t tick_delay, mill;
uint32_t FREQ = 900; //rpm
uint16_t pt;
uint8_t digits[] = {0, 0, 0, 0};
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);
const char Table1[wheel_len] = {
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
// Функция "печати" FREQ на TM1637...
void print_freq(void) {
digits[0] = FREQ / 1000; // тысячи (десятки км/ч)
digits[1] = (FREQ / 100) % 10; // сотни (единицы км/ч)
digits[2] = (FREQ / 10) % 10; // десятки (десятые км/ч)
digits[3] = FREQ % 10; // единицы (сотые км/ч)
tm1637.point(false);
tm1637.display(0, digits[0]);
tm1637.point(false);
tm1637.display(1, digits[1]);
tm1637.point(false); // Включаем точку для разделения целой и дробной части
tm1637.display(2, digits[2]);
tm1637.point(false);
tm1637.display(3, digits[3]);
}
void setup() {
pinMode(out1_pin, OUTPUT);
pinMode(out2_pin, OUTPUT);
// Инициализируем дисплей
tm1637.init();
tm1637.set(6); // Устанавливаем яркость дисплея (0-7)
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
print_freq();
mill = millis();
}
void loop() {
for (uint8_t i = 0; i < wheel_len; i++) {
digitalWrite(out1_pin, Table1[i]);
digitalWrite(out2_pin, !Table1[i]);
delayMicroseconds(tick_delay);
}
if (millis() - mill > timeout) {
mill = millis();
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len);
// Отображаем скорость на дисплее
print_freq();
}
}
Суть if (millis() - mill > timeout) { } в том, чтобы разгрузить основной цикл (loop()), в котором с использованием задержек выполняется основной алгоритм.
BOOM, еще раз спасибо. Все работает
. Пару извилин у меня в голове появилось)
Кстати, вот это:
Там всё равно осталось.
Но теперь оно происходит ТОЛЬКО ОДИН раз за секунду (как помеха), а не после каждой пачки импульсов (как на осциллограмме) - несколько сотен может тысяч раз за секунду.
Не знаю как на это оборудование внешнее будет реагировать, возможно и не заметит (или спишет на погрешность какую или ещё что). А возможно будет «ругаться». Проверяй.
Завтра проверю. Если блок будет видеть как помехи, то задействую две ардуинки)), что бы с кодом не заморачиваться.
