Импульсы появились, но при вращении потенциометром происходят периодически “глюки”: некоторые форсунки отключаются, управление искрой на паре цилиндров отказывает. Эбу видит какие то расхождения в сигнале. BOOM, думаю и так супер получилось. Теперь буду разбираться с перепрошивкой нано.
Поясните - это происходит именно при плавном движении ползунка по резистору (максимально плавно) или же при резком изменении положения ползунка (резкое изменение частоты)? Или ещё как-то? Максимально описываете повеледение, ведь я не нахожусь рядом и мне сложно понять в чем причина.
Если у вас есть желание довести данный блок до конечного результата - я готов помочь.
Главное тут для меня было понять - работают ли блоки при формировании импульсов через прерывания. Как я понимаю - работают? (То есть если не вращать резистор?)
Если вы готовы продолжать - у меня есть идея как попробовать довести проект до конца. Но всё зависит от вас…
Вы отлаживаете не в той последовательности.
Сначала нужно вывести сигнал на осциллограф или логический анализатор. Второе - предпочтительнее. Затем внимательно изучить сигнал, соответствует ли он тому, что по Вашему мнению должно быть. Если соответствует - только тогда подавать на форсунки. Если не соответствует - добиваться соответствия.
Если сигнал соответствует ожиданиям, но приводит к неверной работе устройства, значит, Ваше мнение ошибочно и нуждается в исправлении.
Действуя в такой последовательности, Вы в случае неудачи эксперимента будете знать, что именно нуждается в доработке: соответствие генерируемого сигнала Вашему представлению либо Ваше представление о свойствах сигнала.
Я это делал у себя дома и сигнал был сопоставим с референсным из первоначально скетча и не отличался, даже более того - больше соответствовал расчетным чем через формирование в основном цикле.
Об этом я и спрашивал - Сигнал ожидаемо должен быть «вкусным блокам», но проблема у него при вращении резистора или где-то ещё?
Я вообще-то писал Диагносту - делал ли это он у себя.
Как свидетельствует обширная практика повторения проектов Ардуино, в процессе попыток такого повторения возникает масса проблем. Поэтому надеяться, что если автор прошел некоторый путь, то у того, кто повторяет, пройти этот путь получится автоматически, слишком оптимистично.
Вот чтобы ответить на этот вопрос, и нужен логический анализатор:
кроме исходного варианта на одной фиксированной частоте, нужно посмотреть, как ведет себя сигнал на других частотах, а также, как он ведет себя в процессе перестройки частоты.
Например, потенциометр, задающий частоту, может шуметь. Причем шуметь по-разному у автора и у повторяльщика.
С последним скетчем появилось управление , но при плавном перемещении ползунка, примерно с 1500 об/мин( видно что начинаются глюки). У меня на стенде подключены светодиоды к форсам и управлению катушкой. Управление форсунками еще идет, а в управление катушкой отказывает 2-а цилиндра. При дальнейшем повороте ползунка катушка с форсунками перестают работать совсем. Если отключить питание и ползунок оставить примерно на 3000 об/мин, а затем заново подключить питание, то управления совсем нет. Только когда обороты сделаю ниже 1500 об/мин блок запускается. Хотя сейчас смотрел осциллографом сигнал такой же как с рабочим скетчем (пост №16). Может у меня с контактами проблема. Еще раз проверю все основательно, что бы в заблуждение не ввести.
Это правильный подход. Проверь. Потому что в импульсах (кроме частоты) я расхождений не увидел. А у меня осциллограф на 100МГц, эти килогерци он хорошо «видит».
Поясню - при увеличении значения FREQ - увеличивалась частота, но последовательность сохранялась.
Поясню для остальных (но думаю и так большинство понимает), именно из-за адекватности ТС и его фраз вида:
Я всё ещё хочу довести этот «проект» до логического завершения.
Ни больше, ни меньше. Человек делает что я ему говорю и даёт обратную связь. А я давно с авр «не работал». Вспомнить и сделать. ))
Сейчас внимательнее посмотрел , где должен быть пропущенный зуб. Скорее всего тут засада. Вот первое фото. Со скетчем с 16 поста. С ним все работает. А на втором фото перед пропущенным зубом еще один широкий импульс. И этот импульс появляется не каждый раз, а через раз. Эбу не понимает поэтому. Обороты одинаковые 300 об/мин.
Если ты ещё на связи и в ближайшее время не хочешь никуда срочно уйти, я готов перепроверить у себя.
На связи)
Подожди я свои измерения сделаю.
Давай для чистоты эксперимента - приведи два кода (сюда прикрепи) которые ты использовал.
А я пока старые коды опробую.
Вот с этим работает.
#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;
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);
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);
}
}
С этим с глюками.
#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 500
uint32_t tick_delay, FREQ = 5500; //rpm
uint32_t pt, mill;
volatile uint8_t index = 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,
};
void setup() {
DDRD |= (1 << PD2);
DDRD |= (1 << PD3);
PORTD &= ~(1 << PD2);
PORTD &= ~(1 << PD3);
// Настройка режима CTC Timer1
TCCR1A &= ~((1 << WGM10) | (1 << WGM11));
TCCR1B &= ~((1 << WGM13));
TCCR1B |= (1 << WGM12);
// Настройка предделителя на 8 Timer1
TCCR1B |= (1 << CS11);
TCCR1B &= ~((1 << CS12) | (1 << CS10));
// Разрешаем прерывание по совпадению с OCR1A
TIMSK1 |= (1 << OCIE1A);
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
// Устанавливаем значение для сравнения
tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
OCR1A = tick_delay;
// Глобально разрешаем прерывания
sei();
}
void loop() {
if (millis() - mill > timeout) {
mill = millis();
pt = analogRead(pt_pin);
FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
OCR1A = tick_delay;
// Разбиваем на отдельные цифры
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]);
}
}
ISR(TIMER1_COMPA_vect) {
if (Table1[index] == 0) {
PORTD &= ~(1 << PD2);
PORTD |= (1 << PD3);
} else {
PORTD |= (1 << PD2);
PORTD &= ~(1 << PD3);
}
if (index++ >= wheel_len) {
index = 0;
}
}
Я на связи, просто еще “не готово”. Жди.
Смотри, у меня нет резистора в схеме, поэтому я установил 3000 (это выше того, когда ты говорил начинаются проблемы).
Запусти (если можешь) их у себя:
Вот первый код:
#define wheel_len 240
#define pt_pin A0
#define out1_pin 2
#define out2_pin 3
uint32_t tick_delay, mill;
uint32_t FREQ = 3000; //rpm
uint16_t pt;
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);
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);
}
}
Вот второй код:
#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 500
uint32_t tick_delay, FREQ = 3000; //rpm
uint32_t pt, mill;
volatile uint8_t index = 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,
};
void setup() {
DDRD |= (1 << PD2);
DDRD |= (1 << PD3);
PORTD &= ~(1 << PD2);
PORTD &= ~(1 << PD3);
// Настройка режима CTC Timer1
TCCR1A &= ~((1 << WGM10) | (1 << WGM11));
TCCR1B &= ~((1 << WGM13));
TCCR1B |= (1 << WGM12);
// Настройка предделителя на 8 Timer1
TCCR1B |= (1 << CS11);
TCCR1B &= ~((1 << CS12) | (1 << CS10));
// Разрешаем прерывание по совпадению с OCR1A
TIMSK1 |= (1 << OCIE1A);
pt = analogRead(pt_pin);
// FREQ = map(pt, 0, 1024, 300, 5500);
// Устанавливаем значение для сравнения
tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
OCR1A = tick_delay;
// Глобально разрешаем прерывания
sei();
}
void loop() {
if (millis() - mill > timeout) {
mill = millis();
pt = analogRead(pt_pin);
// FREQ = map(pt, 0, 1024, 300, 5500);
tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
OCR1A = tick_delay;
// Разбиваем на отдельные цифры
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]);
}
}
ISR(TIMER1_COMPA_vect) {
if (Table1[index] == 0) {
PORTD &= ~(1 << PD2);
PORTD |= (1 << PD3);
} else {
PORTD |= (1 << PD2);
PORTD &= ~(1 << PD3);
}
if (index++ >= wheel_len) {
index = 0;
}
}
Они отличаются от “рабочих” (с регулировкой) только тем, что я исключил регулировку (воздействие) резистором.
Сейчас скрины прикреплю.
Скрины еще грузятся… ((

