Доработка нивелира для работы с приемником
- Войдите на сайт для отправки комментариев
Втр, 23/03/2021 - 15:49
Собственно посмотрел я такое видео на Youtube
https://www.youtube.com/watch?v=SuG3PtFeR7o
Суть проста - приемник который работает на частоте 10кГц
Лазерный невелик в режиме работы с приемником должен выдавать данную частоту.
Мой китайский товарищ не умеет работать с приемниками и очень бы нужен был такой режим для строительных работ.
Вижу на схеме ардуинку, ключ(мосфет) IRL 540
Собственно только заказал осфилограф - жду. Может кто помочь сообразить правильный скетч для генерации импусов на нужной частоте и правильной схемы - резисторы на схеме не определены
спасибо
Чтобы сообразить правильный, надо понять что не устраивает в неправильном. А вы его не предъявили
Да проблема в том что нет никакого - проблемы написать нет. был бы пример
Пример чего? Задача довольно специфичесая
Да я как понимаю судя по видео на контакты ардуино выдает 2вольта с частотой 10кгц
получается нужно включать сигнал на 0.00001 сек к примеру и его включать - если я правильно понимаю что такое ним сигнал
Ну, Вы бы хоть что-то сами попробовали! С такими заходами как у Вас - только в "Ищу исполнителя" и за деньги.
Вы совсем ничего не знаете? Если хоть немного что-то знаете, могу дать ссылки здесь же на форуме на генераторы таких частот. Попробуйте сделать сами. На вопросы Вам ответят, но делать за кого-то здесь не принято (и, да, "как сделать?" - это не вопрос). Резисторы там без проблем, ставьте 150 Ом с пина на затвор и 10К с затвора на землю. Там делать нечего. Земли, разумеется, общие.
Другое дело, что это безо всякой ардуины делается на одной микросхеме NE555, но это "на вкус и цвет".
Если же не знаете совсем ничего, то да, в раздел "Ищу исполнителя" и договаривайтесь об оплате.
А попросить у автора схему и программу?
А попросить у автора схему и программу?
Пока связи с ним нет
Да я же не против. Никого не знаю тут
был бы пример
Пожалуйста - http://arduino.ru/forum/programmirovanie/generator-signalov#comment-522531 Там на 40 килогерц, но написано как и где менять для любой разумной частоты
Вот другой пример - на 1кГц и 500Гц, опять же написано как менять частоту. - http://arduino.ru/forum/programmirovanie/c-v-mikrokontrollerakh-na-primere-tipichnoi-zadachi
Есть ещё с десяток. Вы вообще поиск по форуму пробовали? Или сразу постить?
Но, если совсем ничего не знаете, быстрее заказать (сделать самому интереснее, но я не знаю Вашей цели - поковыряться и сделать или просто получить устройство)
Никакой шим не нужен . Возможно вам хватит функции delayMicroseconds()...
Да, не возможно, а точно хватит.
Да тут и ардуина лишняя.
Да, не возможно, а точно хватит.
это не кошерно, у мну как раз на 10 килогерц что-то пробное на твоей библиотеке есть, вникать не хочу, что там и как делал и для чего )))
скетч:
#ifndef CONSTANTS #include "ConstTimers.h" // Параметры для работы таймера/счётчика №2 на частоте 10kГц // constexpr uint8_t timerBits2 = 8; constexpr uint8_t timerTicks2 = 99; // #endif #define pinINT1 3 #define PIN_LED 13 volatile unsigned long old_millis = 0; volatile unsigned long sch = 0; void start_Sch() { digitalWrite(PIN_LED, HIGH); attachInterrupt(1, Sch, RISING ); // analogWrite(pinINT1,0x80); old_millis = millis(); } void end_Sch() { detachInterrupt(1); digitalWrite(PIN_LED, LOW); } void Sch(void) { sch++; } void setup() { Serial.begin(115200); pinMode(PIN_LED, OUTPUT); pinMode(11, OUTPUT); TCCR2A = 0x42; // Инвертирование пина 11 по сравнению и режим CTC то OCR2A TCCR2B = 0x00 | timerBits2; // Установить СТС режим и делитель частоты OCR2A = timerTicks2; // установить TOP равным topValue Serial.print("TCCR2B = 0x00 | timerBits2 = "); Serial.println(timerBits2); Serial.print("OCR2A = timerTicks2 : = "); Serial.println(timerTicks2); Serial.println(); start_Sch(); } void loop() { if (millis() - old_millis >= 1000) { end_Sch(); Serial.print("Счетчик = "); Serial.println(sch); // Serial.println(); delay(1000); sch = 0; start_Sch(); } }и библиотека ConstTimers.h
#ifndef CONSTTIMERS_H #define CONSTTIMERS_H /////////////////////////////////////////////////////////////////////////////// // // Недобиблиотека вычисления битов конфигурации делителя частоты и // количества тиков таймера по заданной частоте. // // Предназначена для использования с микроконтроллером ATmega328P // (например, в Ардуино или в AVR-студии). Модификация для других // микроконтроллеров возможна и несложна, как будет показано ниже. // // Основная особенность: ВСЕ ВЫЧИСЛЕНИЯ ПРОИСХОДЯТ ВО ВРЕМЯ КОМПИЛЯЦИИ. // В РЕЗУЛЬТИРУЮЩИЙ КОД НЕ ПОПАДАЕТ НИ ОДНОГО БАЙТА НИ КОДА, НИ ДАННЫХ. // // замечание о точности: // гарантировать точность произвольной частоты невозможно, т.к. требуемый период // может элементарно не являться делителем тактовой частоты микроконтроллера или // его, может быть, невозможно подобрать имеющимися делителями частоты. // Недобиблиотека ВСЕГДА выдаёт наилучший из возможных результатов для заданной частоты // на заданном таймере. Но при этом нет никакой возможности узнать насколько хорош // результат и какова погрешность. Если требуется инструмент для «зрячего» выбора // частот, следует взять «калькулятор таймеров» (их много, например, есть и у автора). // конец замечания о точности. // // ИСПОЛЬЗОВАНИЕ // // Для использования необходимо включить файл «ConstTimers.h» и определить константы с // модификатором constexpr для нужных конфигурационных битов и количества тиков, которым // присвоить значения, возвращаемые функциям getPrescalerBits и getTimerTicks соответсвенно. // Обе функции принимают два параметра – номер таймера и требуемую частоту. Функция // getPrescalerBits возвращает результат типа uint8_t. Функция getTimerTicks возвращает результат // типа uint16_t, т.к. таймер может быть 16-битным, для 8-битных таймеров значение не превышает 255. // // Например: // // #include <ConstTimers.h> // // // // Параметры для работы таймера/счётчика №2 на частоте 1кГц // // // constexpr uint8_t timerBits2 = getPrescalerBits(2, 1000); // constexpr uint8_t timerTicks2 = getTimerTicks(2, 1000); // // // // Параметры для работы таймера/счётчика №1 на частоте 500Гц // // // constexpr uint8_t timerBits1 = getPrescalerBits(1, 500); // constexpr uint16_t timerTicks1 = getTimerTicks(1, 500); // ............. // // // // Конфигурация таймеров // // таймер №2 // TCCR2B = timerBits2; // OCR2A = timerTicks2; // // таймер №1 // TCCR1B = timerBits1; // OCR1B = timerTicks1; // //Результат работы будет точно такой же, как если написать константы вместо вызовов функций: // // TCCR2B = 4; // OCR2A = 250; // TCCR1B = 1; // OCR1B = 32000; // // Ни на один байт код не изменится. // // КОФИГУРАЦИЯ: // // 1. расчёт производится для текущей тактовой частоты микроконтроллера. Если нужно // считать для какой-то другой частоты, измените константу ниже: // #define FCPU F_CPU // // 2. ниже приведён массив конфигурации таймеров. Количество элементов массива // соответсвует количеству таймеров. Нулевой элемент описывает нулевой таймер, // первый элемент – первый таймер и т.д. Если требуется расширить недобиблиотеку для других // микроконтроллеров, нужно изменить именно этот массив и больше изменять ничего не надо. // // В массиве для каждого таймера указано: // 1) разрядность таймера в виде максимально возможного значения количества тиков // (для 8-разрадных таймеров – 0xFF, для 16-разрядных – 0xFFFF. // 2) указатель на массив делителей частоты. Делители начинаются с 1 (делитель 0 писать не нужно) // 3) количество делителей частоты у данного таймера. // struct STimerParameters { const uint32_t maxValue; const int * prescalers; const uint8_t totalPrescalers; }; constexpr int prescalers01[] = {1, 8, 64, 256, 1024 }; constexpr int prescalers2[] = {1, 8, 32, 64, 128, 256, 1024 }; constexpr STimerParameters timerParameters[3] = { {0x000000FFul, prescalers01, sizeof(prescalers01) / sizeof(prescalers01[0])}, {0x0000FFFFul, prescalers01, sizeof(prescalers01) / sizeof(prescalers01[0])}, {0x000000FFul, prescalers2, sizeof(prescalers2) / sizeof(prescalers2[0])}, }; constexpr int8_t totalTimers = sizeof(timerParameters) / sizeof(timerParameters[0]); // // // ЛИЦЕНЗИЯ // // Данный код поставляется по лицензии ПНХ. // // 1. Вы можете свободно использовать или не использовать его в коммерческих, // некоммерческих, и любых иных, не запрещённых законом, целях. // // 2. Автор не несёт решительно никакой ответственности за любые положительные // или отрицательные результаты использования или неиспользования данного кода. // // 3. Если Вам таки хочется сделать автору предъяву, то Вы знаете, куда // Вам следует обратиться. А если не знаете, то см. название лицензии. // // 4. Если данный код вдруг Вам пригодился (как учебник или ещё как что) и Вам // почему-либо (ну, приболели, может) захотелось отблагодарить автора рублём, // то это всегда пожалуйста – WebMoney, кошелёк № R626206676373 // // 5. Возникновение или невозникновение у Вас желаний, обозначенных в п.4 // настоящей лицензии никак не связано с п.1, который действует безусловно // и независимо от п.4. // // 6. Если данный код нужен Вам с какой-либо другой лицензией, например, с // сопровождением или Вы нуждаетесь во внесении изменений, свяжитесь с автором // на предмет заключения договора гражданско-правового характера. // /////////////////////////////////////////////////////////////////////////////// constexpr uint32_t getPeriod(const uint32_t frequency) { return (FCPU + frequency / 2) / frequency; } constexpr uint16_t prValue(const int8_t prescalerId, const int8_t nTimer) { return timerParameters[nTimer].prescalers[prescalerId]; } constexpr uint32_t getDesiredTicks(const uint32_t frequency, const int8_t prescalerId, const int8_t nTimer) { return (getPeriod(frequency) + prValue(prescalerId, nTimer) / 2) / prValue(prescalerId, nTimer); } constexpr uint32_t correctTicks(uint32_t dTicks, const uint32_t maxValue) { return dTicks > maxValue ? maxValue : dTicks; } constexpr uint32_t getTicks(const uint32_t frequency, const int8_t prescalerId, const int8_t nTimer) { return prescalerId >= timerParameters[nTimer].totalPrescalers ? 0x1FFFFFFF : correctTicks(getDesiredTicks(frequency, prescalerId, nTimer), timerParameters[nTimer].maxValue); } constexpr uint32_t getBits(const int8_t prescalerId, const int8_t nTimer) { return prescalerId >= timerParameters[nTimer].totalPrescalers ? timerParameters[nTimer].totalPrescalers : prescalerId + 1; } constexpr int32_t absError(const uint32_t frequency, const int8_t prescalerId, const int8_t nTimer) { return abs(prescalerId >= timerParameters[nTimer].totalPrescalers ? 0x1FFFFFFF : static_cast<int32_t>(getTicks(frequency, prescalerId, nTimer) * prValue(prescalerId, nTimer)) - static_cast<int32_t>(getPeriod(frequency))); } constexpr uint8_t getPrescalerId(const uint32_t error, const uint32_t newError, const uint8_t prId, const uint8_t candidate, const uint32_t frequency, const int8_t nTimer) { return (prId >= timerParameters[nTimer].totalPrescalers) ? candidate : getPrescalerId(newError, absError(frequency, prId+1, nTimer), prId+1, (error <= newError) ? candidate : prId, frequency, nTimer); } constexpr uint16_t getTimerTicks(const int8_t nTimer, const uint32_t freq) { return getTicks(freq, getPrescalerId(0x1FFFFFul, absError(freq, 0, nTimer), 0, 0, freq, nTimer), nTimer); } constexpr uint8_t getPrescalerBits(const int8_t nTimer, const uint32_t freq) { return getBits(getPrescalerId(0x1FFFFFul, absError(freq, 0, nTimer), 0, 0, freq, nTimer), nTimer); } #endif // CONSTTIMERS_HЗЫ осциллографом и частотомером не смотрел )))
От одного из пользователей получил скетч
//Проверить что нога №2 имеет PWM выход.
Смотрю схему автора
https://prnt.sc/10ya1j9
Он говорит что использует IRL 540n
я так понимаю на мосфете между 1 и 3 ногой 10кОм и 100 Ом идет от Пина на ногу мосфета
а дальше он говорит что разорвал минусовой провод
Все ли верно я понимаю
и может кто обьяснить как правильно это работает
он этот сигнал прерывает с какой то частотой через ключ или как?
Да просто питание лазера включается-выключается...
А вот как вставить здесь цитату - не пойму никак, почему-то сразу всё цитируется
А вот как вставить здесь цитату - не пойму никак, почему-то сразу всё цитируется
а не пробовали удалять лишнее из "всего" сообщения :)
Смотрю схему автора
https://prnt.sc/10ya1j9
Он говорит что использует IRL 540n
1) ссылка на сторонний ресурс не обоснована, а тут не любят лазить за вирусами по чужим ссылкам.
2) у ссылки есть автор, что вам мешает задавать ему вопросы?
Смотрю схему автора
https://prnt.sc/10ya1j9
Он говорит что использует IRL 540n
1) ссылка на сторонний ресурс не обоснована, а тут не любят лазить за вирусами по чужим ссылкам.
2) у ссылки есть автор, что вам мешает задавать ему вопросы?
Пожалуйтесь модератору на скриншот - вставка скриншотов явно запрещена! Спасибо
Пожалуйтесь модератору на скриншот - вставка скриншотов явно запрещена! Спасибо
А что мешает самому нарисовать на листочке карандашом и сюда вставить? типа такого.
а не пробовали удалять лишнее из "всего" сообщения :)
Спасибо, теперь и я в теме ))
Да, не возможно, а точно хватит.
это не кошерно, у мну как раз на 10 килогерц что-то пробное на твоей библиотеке есть, вникать не хочу, что там и как делал и для чего )))
скетч:
ЗЫ осциллографом и частотомером не смотрел )))