)))
Это да, есть такое дело…
@Optron , а зачем Вам 2 таймера на период 1 сек?
В прерывании TMR1, поднимаете флаг, в loop, печатаете по флагу…
Этим гарантировано можно избежать ситуации, когда печать произойдёт раньше, чем обновятся данные
)))
Это да, есть такое дело…
@Optron , а зачем Вам 2 таймера на период 1 сек?
В прерывании TMR1, поднимаете флаг, в loop, печатаете по флагу…
Этим гарантировано можно избежать ситуации, когда печать произойдёт раньше, чем обновятся данные
Сейчас освобожусь основательно и попробую все предлагаемые варианты. Тут @Дим-мычъ и @Upper намекают на то, что таймер срабатывает с периодом в 4 секунды. По поведению программы - правдоподобно. Есть ещё такая идея. Отказаться от таймера. А показания счетчика снимать в millis() примерно раз в секунду. При этом оценивать фактическое время между снятиями показаний и делать необходимую корректировку.
Да уже не намекают, а прямо, так и говорят:
)))
Исправьте настройки таймера, и всё должно быть норм
А может тупо TCCR1B |= (1 << CS12); , не!? ![]()
Вот так работает как было задумано.
Здесь в строке 31 совет @Дим-мычъ из 19,
в строке 58 намёк @Upper из 14.
В строке 58 выводится 2999 3999 4999 и т. д. То есть, ровно через секунду.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
volatile int stobor; // счетчик оборотов
volatile int stobor2; // счетчик оборотов
unsigned long int t1;
unsigned long int t2;
unsigned long int period = 1000;
void setup()
{
t1 = millis();
t2 = millis();
pinMode(2, INPUT_PULLUP);
Serial.begin(9600);
stobor = 0;
stobor2 = 0;
wdt_enable (WDTO_8S);
attachInterrupt(digitalPinToInterrupt(2), holl, RISING); // прерывание на пине 2
// Настройка таймера
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR1B |= (1 << CS12) | (1 << CS10) | (1 << WGM12);
OCR1A = 15624;
TIMSK1 |= (1 << OCIE1A);
sei();
}
void loop()
{
// обработка счетчика оборотов stobor2
t2 = millis();
if (t2 - t1 >= period)
{
t1 = t2;
Serial.println(stobor2);
}
wdt_reset();
}
void holl() // Прерывание по датчику Холла
{
stobor++;
}
ISR(TIMER1_COMPA_vect) // Прерывание по таймеру
{
stobor2 = stobor;
stobor = 0;
Serial.println(millis());
}
Сейчас буду пробовать другие предложенные варианты.
Для точного тахо надо засекать время начала = millis() и последнего импульса, в прер от кнопки.
В петле раз в секунду выводить F=N/T.
Плюс добавить обнуление при долгом отсутствие импульсов.
Все будет асинхронно и красиво.
В итоге должен получиться стабилизатор скорости карбюраторного автомобиля.
Знакомый механик создать механизм, который будет управлять педалью газа.
Механизм будет работать с шаговым двигателем 28BYJ-48.
Самое сложное в механизме - резкое отключение механизма при нажатии любой педали.
Скетч планируется доработать следующим образом.
Добавить кнопку поддержания текущей скорости - разогнался до нужной скорости - нажал кнопку.
Несколько кнопок с определенными скоростями: 90 60 70 50 км/ч.
16 скоростей вращения шагового двигателя. Чем больше разница между фактической и заданной скоростью,
тем быстрей вращается двигатель.
Дисплей 16x2 - электронный аналог спидометра на тракторе “Кировец”.
111 222 333 444
555 TTTT
Здесь “1” - скорость на первой передаче.
…
Здесь “5” - скорость на пятой передаче.
“тахометр”
Как - то так.
Лучше б ты этого не писал
прыжки с парашутом безопаснее будут)))
у некоторых ардуинка горит при подключении к авто (при старте например там более 12 вольт)
но вы наверное все продумали… успехов!)))
Есть стабилизатор напряжения от аккумулятора на 8V зашитой от помех. Была проверена работа ардуинки с дисплеем. На дисплей выводился счетчик секунд. Работало без помех. Правда, не знаю как будет работать от датчика Холла. Там выход пять вольт, проверено осциллографом. Достаточно ли будет только делителя примерно на 4 вольта - не знаю. Лишь бы помех не было по тому проводу. На осциллографе помех не видно.
Это совет №1. Но я надеялся на другие советы.
Самое главное в этом устройстве - механический рычаг в салоне, с красной рукояткой, при нажатии на него механически рвется связь привода и заслонки возвращая работу от педали. После этого можно садиться писать программу и паять электронику.
Этот вариант рассматривался. Скорее всего будет что-то подобное. Шаговый двигатель должен при этом выходить из зацепления с механизмом. При этом педаль газа будет возвращаться в исходное состояние и ей можно будет пользоваться. Еще в механизме будет предусмотрена муфта скольжения, как в часах-ходиках.
Если без аварийной механики, то для зацепления шаговика и оси - электромуфта. В зацепе только под напряжением. Аварийно независимой линией вручную отключать питание муфты чисто по механике проще. Вероятности застревания рычага и залипания муфты интуитивно кажутся соизмеримо малыми. Педаль газа в крайнем нажатом положении должна приводимой заслонкой (ее рычагом, конечно же) стукать по приводу муфты на расцепление - дополнительная аварийная защита от залипания.
Хотя, МКПП, классическое зажигание - тут куча способов остановить сошедший с ума автомобиль.
хороший рецепт для катастрофы
сначала создадим проблему - а потом будем с ней бороться…
@Optron
Поясните, на какую технику это будет ставится? Будет ли она ездить по дорогам общего пользования или может (надеюсь) это какой-нить снегоочиститель или сгребатель навоза, который никогда не выедет за ворота свинофермы?
Надеюсь это не самодельный круиз на ВАЗ…
На китайских модулях за 100 рублей… Все таки человек - существо безбашенное ![]()
Ну-ну…
Точно сгребатель навоза на свиноферме. Чтобы хрюшек прям в крапинку по всем углам брызгами доставало.
да ладно, мне человек с нашего форума продемонстрировал свой круиз контроль, всё шикарно, просто он видимо умеет программировать )))
PS динамическое выделение памяти, пожалуй, является плохой практикой в небольших встраиваемых системах, таких как устройства AVR.(c) SpenceKonde
Автомобиль управляется не программой, а исполнительными механизмами. Просто у этого человека сервопривод заслонки еще не заклинил в открытом положении…