delay(1000); это 1 секунда минимальное значение delay(1); это 1 мс. Это понятно. Но мне надо что-бы значение времени ожидания было меньше например delay(0,25); как обойти это ограничение.
Спасибо помогло. Я почитал. И сделал вывод что уменьшить delayMicroseconds(0,2); больше нельзя. Как можно обойти это ограничение. Мне необходимо собрать генератор на частотах от 1 МГц. Мне надо собрать управляемый генератор (регулировать напряжение и частоту) то-есть меняя напряжение частота не меняется и наоборот. На логике собирать хлопотно много переменных. Хочется собрать на базе микроконтроллера.
Насколько от 1МГц? Ардуиновский МК работает на 16 МГц. Если делать "в лоб", то для 1МГц у вас всего 16 тактов, что бы сформировать период сигнала.
Верно Корней говорит. Не обязательно пользоваться delay и друзьями. Можно просто гонять цикл: Код (Text): for (;;) { PORTD |= (1 << 3); PORTD &= ~(1 << 3); } Теперь о том что тут происходит. Магия с PORTD — это изменение сигнала на пине между HIGH и LOW. Используется прямая запись в порты, чтобы избежать вычислительных затрат на вызов функции digitalWrite. Первая строка — ставит HIGH на 3-м пине, вторая строка — LOW на нём же. Вместо 3-го пина можете использовать любой другой, это просто пример. Если я всё понимаю правильно, то установка в HIGH — это такт, в LOW — ещё такт, джамп назад — ещё такт. Итого вы получаете сигнал на частоте 16 МГц / 3 = 5,3 МГц.
Только в этом случае контроллер больше ничем заниматься не сможет. Любая попытка что-то еще сделать - сбой генерации. Может лучше какой-нибудь управляемый генератор запользовать?
Прямоугольный сигнал скважности 2 ардуиновский МК сможет выдать до 8МГц без задействования процессора (если я правильно понял даташит). Но топик-стартер хочет что-то делать с напряжением. Пора, наверное, заслушать именно его?
Я хочу для экспериментов (лабораторной) собрать управляемый генератор. На основе прямоугольных импульсов делать синусоиду разной формы и частоты. Частота прямоугольных импульсов 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; // повышаем напряжение канала Б } } Эта схема собирается как на транзисторах так и на логике проблема при переходе на другие частоты и другую форму синусоиды то кардинально приходиться перепаивать схему.