Собственно вопрос, как выводить импульсы нужной частоты ? Как я понимаю ШИМ регистр использовать не получится, его частота определяется только делителем ШИМ.
А выводить PORTx.x = 1; delay_ms (period); PORTx.x = 0; - не очень красивый вариант. Да и будут моменты, когда период будет плавать из-за возникновения прерывания. Хотя, на тех частотах (у меня на входе от 6Гц до 100Гц, коэффициент умножения от 0,1 до 5, т.е. на выходе не более 500Гц) плавание периодна +- с десяток микросекунд совершенно не критичен.
А вопрос в том, как реализовать это красиво? правильно...
Ser60, у меги8 разве есть такой аппаратный режим? Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать. при таймере 1мс - период генерируемого сигнала будет кратен 1мс.
А чем CTC режим совместно с Toggle on Compare Match не угодил? Как раз меандр будет. Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Извиняюсь, что пространно выразился, но я имел в виду именно CTC режим как описал выше Kavka. ТС вместо измерения входной частоты следует измерять ее период, затем делить его на множитель и полученную величину использовать для вычисления полупериода генерируемой частоты таймером. Конечно, из-за ошибок оккругления при делении изменять генерируемую частоту можно будет только с некоторым дискретом.
А где можно прочитать статеечку про конфигурирование СТС ? Меня немного в тупик поставили overflow interrupt, compare interrupt, timer value, compare...
Ничего сложного. Алгоритм основан на предположении, что множитель может быть представлен простой дробью, в числителе (N) и знаменателе (M) которого стоят целые числа. Для Вашего случая при множителе 0,1 (10/1 для периода, т.е. N=10, M=1) отсчитываются 10 входных периодов, а на выходе должен сформироваться 1 выходной период. Для множителя 5 (1/5 для периода, т.е. N=1, M=5)на каждый входной период формируется 5 выходных периодов. Для реализации этого алгоритма задействован Т1 с использованием прерываний захвата, переполнения и сравнения. Прерывания переполнения Т0 просто формируют импульс на выходе схемы. Замечу, Т1 запускается один раз и далее никогда не останавливается. Т0 запускается вначале формирования выходного импульса и при переполнении формирует конец импульса. Из вышеописанного Вы самостоятельно можете сформировать меандр.
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // Interrupt on any change on pins PCINT0-5: Off GIMSK=0x40; MCUCR=0x02; GIFR=0x40;
а как должен работать ваш код? я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.
Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать
Как вариант, контролировать текущий массив входных измерений. Только нужно учесть скорость изменения входной частоты... Это традиционная сигнальная задача фильтрации...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения