как уменьшить время

Тема в разделе "Arduino & Shields", создана пользователем danilandr, 23 май 2012.

  1. danilandr

    danilandr Нуб

    delay(1000); это 1 секунда минимальное значение delay(1); это 1 мс. Это понятно. Но мне надо что-бы значение времени ожидания было меньше например delay(0,25); как обойти это ограничение.
     
  2. nailxx

    nailxx Официальный Нерд Администратор

  3. danilandr

    danilandr Нуб

    Спасибо помогло.
    Я почитал. И сделал вывод что уменьшить delayMicroseconds(0,2); больше нельзя.
    Как можно обойти это ограничение.
    Мне необходимо собрать генератор на частотах от 1 МГц.
    Мне надо собрать управляемый генератор (регулировать напряжение и частоту) то-есть меняя напряжение частота не меняется и наоборот.
    На логике собирать хлопотно много переменных.
    Хочется собрать на базе микроконтроллера.
     
  4. Корней

    Корней Гик

    Насколько от 1МГц? Ардуиновский МК работает на 16 МГц. Если делать "в лоб", то для 1МГц у вас всего 16 тактов, что бы сформировать период сигнала.
     
  5. Unixon

    Unixon Оракул Модератор

    А напряжение вы как регулируете?
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Верно Корней говорит. Не обязательно пользоваться delay и друзьями. Можно просто гонять цикл:

    Код (Text):

    for (;;) {
        PORTD |= (1 << 3);
        PORTD &= ~(1 << 3);
    }
     
    Теперь о том что тут происходит. Магия с PORTD — это изменение сигнала на пине между HIGH и LOW. Используется прямая запись в порты, чтобы избежать вычислительных затрат на вызов функции digitalWrite. Первая строка — ставит HIGH на 3-м пине, вторая строка — LOW на нём же. Вместо 3-го пина можете использовать любой другой, это просто пример.

    Если я всё понимаю правильно, то установка в HIGH — это такт, в LOW — ещё такт, джамп назад — ещё такт. Итого вы получаете сигнал на частоте 16 МГц / 3 = 5,3 МГц.
     
  7. Unixon

    Unixon Оракул Модератор

    Только в этом случае контроллер больше ничем заниматься не сможет. Любая попытка что-то еще сделать - сбой генерации. Может лучше какой-нибудь управляемый генератор запользовать?
     
  8. Корней

    Корней Гик

    Прямоугольный сигнал скважности 2 ардуиновский МК сможет выдать до 8МГц без задействования процессора (если я правильно понял даташит). Но топик-стартер хочет что-то делать с напряжением. Пора, наверное, заслушать именно его?
     
  9. danilandr

    danilandr Нуб

    Я хочу для экспериментов (лабораторной) собрать управляемый генератор.
    На основе прямоугольных импульсов делать синусоиду разной формы и частоты.
    Частота прямоугольных импульсов 2 Мгц хватит за глаза.
    Например пакет 10 импульсов рисует синусоиду используя налоговые порты каждый импульс содержит в себе ещё пакет из 10 импульсов.

    один из вариантов скетча

    int Apin = 10; // канал А подключен к Выходу digital pin 10
    int Bpin = 11; // канал Б подключен к Выходу digital pin 11
    int volte = 255;

    void setup ()
    {
    pinMode(10, OUTPUT); // канал А Выход digital pin 10
    pinMode(11, OUTPUT); // канал Б подключен к Выходу digital pin 11
    }
    void loop ()
    {
    volte = 255;
    for (int pach=0; pach<79; pach++)// канал А делает 79 циклов ( 79 пакетов со снижением напряжения по 10 импульсов)
    {
    for (int val=0; val<10; val++) // канал А делает (1 пакет из 10 импульсов)
    {
    analogWrite (Apin, volte); // Включаем канал А с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Apin, 0); // Выключаем канал А
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    volte - 1; // снижаем напряжение канала А
    }
    for (int apach=0; apach<42; apach++)
    {
    analogWrite (Apin, volte); // Включаем канал А с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Apin, 0); // Выключаем канал А
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    for (int pach=0; pach<79; pach++)// канал А делает 79 циклов ( 79 пакетов с повышением напряжения по 10 импульсов)
    {
    for (int val=0; val<10; val++) // канал А делает (1 пакет из 10 импульсов)
    {
    analogWrite (Apin, volte); // Включаем канал А с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Apin, 0); // Выключаем канал А
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    volte + 1; // повышаем напряжение канала А
    }
    volte = 255;
    for (int pach=0; pach<79; pach++)// канал Б делает 79 циклов ( 79 пакетов со снижением напряжения по 10 импульсов)
    {
    for (int val=0; val<10; val++) // канал Б делает (1 пакет из 10 импульсов)
    {
    analogWrite (Bpin, volte); // Включаем канал Б с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Bpin, 0); // Выключаем канал Б
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    volte -1; // снижаем напряжение канала Б
    }
    for (int apach=0; apach<42; apach++)
    {
    for (int val=0; val<10; val++) // канал Б делает 42 циклов (1 пакет из 10 импульсов)
    {
    analogWrite (Bpin, volte); // Включаем канал Б с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Bpin, 0); // Выключаем канал Б
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    }
    for (int pach=0; pach<79; pach++)// канал Б делает 79 циклов ( 79 пакетов с повышением напряжения по 10 импульсов)
    {
    for (int val=0; val<10; val++) // канал Б делает (1 пакет из 10 импульсов)
    {
    analogWrite (Bpin, volte); // Включаем канал Б с напряжение = volte
    delayMicroseconds(1); // ждём ("") микросекунд
    analogWrite (Bpin, 0); // Выключаем канал Б
    delayMicroseconds(1); // ждём ("") микросекунд
    }
    delayMicroseconds(5);
    volte +1; // повышаем напряжение канала Б
    }
    }



    Эта схема собирается как на транзисторах так и на логике проблема при переходе на другие частоты и другую форму синусоиды то кардинально приходиться перепаивать схему.