Фиксируемых генератор импульсов
- Войдите на сайт для отправки комментариев
Втр, 08/11/2016 - 13:14
Доброе время суток,проект простейшей программы поставил меня в ступор,надеусь на вашу отзывчивость !
И так имеем кнопку и один выход с подвязоным светодиодом для визуализации , Задача при нажатии на кнопку получаем импульс Hi 1C low 3C в количестве 50 раз и ждем нажатии нажатия кнопки если нажатия раньше окончания цикла то пауза и сброс счетчика. Зарания благодарен.
А за что именно Вы благодарны?
За то, что мы приняли Ваше сообщение к сведению?
Я понимаю еще, если бы в сообщении был вопрос, можно было бы быть юблагодарным за ответ на него...
А! Понял! Вы будете благоданы за дельный совет. Тогда даю такой: Если Вы хотите, чтобы кто-то решил поставленную задачу за Вас, подобные темы нужно размещать в разделе "Ищу исполнителя".
А! Понял! Вы будете благоданы за дельный совет. Тогда даю такой: Если Вы хотите, чтобы кто-то решил поставленную задачу за Вас, подобные темы нужно размещать в разделе "Ищу исполнителя".
Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))
написал я ему прграмку в "ищу..." пусть радуется. Не стоит это нравоучений.
Это просто по утрам я трезвый, потому и добрый. Было бы дело вечером - долго бы матерился на ленивого неуча.
Не судите так строго я просто еще учусь,а за скейч еще раз спасибо,пытаясь что-то написать не получалось реализовать счетчик,теперь есть пища для новых проэктов :-):-):-):-)
Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))
Не подходит по формальным признакам: для "Программирования" в исходном сообщении должен быть скетч.
Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))
Не подходит по формальным признакам: для "Программирования" в исходном сообщении должен быть скетч.
А как же "Азбука"? А позже глядишь и нетленка появится.))))
Не судите так строго я просто еще учусь,а за скейч еще раз спасибо,пытаясь что-то написать не получалось реализовать счетчик,теперь есть пища для новых проэктов :-):-):-):-)
Рецепт: Как быстро написать скетч новичку.
1 Найти живой форум. А лучше не один.
2. Открыть там тему и написать что скетч сделает.
3. Добрые(а может и не добрые ) дяди напишут рано или поздно скетч.
4. Придумать новые проэкты.
здравсттвуйте подскажите что изменить в коде что бы генератор выдавал определеное количество импульсов например 3 импульса
здравсттвуйте подскажите что изменить в коде что бы генератор выдавал определеное количество импульсов например 3 импульса
const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long impuls = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); } void loop() {for(int i = 0; i < 3; i = i+1){ // например повтор 3 раз unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > impuls) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState == LOW) ledState =HIGH ; else ledState = LOW; // } // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } } }вместо строк 26-29
ledState = !ledState;
Не проще будет?
проще но все равно при эмуляции в протеусе количество циклов не равно трем оно бесконечно
digitalWrite(ledPin, !DigitalRead(ledPin)); Минус одна переменная и несколько строк.
Чтобы не было бесконечно, надо завести конечную переменную и не позволять ей изменяться.)))))
поподробнее
byte a = 0;
Вместо for if (a < 3) {ваш мигалка}
После 34стр. a = a + 1;
Подскажите как избавиться в коде от delay
[code] int a=20; #define vihod 9 int b; void setup() { pinMode(vihod, OUTPUT); } void loop() {{ int i=0; do { digitalWrite(vihod, HIGH); delay(a); digitalWrite(vihod, LOW); delay(a); i++; } while (i<10);} int b; b=a*2; delay(b); digitalWrite(vihod,LOW); delay(a); } [/code]Ну , если я избавлюсь, то я полностью изменю программу. Это вам надо? Может пусть так будет.
Боюсь в циклах будет проблемно. Классика здесь. Алгоритм придется в корне поменять на IF-ы.
ИЗМЕНЯЙТЕ ГЛАВНОЕ ЧТОБ СМЫСЛ ОСТАЛСЯ
bwn, для меня это не "классика", а "глубокая древность".
bwn, для меня это не "классика", а "глубокая древность".
Так я вроде ТС отвечал.))))
Если кому иному, то процитирю али обращусь.)))
ИЗМЕНЯЙТЕ ГЛАВНОЕ ЧТОБ СМЫСЛ ОСТАЛСЯ
Неа, это вы изменяйте. Направление показали.
ВСЕ ВЕРНО НЕ ПОЛУЧИЛОСЬ ПАУЗУ ДЕЛАТЬ В ПОСТЕ №9 ПРИШЛОСЬ ЧЕРЕЗ DELAУ ДЕЛАТЬ
Я НОВИЧЕК В ЭТОМ ДЕЛЕ
Вроде в 9посте вас не устраивала только бесконечность повторения?
да все верно после повтора № количества пауза нужна там я просто пытался что подобное сдеелать без delay
Путаетесь в показаниях, просто пауза или прекратить вовсе?
пауза и дальше по кругу основа для эмулятор ДПКВ авто в общем
Заводите две глобальных переменных флага, в начале loop проверяете одну на 0, если да - крутите свой for, в конце изменяете ее значение.
После окончания for, проверяете второй флаг на 0, если да - изменяем его, запоминаем значение миллис и начинаем отсчитывать требуемый интервал. По достижении - сбрасываем оба флага в 0. Второй флаг нужен, чтобы при каждом проходе loop не изменять уже сохраненное значение миллис.
по подробне можно я новичек в микроконролерах учусь на примерах
Ну вот так
/* lex1608.ino #1 генератор -> 9 (Out1_pin) */ //#1 генератор const int Out1_pin = 9; // вывод генератора bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов const int half_cycle = 20; // длительность импульсов const int n_inpuls = 10;// количество выдаваемых импульсов byte i_inpuls = 0;// кол-во прошедших импульсов void setup() { //#1 генератор pinMode(Out1_pin, OUTPUT); digitalWrite(Out1_pin, Out1 = 0); } void loop() { //#1 генератор static uint32_t past1 = 0; if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов past1 = millis(); generator_ON = 1; // вкл генератор i_inpuls = 0; // обнулить подсчет импульсов } if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов past1 = millis(); Out1_old = Out1; Out1 = ! Out1; if (! Out1_old && Out1) { // если прошел перепад 0/1 i_inpuls++; if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано generator_ON = 0; // вкл формирователь паузы между импульсами else digitalWrite(Out1_pin, Out1 ); } else digitalWrite(Out1_pin, Out1 ); } }Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.
не идет на осцилограме не работает пост №29
Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.
Не все простые "гениальные"решения будут работать. Перед тем как советовать, лучше убедиться на практике.
А вот залей в Ардуину и по светодиоду пин 13 убедись в мигании 5 импульсов
/* lex1608.ino #1 генератор -> 13 (Out1_pin) */ //#1 генератор const int Out1_pin = 13; // вывод генератора bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов const int half_cycle = 300; // длительность импульсов const int n_inpuls = 5;// количество выдаваемых импульсов byte i_inpuls = 0;// кол-во прошедших импульсов void setup() { //#1 генератор pinMode(Out1_pin, OUTPUT); digitalWrite(Out1_pin, Out1 = 0); } void loop() { //#1 генератор static uint32_t past1 = 0; if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов past1 = millis(); generator_ON = 1; // вкл генератор i_inpuls = 0; // обнулить подсчет импульсов } if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов past1 = millis(); Out1_old = Out1; Out1 = ! Out1; if (! Out1_old && Out1) { // если прошел перепад 0/1 i_inpuls++; if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано generator_ON = 0; // вкл формирователь паузы между импульсами else digitalWrite(Out1_pin, Out1 ); } else digitalWrite(Out1_pin, Out1 ); } }Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.
Не все простые "гениальные"решения будут работать. Перед тем как советовать, лучше убедиться на практике.
Каюсь, не проверял. Поверил автору, что все устраивает кроме отсутствия паузы.
В таком стиле никаких delay() или других циклов быть в loop() не должно, ну кроме ну очень коротких. Это источник косяков в будущем. Вот народ на циклы и delay() подсел, и у них этот стиль "пробуксовывает".
А вот залей в Ардуину и по светодиоду пин 13 убедись в мигании 5 импульсов
/* lex1608.ino #1 генератор -> 13 (Out1_pin) */ //#1 генератор const int Out1_pin = 13; // вывод генератора bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов const int half_cycle = 300; // длительность импульсов const int n_inpuls = 5;// количество выдаваемых импульсов byte i_inpuls = 0;// кол-во прошедших импульсов void setup() { //#1 генератор pinMode(Out1_pin, OUTPUT); digitalWrite(Out1_pin, Out1 = 0); } void loop() { //#1 генератор static uint32_t past1 = 0; if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов past1 = millis(); generator_ON = 1; // вкл генератор i_inpuls = 0; // обнулить подсчет импульсов } if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов past1 = millis(); Out1_old = Out1; Out1 = ! Out1; if (! Out1_old && Out1) { // если прошел перепад 0/1 i_inpuls++; if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано generator_ON = 0; // вкл формирователь паузы между импульсами else digitalWrite(Out1_pin, Out1 ); } else digitalWrite(Out1_pin, Out1 ); } }все работае осцилограф видт при установе количества зубьев даже обороты видит
надо будет попробоват на авто
при расмотрении осцилограмы обнаружил страный импульс период меньше чем у других
Ну у меня осциллографа нет, точнее есть но на транзисторах. Я так не ковырял эту тему. Попробуйте millis() заменить на micros() со всеми последствиями http://arduino.ru/Reference/Micros. Да и на форуме прикреплена тема на эту тему.
http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-blink-i-bez-delay-i-bez-millis
Ну и код
/* alex1608_v2.ino #1 генератор -> 9 (Out1_pin) */ //#1 генератор const int Out1_pin = 9; // вывод генератора bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов const int half_cycle = 20000; // длительность импульсов в микросекундах const int n_inpuls = 10;// количество выдаваемых импульсов byte i_inpuls = 0;// кол-во прошедших импульсов void setup() { //#1 генератор pinMode(Out1_pin, OUTPUT); digitalWrite(Out1_pin, Out1 = 0); } void loop() { //#1 генератор static uint32_t past1 = 0; if (! generator_ON && micros() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов past1 = micros(); generator_ON = 1; // вкл генератор i_inpuls = 0; // обнулить подсчет импульсов } if (generator_ON && micros() - past1 >= half_cycle ) { // формирователь импульсов past1 = micros(); Out1_old = Out1; Out1 = ! Out1; if (! Out1_old && Out1) { // если прошел перепад 0/1 i_inpuls++; if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано generator_ON = 0; // вкл формирователь паузы между импульсами else digitalWrite(Out1_pin, 1 ); } else digitalWrite(Out1_pin, 0 ); } }alex1608, а что вы хотите то? Выдать пачку импульсов может стандартная функция tone(), нужно только точно рассчитать тайминг. К примеру команда tone(8,100,50); даст на 8 ногу 5 импульсов с периодом 10мс.
просто пачка импульсов не устроит задающий диск например ваз ДПКВ ВАЗ представляеш 58зубьев и 2 пропушено?