Если нужно каждые 72 такта обновлять ARR таймера...
А откуда взялись 72 такта? Синтезировать фиксированную частоту - нет никаких проблем. Проблема создать СЕТКУ частот. То есть нужно считать каждое следующее переполнение таймера. А это - деление с нахождением остатка. И совершенно не факт, что времени на это хватит. Зависит от синтезируемой частоты.
Нудануда, разгоняешь-разгоняешь, а на выходе все в почти полсотни раз медленнее... Намекаю, в PIC18FxxQ43 частота накачки NCO может быть 64 МГц, то есть от осциллятора МК. Там смешно о джиттере вообще говорить. Не всякий анализатор спектра покажет такой джиттер.
Синтезировать фиксированную частоту - нет никаких проблем. Проблема создать СЕТКУ частот. То есть нужно считать каждое следующее переполнение таймера. А это - деление с нахождением остатка. И совершенно не факт, что времени на это хватит. Зависит от синтезируемой частоты.
Допустим хочется 9750 Гц меандр, тогда нужно инвертить выход таймера каждые 72M / 9750 / 2 = 3692.3076 такта. 3692 - это базовое значение для ARR, а 0.3076 переводится в число с фиксированной точкой и на каждой итерации суммируется, затем целая часть прибавляется к 3692 . Учитывая, что в цикле рассчитываются сразу сотня значений и все константы из памяти загрузятся в регистры всего один раз, я бы ожидал тактов 10 на итерацию.
Ну, что я могу сказать, на осциллографе видно, DM90A показывает процент заполнения 51,6% - не чистый меандр. Одним словом 1МГц мало. Фотки надо? Могу выложить, но только завтра.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Таймер должен работать в режиме Toggle и сам при переполнении дергать пином, а в прерывании, раз уж ты с ним пока сделал, нужно периодически корректировать значение ARR причем опять же в момент переполнения, для чего нужно включить для ARR буферизацию. 72M / 480404 / 2 = 74.9369, суммируя дробную часть и периодически прибавляя единичку у тебя должно получаться 74 или 75, т.е. период таймера будет постоянно слегка меняться. Примерно 15-16 полупериодов частота будет 486486 Hz, потом один полупериод - 480000 Hz, в среднем это должно давать твои 480404. Если нацело не делится, то джиттер будет в любом случае, но чем больше частота таймера, тем он меньше, а больше она точно не на пиках Можно, конечно, еще взять STM32 с HRTIM, есть у некоторых F3/G4, он ведет себя так будто работает на частоте 5.44 GHz
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Таймер должен работать в режиме Toggle и сам при переполнении дергать пином
Вот если бы таймер смог работать в режиме сумматора, а не в режиме счетчика, и при переполнении дергать пином - вот тогда да.
Reflector писал(а):
72M / 480404 / 2 = 74.9369, суммируя дробную часть и периодически прибавляя единичку у тебя должно получаться 74 или 75
Вот только в какой момент времени эту единичку прибавлять я так и не смог рассчитать, на разных частотах по разному. Я пытался на Атмега168 на двух таймерах в режиме Toggle, с одного на другой подавал, весь ексель в табличках изрисовал, но делитель он и есть делитель. Не получите вы частоты с шагом, допустим 10Гц.
В данном примере у меня получается шаг 7,629394531Гц, 2^16, 2 часа ночи было, думаю без ущерба коду можно 2^24 получить, я не пробовал. Можно путем изменения частоты таймера подогнать что бы ровно было на 2^16 7Гц. Жалко DAC нет, придется пошимить малость, синусоиду получить охота, таблицу на килобайт в оперативке, и опустить частоту таймера, что бы ровно шаг 5Гц был, чисто ради эксперимента.
Reflector писал(а):
то джиттер будет в любом случае, но чем больше частота таймера, тем он меньше,
Джиттер наблюдается на любом частотном участке, вот это число 62967 (480404Гц) не делится нацело, на некоторых частотах джиттер половину импульса занимает, я весь диапазон не исследовал, так по диагонали прошелся.
[Вот если бы таймер смог работать в режиме сумматора, а не в режиме счетчика, и при переполнении дергать пином - вот тогда да.
Это полезно только для меандра, для табличной синусоиды все равно придется или DMA использовать, тогда суммировать и самому можно, или медленные прерывания.
Цитата:
Вот только в какой момент времени эту единичку прибавлять я так и не смог рассчитать, на разных частотах по разному.
Что там рассчитывать? В качестве начального значения дробной части можно 0.5 взять, первый раз добавляешь 0.9369, получаешь 1.4369, значит единичку добавляем, остается 0.4369. В следующий раз будет 0.4369 + 0.9369 = 1.3738, снова добавляем...
Цитата:
Джиттер наблюдается на любом частотном участке, вот это число 62967 (480404Гц) не делится нацело, на некоторых частотах джиттер половину импульса занимает, я весь диапазон не исследовал, так по диагонали прошелся.
Чтобы получить 500KHz нужно 72MHz / 72, а если хочется чуть меньше, то можно разве что 72МHz / 73, но это уже сразу 493'150 Hz. NCO тут не поможет, даже с таймером на 5.44 GHz будет шаг 100 Hz... А если генерить синусоиду, то для любого дробного значения можно получить достаточно точное значение синуса именно в данной точке, там все упирается в величину таблиц или разрядность DAC/ШИМа.
TIM14 выход ШИМ - типа ЦАП. TIM1 - таймер синхронизации выборок. tab - таблица сигнала, df - приращение фазы В железе не проверил,оптимизацию не включал,всего 30 АСМ команд. Задавая частоту работы TIM1 можно определить максимальную скорость загрузки.
С чего же начать, начнем с Чена. oleg110592, я сравнивал звучание wav файла с ШИМ и DAC на слух разница ощутима. У меня есть F100 с DAC, но гонится всего до 56МГц. Как бы мы не старались, как бы мы не хотели, с DMA без DMA, мы даже близко не приблизимся к накачке сумматора хотя бы 16МГц, увы программно есть программно, а аппаратный модуль есть аппаратный модуль.
КРАМ писал(а):
Намекаю, в PIC18FxxQ43 частота накачки NCO может быть 64 МГц, то есть от осциллятора МК. Там смешно о джиттере вообще говорить. Не всякий анализатор спектра покажет такой джиттер.
Sergi, оставим цикл while пользователю, иначе тут метод "конечных автоматов" придется реализовывать.
Reflector писал(а):
Чтобы получить 500KHz нужно 72MHz / 72, а если хочется чуть меньше, то можно разве что 72МHz / 73, но это уже сразу 493'150 Hz. NCO тут не поможет, даже с таймером на 5.44 GHz будет шаг 100 Hz
Я бы так не согласился, вот табличка: зависимость разрядности сумматора от частоты накачки таймераСпойлер Это единица, шаг сумматора. Смотрите формулу NCO модуля PIC. В таблице представлены значения поделенные на 2, как для выходной частоты "меандр" моего примера на stm32f030
Еще раз... На входе 16MHz, нужно получить при помощи NCO 500KHz, следовательно сумматор должен переполняться каждый 16 тактов и получим 16M / 16 = 1MHz. А чтобы получить переполнение сумматора каждые 16 тактов нужно прибавлять 65536: 16М / (2**20 / 65536) = 1MHz. Теперь если поменять 65536 на 65537, то получим 1000015.26 Hz, т.е. шаг в 15 Hz о котором пишет сам Microchip. Но это все в среднем, невозможно 16М поделить на (2**20 / 65537) = 15.9998, делить все равно придется на 16 или 15, потому с NCO будет ровно то же самое, что и без него: 16М / int(2**20 / 65537) = 1066666.7 Hz. Джитер будет одинаковый, а стабильность частоты на большом интервале будет выше на STM32, потому что там я могу для дробной части выделить 32 бита и увеличить точность на 3 порядка.
Ошибка будет всегда, но она напрямую зависит от тика таймера (тик сумматора). В проекте на Атмега168 тактовая 16Мгц сумматор качается 200кГц (я прерывание на asm переписал) на частоте 9512 ошибка составляла то 50мкс то 56мкс, один тик таймера 6,25мкс, я же писал про это. Я считаю чем этот тик меньше тем и ошибка будет меньше.
Кому интересно, картинки для сравненияСпойлерstm32f030 72МГц 1МГц
Превел как пример. Максимальная частота выборки из таблицы на STM вряд ли сильно превысит 2 МГц при тактовой 64-72. И это без обработки кнопок и проч. На AVR с работой в прерывании была частота выборки 500 кГц при тактовой 19,5 , но и таблица покороче.
Таблицу синуса не привожу, картинок то же не будет. Вменяемый синус получается где-то до 25кГц, замена таблицы на 1024 отсчетов результата не дала, те же до 25кГц. Может разрешение 8 бит ШИМ мало.
Sergi писал(а):
Максимальная частота выборки из таблицы на STM вряд ли сильно превысит 2 МГц при тактовой 64-72.
Для синуса в этом точно нет смысла.
Reflector, а для генерации меандра пошел бы вот такой вариантСпойлер
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения