Доработка нивелира для работы с приемником

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Собственно посмотрел я такое видео на Youtube

https://www.youtube.com/watch?v=SuG3PtFeR7o

Суть проста - приемник который работает на частоте 10кГц

Лазерный невелик в режиме работы с приемником должен выдавать данную частоту. 

Мой китайский товарищ не умеет работать с приемниками и очень бы нужен был такой режим для строительных работ.

Вижу на схеме ардуинку, ключ(мосфет) IRL 540

Собственно только заказал осфилограф - жду. Может кто помочь сообразить правильный скетч для генерации импусов на нужной частоте и правильной схемы - резисторы на схеме не определены

 

спасибо

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Чтобы сообразить правильный, надо понять что не устраивает в неправильном. А вы его не предъявили

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Да проблема в том что нет никакого - проблемы написать нет. был бы пример 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Пример чего? Задача довольно специфичесая

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Да я как понимаю судя по видео на контакты ардуино выдает 2вольта с частотой 10кгц

получается нужно включать сигнал на 0.00001 сек к примеру и его включать - если я правильно понимаю что такое ним сигнал 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вы бы хоть что-то сами попробовали! С такими заходами как у Вас - только в "Ищу исполнителя" и за деньги.

Вы совсем ничего не знаете? Если хоть немного что-то знаете, могу дать ссылки здесь же на форуме на генераторы таких частот. Попробуйте сделать сами. На вопросы Вам ответят, но делать за кого-то здесь не принято (и, да, "как сделать?" - это не вопрос). Резисторы там без проблем, ставьте 150 Ом с пина на затвор и 10К с затвора на землю. Там делать нечего. Земли, разумеется, общие.

Другое дело, что это безо всякой ардуины делается на одной микросхеме NE555, но это "на вкус и цвет".

Если же не знаете совсем ничего, то да, в раздел "Ищу исполнителя" и договаривайтесь об оплате.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

А попросить у автора схему и программу?

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Rumata пишет:

А попросить у автора схему и программу?

 

Пока связи с ним нет

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Да я же не против. Никого не знаю тут

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mwcmwc пишет:

был бы пример 

Пожалуйста - http://arduino.ru/forum/programmirovanie/generator-signalov#comment-522531 Там на 40 килогерц, но написано как и где менять для любой разумной частоты

Вот другой пример - на 1кГц и 500Гц, опять же написано как менять частоту.  - http://arduino.ru/forum/programmirovanie/c-v-mikrokontrollerakh-na-primere-tipichnoi-zadachi

Есть ещё с десяток. Вы вообще поиск по форуму пробовали? Или сразу постить?

Но, если совсем ничего не знаете, быстрее заказать (сделать самому интереснее, но я не знаю Вашей цели - поковыряться и сделать или просто получить устройство)

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

   Никакой шим не нужен . Возможно вам хватит функции delayMicroseconds()...

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не возможно, а точно хватит.

gfx125
Offline
Зарегистрирован: 27.05.2017

Да тут и ардуина лишняя.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Да, не возможно, а точно хватит.

это не кошерно, у мну как раз на 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

 

ЗЫ осциллографом и частотомером не смотрел )))

mwcmwc
Offline
Зарегистрирован: 23.03.2021

От одного из пользователей получил скетч

//Проверить что нога №2 имеет PWM выход.

    
// В части генератора
const int CH1 =  2;      // Выход канала 1 - Нога №2
static boolean State1 = LOW;             // этой переменной устанавливаем состояние канала 1
unsigned long prev1 = 0;        // храним время последнего переключения 1
unsigned long current1;         // Хранит текущее значение канала 1
unsigned long fq1=44;           // 44 = 10кГц, 493 = 1кГц
 
      
void setup(){
  // В части генератора
  pinMode(CH1, OUTPUT);     
}
     
void loop(){
// Генерация CH1 
current1 = micros();
  if(current1 - prev1 > fq1) {      //проверяем не прошел ли нужный интервал, если прошел то
    prev1 = current1;               //сохраняем время последнего переключения
    digitalWrite(CH1, State1);       //даем сигнал
   State1 = !State1;                //Инвертируем
  }       
}
 
    
    
mwcmwc
Offline
Зарегистрирован: 23.03.2021

Смотрю схему автора 

https://prnt.sc/10ya1j9

Он говорит что использует IRL 540n

я так понимаю на мосфете между 1 и 3 ногой 10кОм и 100 Ом идет от Пина на ногу мосфета

 

а дальше он говорит что разорвал минусовой провод 

Все ли верно я понимаю 

 

и может кто обьяснить как правильно это работает 

он этот сигнал прерывает с какой то частотой через ключ или как? 

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Да просто питание лазера включается-выключается...

А вот как вставить здесь цитату - не пойму никак, почему-то сразу всё цитируется

Гриша
Offline
Зарегистрирован: 27.04.2014

Дим-мычъ пишет:

А вот как вставить здесь цитату - не пойму никак, почему-то сразу всё цитируется

а не пробовали удалять лишнее из "всего" сообщения :)

Гриша
Offline
Зарегистрирован: 27.04.2014

mwcmwc пишет:

Смотрю схему автора 

https://prnt.sc/10ya1j9

Он говорит что использует IRL 540n

1) ссылка на сторонний ресурс не обоснована, а тут не любят лазить за вирусами по чужим ссылкам. 

2) у ссылки есть автор, что вам мешает задавать ему вопросы? 

mwcmwc
Offline
Зарегистрирован: 23.03.2021

Гриша пишет:

mwcmwc пишет:

Смотрю схему автора 

https://prnt.sc/10ya1j9

Он говорит что использует IRL 540n

1) ссылка на сторонний ресурс не обоснована, а тут не любят лазить за вирусами по чужим ссылкам. 

2) у ссылки есть автор, что вам мешает задавать ему вопросы? 

 

Пожалуйтесь модератору на скриншот - вставка скриншотов явно запрещена! Спасибо

Гриша
Offline
Зарегистрирован: 27.04.2014

mwcmwc пишет:

Пожалуйтесь модератору на скриншот - вставка скриншотов явно запрещена! Спасибо

А что мешает самому нарисовать на листочке карандашом и сюда вставить? типа такого.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Гриша пишет:

а не пробовали удалять лишнее из "всего" сообщения :)

Спасибо, теперь и я в теме ))

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

ЕвгенийП пишет:

Да, не возможно, а точно хватит.

это не кошерно, у мну как раз на 10 килогерц что-то пробное на твоей библиотеке есть, вникать не хочу, что там и как делал и для чего )))
скетч:
 

(...........)

ЗЫ осциллографом и частотомером не смотрел )))

а "tone(pin, 10000)" вместо всех этих ужасов - не?