Я пытаюсь использовать Timer1 микроконтроллера Atmel AVR, либо AtMega328, который используется в Arduino, либо ATTiny85, для вывода двух тактовых сигналов, которые являются зеркальным отображением друг друга. Частота, которую я пытаюсь сгенерировать, - это переменная от 1 МГц до 2 МГц или более, которые слишком высоки, чтобы делать это с помощью кода для переключения выходных контактов, если я не хочу почти ничего делать в контроллере. Поэтому я хочу использовать выход таймера непосредственно на соответствующих выводах. Я использую GCC toolchain, поэтому он не ограничен библиотеками Arduino или языком.
Timer1 в Atmega328 имеет два контакта, связанных с ним, и я могу получить два идентичных сигнала от 1 МГц до 2 МГц из них. Несмотря на то, что таблица данных говорит, что я могу получить инвертированную форму волны, это сбивает меня с толку. Я также могу получить два сигнала с разными рабочими циклами на частоте 1 МГц, используя настройки ШИМ с таймером 1, но оба сигнала одновременно повышаются, а более низкий - раньше. Это не служит моему проекту. Мне даже не нужно изменение ширины импульса ШИМ, мне просто нужны два идентичных сигнала «тактового» типа противоположной фазы, вот и все.
Я не прошу, чтобы кто-нибудь написал код, чтобы я сделал это, мне просто нужно, чтобы кто-то сказал мне, какой режим / флаги таймера должен дать мне простой инвертированный сигнал на одном из двух контактов, связанных с таймером. Если возможно, я хочу избегать использования внешней инвертирующей цепи для одного из выходов, если только это не вариант.
Если это вообще возможно в ATTiny, это будет еще лучше. ATTiny также имеет 2 контакта, связанных с одним таймером, но я не уверен, что он имеет те же опции, что и ATMega.
У меня уже есть 20 МГц кристалл и конденсаторы, подключенные к печатной плате, а 20 МГц часы надежно работают на ATMega328. На плате ATTiny85 у меня кристалл 8 МГц, и он тоже работает надежно.
Пожалуйста помоги. Спасибо.
ОБНОВЛЕНИЕ : В ответах и комментариях есть некоторые неверные предположения, поэтому, возможно, я должен уточнить: Обратите внимание, что в своем первоначальном посте я заявил, что я использую тактовую частоту 20 МГц, а не 8 МГц , а также что мне не нужен ШИМ ,
Единственный режим, который дает достаточно высокую выходную частоту, кажется, режим CTC, потому что режимы ШИМ не работают для выхода 2 МГц. Есть ли способ инвертировать либо выход A таймера 1, либо выход B в режиме CTC?
Теперь я переключился на стандартную Arduino Uno (ATMega328, 16 МГц) вместо моей собственной платы на 20 МГц, чтобы проверить мой код, и это мой код для хороших устойчивых часов 2 МГц в режиме CTC с выводов 9 и 10, таймер 1 вывод выводов:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
Следы осциллографа для обоих выводов идентичны и синхронно, как я могу получить один из двух инвертированных сигналов? Режим инвертирования в техническом описании ничего не делает в режиме CTC. Я неправильно читаю таблицу данных или мне все равно придется использовать более низкую частоту и режим ШИМ?
Чтобы добавить конкретный вопрос о «вознаграждении» в мой исходный запрос:
какие изменения мне нужно внести в мой код выше, чтобы он давал идеально инвертированные сигналы на контактах 9 и 11 на максимально возможной частоте для тактовой частоты 16 МГц , будь то это 2 МГц или нет?
Сейчас я буду придерживаться стандартного Arduino Uno, чтобы на моей панели homespun не было режима ошибок и чтобы любой, у кого есть arduino, мог попробовать мой код выше и подтвердить, что он работает так, как я упоминал, а не так, как я. необходимость!