Таймер 1 Arduino — создаем 2 таймера
Я пытаюсь вывести 2 отдельные частоты, используя 2 выходных контакта от Arduino, используя библиотеку Timer 1. Фрагмент кода показан ниже.
void setup()
{
Serial.begin(9600);
pinMode(button,INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
pinMode(sig_out, OUTPUT);
pinMode(sig_out2, OUTPUT);
Timer1.initialize(1000);
Timer1.pwm(sig_out,512,period);
Timer1.pwm(sig_out2,512,period2);
}
Проблема в том, что то, как я это написал, имеет смысл, поскольку я инициализировал 2 выхода и 2 входа, но «период» перезаписывается, поскольку есть 1 таймер, и я не знаю, как это остановить. Я думал о том, чтобы сохранить их в переменных (например, 'T1=' 'T2='), но все равно будет использовать один и тот же таймер.
Я просто хотел узнать, есть ли способ использовать 2 таймера, чтобы Arduino выдавал частоты отдельно.
@Neamus, 👍1
Обсуждение1 ответ
Лучший ответ:
Библиотека Timer1 поддерживает только... Timer 1! Так что у вас есть только один наличие аппаратного таймера. Если вы используете Arduino Uno или что-то еще аналогично, у вас есть пара других таймеров. Однако, в отличие от Timer 1 — 16-битный таймер, остальные только 8-битные. Этот означает, что они очень ограничены в диапазоне и точности частоты, которые они могут генерировать. Если у вас есть Arduino Mega, то вы есть несколько других доступных 16-битных таймеров. Возможно, вы захотите найти библиотека под названием Timer3, которая должна работать так же, как Timer1, при использовании 16-битный таймер 3.
Если вы не найдете подходящей библиотеки, вы все равно сможете сгенерируйте два сигнала, используя только Timer 1. Вот хитрость:
- установите для обоих выходов ШИМ значение "включать при сравнении соответствия"
- включить оба прерывания сравнения совпадений
- в каждом из этих ISR продвигать регистр совпадения сравнения на полшага. период соответствующего сигнала.
Для этого вам нужно вникнуть в низкоуровневые детали того, как таймер действительно работает. Рекомендую начать с прочтения Учебное пособие по Таймеры и счетчики, автор Ник Гэммон. Найдите время, чтобы прочитать и изучить это. Это не та тема, которую вы сможете освоить всего за пару часов.
- Увеличение частоты Гц при работе с 3 последовательными портами (датчики IMU)
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
@Jack B Как бы я использовал другие?, @Neamus