Как можно изменять выходной сигнал Arduino nano

Нужно получить сигнал с частотой следования прямоугольного импульса 10 кГц с длительностью сигнала равной 36 мкс. И на каких пинах это возможно сделать?

на таймере желательно

На любых, кроме A6 и A7. D0 и D1 тоже лучше не трогать.

В Вашу “длительность сигнала” (100 микросекунд) даже один период не поместится.

Или 36 мкс - это не длительность подачи сигнала, а длительность высокого уровня? Тогда неясно в чём именно Ваша проблема. Показывайте, что Вы сделали и объясняйте, что не получается.

Получил от руководителя следующее задание:
Разработать программу для микроконтроллера ATmega328 отладочной платы Arduino Nano, которая реализовывала бы функцию автоколебательного мультивибратора с одним выходом. Частота следования прямоугольных импульсов f-10 кГц, длительность токового импульса сигнала 36мксек. Через каждые 20 мксекунд производить опрос кнопки с помощью таймера, и если кнопка нажата, то импульсы выключить, а если кнопка не нажатой окажется, то генератор включить снова.
Для начала я пытаюсь понять как сделать этот самый импульс и посмотреть те самые импульсы благодаря светодиоду (если это возможно). Начал читать про автоколебательные мультивибраторы, вроде можно было бы использовать команду digitalwrite(LedPin, hight) и т.п., но меня напрягает частота следования импульса и его длительность, так же не хотел использовать команду delay т.к. нам объясняли что из за нее простаивает мк. Про кнопку еще не думал, т.к. надо для начала решить вопрос с импульсом :frowning: Ощущение что работа не трудная и я ее усложняю :frowning:

Не видел, как Вы это пытались сделать. Предъявитесь…

Пытался по своему, но для здешнего комьюнити я туповат, если мягко выразится.

Благодари DIMAX, всё давно придумано до нас, остальное сам напишешь…

//https://arduino.ru/forum/programmirovanie/upravlenie-chastotoi-i-skvazhnostyu-shim-signala#comment-211459
// Терминальная версия генератора от DIMAX 

uint16_t x = 10000;
float y = 36.0;
 
void setup() {
Serial.begin(115200);
pinMode(9,OUTPUT);
TCCR1A=(1<<COM1A1)|(1<<WGM11);
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10);
OCR1A =  ((float) y / 0.0625 ) -1;
ICR1 = (F_CPU/x)-1; 
}

void loop() {

 }

1 лайк

каждые 20 микросекунд опрос кнопки по таймеру?
на атмеге328 сильно сомнительно

наверно преподаватель сказал миллисекунд

Преподаватель написал “мс”. А что еще может быть “мс” кроме микросекунд?

Отчего же?
Прерывания можно генерить с частотой, минимум в 110 кГц, а 20 мкс - это всего 50 кГц. Так что вполне реально. Другое дело - кому может понадобиться опрашивать кнопку с такой частотой…

сдаётся мне, что преподаватель озвучивал сделать всё это на одном и том же таймере…
PS студенту пора учиться мотать портянки…ИМХО

1 лайк

Мне в любом случае надо их учиться мотать… Не зависимо от моих познаний XD

Зачем опрашивать кнопку с дикой частотой по таймеру, когда можно просто повесить прерывание на пин?

работу усложняет незнание, советую минут тридцать почитать этот сайт , но раздел прогрммирование, к стати а что за работа у вас такая я б к вам пошел

может ты великий специалист по Kubernetes, тогда сия участь может и миновать

Получили - исполняйте. Мы то здесь каким боком?

Нууу… Если у тебя такой настрой, мог бы и мимо пройти, чай пойти попить. Естественно мне ни кто готовый код не скинет, это понятно. Но мне подсказали и я сейчас читаю про таймеры, прерывания, как настроить таймер и т.п. Я только начинаю изучать это… На мой взгляд, в твоем ответе была нотка неприязни ко мне :slight_smile:

Мог бы. Но, не прошёл.

И не только к Вам, а ко всем Вам подобным.

2 лайка