Свежие обсуждения
Микроконтроллеры

Как сформировать ряд частот, Гц (33,33, 66,66, 133,33....)

1 5 6

Digital, допустим, нужно 33,33 Герца Таймер должен срабатывать с удвоенной частотой и передергивать для меандра состояние вывода.
Итого 66,66 Герца ftreb. Определяемся при тактовой таймера 1000000 Герц ftimer
Значение, которое должны занести в таймер при для переполнения при FFFF
65536 - ftimer/ftreb причем ftimer/ftreb = 15001,5 - т.е не целое число , а в случае округления до целых частота будет не 66,66 , а 66,663 с копейками
33,331 с учетом делителя.На самом деле все не так радужно, учитывая не мгновенный вход в прерывание, но в 1 процент точности входим.

 

Охо-хо...что называется, Моня, зачем нам эти шутки ? Какие проценты, какие прерывания?

Для выдачи меандра 33,3(3) Гц нужен период 30000 мкс, или 15000 мкс на полмеандра. Ставите таймер1 в СТС моду, СОМ1А=01 (альтерация OC1A), в регистр OCR1A записываете 15000, на выходе ОС1А имеете свой меандр. Проц 100% свободен, ему остаётся только выждать 5с, дождаться альтерации и записать новое значение в OCR1A.

 

Это конечно хорошо, но если автор выберет МК другого семейства ?
Там даже названия будут не такие , не говоря о прочих нюансах.

 

Кажется, он говорил, что тип МК не принципиален. Взять 6-ногую аврку, типа ATtiny10, разместить на конце спички...

 

хм... Когда меня просят выдать 33,33 герца, я воспринимаю это, как 33,3300 а не 33,3333.... Поэтому и начал в первую очередь проценты считать.

 

Всё равно, об одном проценте речь не идёт. Для частоты 33,3300 Гц таймер может иметь период или 30002, или 30003, погрешность будет порядка 0,003%.

 

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

 

А если взять (дополнительный) МК-р младшего семейства с таймером, для генерации и прикинуть так:

1. Запрограммировать таймер на генерацию прерываний каждые 1,5мс для получения меандра с периодом 3мс - это получится наибольшая требуемая частота 333,33 Гц, с допустимой погрешностью +0,003(3) Гц;
2. Суммировать количество прерываний 1,5мс для получения других (меньших) требуемых частот, т.е. пропускать ненужные прерывания;
3. Использовать полученное 1,5мс прерывание для формирования паузы ~5с, т.е. отключать выход таймера через и на каждые 3333 его прерывания.

Погрешность будет складываться из точности тактового генератора плюс погрешность от разницы в 0,003(3) Гц, т.е. несколько больше 0,01%. Правда ещё останется время обработки самого прерывания, но им можно наверное и пренебречь, т.к. до 1% ещё далеко.

Вроде бы логически всё должно получиться?

 

Digital: .Вроде бы логически всё должно получиться?
Неа:

Digital: 2. .. т.е. пропускать ненужные прерывания;
Интересно, как вы это себе представляете? Вообще-то ВСЕ прерывания от таймера должны так или иначе обрабатываться - иначе как вести их подсчет? Другое дело - что не в каждом прерывании следует производить инверсию выхода.

Digital: : 3. ..т.е. отключать выход таймера
Отключите - и не будет больше прерываний, т.е. перерубите сук, на которых сидите.

Digital: Правда ещё останется время обработки самого прерывания
А оно вам важно? Даже если это время будет гипотетически очень большое -- генерируемый сигнал просто сдвинется относительно моментов срабатывания таймера. Главное - чтобы оно было постоянным, а это можно обеспечить только при двух условиях:

1. Запретить все остальные прерывания
2. Остановить основной поток команд.

Последнее связано с тем, что длительности исполнения команд могут быть разными, а при поступлении запроса на прерывание текущая команда обычно исполняется до конца. Даже если зациклить основной поток команд единственной командой (вроде jmp), то и тогда возможны случаи, когда запросы на прерывания могут приходиться на разные стадии выполнения этой команды. Впрочем, все это впишется в ваши "1%".

Непостоянство времени реакции повлияет только на дрожание фронтов (т.н. "джиттер"), но никак не на частоту генерируемого сигнала.

 

Отключать выход таймера - это имелось ввиду, сооответствующей командой в самом прерывании прекращать переводить состояние вывода из "0" в "1" и обратно (например установить вывод в "0" или третье состояние), на требуемое время.

Пропускать ненужные прерывания - имелся ввиду логический пропуск, т.е. сравнение с требуемым числом и при совпадении переключение вывода.

IDiod: Запретить все остальные прерывания
Это имеете ввиду в начале самого обработчика прерывания от таймера другие все прерывания запрещать, а при выходе из него снова разрешать?

IDiod: Остановить основной поток команд.
А можете объяснить поподробнее, что это означает и каким образом достигается? Просто я раньше сталкивался с изменением периода меандра при входе в прерывание таймера из основного цикла программы (там ещё кнопки обрабатывались). В обработчике прерывания переключался вывод и были ещё операторы сравнения. Разница от случая к случаю не была постоянной. А бороться с этим на 100% не получалось, хотя укорачивание числа команд в самом обработчике прерывания и увеличение тактовой частоты МК-ра помогало уменьшить разницу до приемлемой величины.