Здравствуйте! Понадобилось мне откалибровать встроенный RC-генератор ATtiny13a. Просмотрев AVR053, и исходники из iNET, пошел своим путем. Как это работает: запускаем таймер 0 на частоте контроллера без предделителя, и считаем кол-во его отсчетов за определенное кол-во периодов эталонной частоты. Делаем это с разными перебираемыми значениями OSCCAL. Выбираем то значение OSCCAL, при котором разница между этими измеренными и теоретически расчитанным будет минимальной. По окончании работы алгоритма, лучшее значение OSCCAL записывается в 0 ячейку EEPROM: eeprom_write_byte((uint8_t*) 0, best_osc); Далее это значение можно прочитать через - make readeeprom или в начало своего кода вставить uint8_t new_osc = eeprom_read_byte((uint8_t*)0); if(new_osc <= 0x7F) OSCCAL = new_osc; Естественно, FUSE EESAVE должен быть запрограммирован. Так-же, для контроля, по окончании работы алгоритма, на выходе OCR0A генерируется меандр с частотой F_CPU/2. За эталонную частоту принял выход 32 кГц китайского модуля DS3231, т.к. он у меня есть, и для его работы достаточно лишь подать питание на этот модуль. В исходном тексте это выглядит так: - тактовая частота контроллера, как и тип контроллера, определены в makefile MCU = attiny13a F_CPU = 9600000 - эталонная частота #define CCLOCK 32768 - куда подавать эталонную частоту #define FREQ_DDR DDRB #define FREQ_PORT PORTB #define FREQ_PIN PINB #define FREQ_BIT 2 - кол-во периодов эталонной частоты для подсчета #define CCYCLES 40 - теоретически расчитанное кол-во тиков (оно не должно превышать 65535, т.к. используетя 2 байта) #define CTARGET ((F_CPU*CCYCLES+CCLOCK/2)/CCLOCK) - искать OSCCAL будем в окрестностях его значений 1%(~15 сек): #define CDEVIATION ((CTARGET + 50) / 100) // 1% - если в 1% нигде не попали, тогда программа уйдет в бесконечный цикл while(new_osc > MAX_OSCCAL); // error - тогда можно увеличить погрешность поиска - при удачном исходе, на пин OCR0A выдается меандр F_CPU/2 для контроля. Функция int16_t Deviation(uint8_t osccal) возвращает разницу между измеренным и теор значениями отсчетов. После записи каждого нового значения OSCCAL делается пауза 100 мсек для устаканивания генератора. Функция uint8_t BestDevNearest(uint8_t nearosc) выбирает наилучшее значение из ближайших -+7 значений OSCCAL.
Не знаю, кому это может понадобиться. Собирается через make в avr-gcc.
Karbofos, всё хорошо, только в каком диапазоне температур будет работать тинька? Если в достаточно широком, то частота уйдёт. Может прицепить на тиньку терморезистор, мерять температуру и корректировать OSCCAL? Ну, если уж надо вогнать в 1%. Кода добавится хрен да ни хрена.
_________________ Я всё-всё узнAю и стану профессором.
При комнатной температуре далеко не убежит. Зато, встроенный генератор можно перенастроить на какую-то другую частоту, отличной от предлагаемых по-умолчанию. Например, F_CPU = 12000000 В т.ч. с использованием встроенных делителей на 2 и на 8. Хотелось как-то автоматизировать этот процесссс.
Карбофос, ты посмотри графики в даташите от температуры. при тактовой 9,6 МГц 20 градусов дают изменение примерно 0,125 МГц. это примерно 0,0625 МГЦ на 1 градус. что составит примерно 0,65% на 1 градус. а температура в комнате может изменятся гораздо больше (лето/зима), чем на 1 градус. так что, тебе калибровку придется делать чуть ли не ежедневно перед каждым использованием твоего устройства.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Погрел феном на 50гр.С тиньку, контрольная частота убежала с 4.8 до 4.88..4.89 МГц. Ну и ладно. Все равно, это лучше, чем с заводской предустановкой, вместо 9.6 получалось 9.0..9.1 МГц тактовой.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Дыкс.... тинька 13я по умолчанию имеет два режима работы RC генератора - 9,6 и 4,8 МГц Для обеих режимов имеется заводская калибровочная константа. Разница только в том, что для 9,6 загрузка автоматическая, а для 4,8 надо ручками ее вытряхнуть из ПЗУ и вставить в OSCCAL... Чего еще добавлять - то для "бытовых приложений"?
Драйвер шагового двигателя. От лазерного принтера платка с драйвером и сам шаговик остались. Для регенерирования ионообменной смолы от водного фильтра мешалку придумал. На 3-х литровой банке на крышке моторчик, 15 сек перемешивает, 15 мин отдыхает! И даже кнопочку специальную придумал, которая запускает процесс для визуального созерцания! И светодиодик мигает, типа все ок.
Может не трогать OSCCAL. Типа -программа выдачи на OC0A F_CPU/2 и её измерение внешним измерителем -забить полученную частоту в основную программу отсчета интервалов.
Последний раз редактировалось akl Сб окт 16, 2021 07:01:58, всего редактировалось 2 раз(а).
Карбофос, после окончания цикла while(--pulses); ты лишний раз увеличиваешь счетчик переполнений: ++ovf_count; из-за этого у тебя и получается частота ниже, чем она и есть. откуда и получилось, что с автоматической загрузкой константы для 9,6 реально получалось 9,0-9,1
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
да на хрен это твое условие нужно. оно только тебе вред приносит. именно из-за этого условия ты насчитываешь лишнее число импульсов - еще лишних 256 импульсов прибавляешь в таймер0. неужели ты думаешь константа для 9,6 МГц неправильно записана в МК? сильно ошибаешься ...
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Этот алгоритм взят из AVR053, страница 10. Контроль настроенного осциллятора через OCR0A F_CPU/2 - там ровно 4.8 МГц после настройки. Как, и 4.5 МГц с заводской настройкой.
И, в даташите ATtiny13a Factory Calibration имеет допуск +-10%, так-что заводская предустановка в него укладывается. К тому-же, она при напряжении 3 вольта.
да, я был не прав. в самом деле, если при остановке таймера0 он достиг переполнения, то нужно увеличить счетчик.
Добавлено after 14 minutes 41 second: если для ATtiny13A это +/-10%, то твои 9,0-9,1 вполне попадают в этот диапазон. так что зря на тебя наезжали, что большая ошибка к номиналу.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения