Обсуждаем контроллеры компании Atmel.
Ответить

Калибровка встроенного RC-генератора

Чт окт 14, 2021 23:59:56

Здравствуйте!
Понадобилось мне откалибровать встроенный 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.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 08:19:10

Karbofos, всё хорошо, только в каком диапазоне температур будет работать тинька? Если в достаточно широком, то частота уйдёт. Может прицепить на тиньку терморезистор, мерять температуру и корректировать OSCCAL? Ну, если уж надо вогнать в 1%. Кода добавится хрен да ни хрена.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 09:56:34

При комнатной температуре далеко не убежит.
Зато, встроенный генератор можно перенастроить на какую-то другую частоту, отличной от предлагаемых по-умолчанию.
Например, F_CPU = 12000000
В т.ч. с использованием встроенных делителей на 2 и на 8.
Хотелось как-то автоматизировать этот процесссс.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 11:21:21

Карбофос, ты посмотри графики в даташите от температуры.
при тактовой 9,6 МГц 20 градусов дают изменение примерно 0,125 МГц.
это примерно 0,0625 МГЦ на 1 градус. что составит примерно 0,65% на 1 градус.
а температура в комнате может изменятся гораздо больше (лето/зима), чем на 1 градус.
так что, тебе калибровку придется делать чуть ли не ежедневно перед каждым использованием твоего устройства.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 11:37:16

Погрел феном на 50гр.С тиньку, контрольная частота убежала с 4.8 до 4.88..4.89 МГц.
Ну и ладно.
Все равно, это лучше, чем с заводской предустановкой, вместо 9.6 получалось 9.0..9.1 МГц тактовой.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 12:25:53

Дыкс....
тинька 13я по умолчанию имеет два режима работы RC генератора - 9,6 и 4,8 МГц
Для обеих режимов имеется заводская калибровочная константа.
Разница только в том, что для 9,6 загрузка автоматическая, а для 4,8 надо ручками ее вытряхнуть из ПЗУ и вставить в OSCCAL...
Чего еще добавлять - то для "бытовых приложений"?
:dont_know:

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 12:27:56

НА 50С - это до 70С?
Ну, если устраивает - ура :)

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 12:43:04

это что, с автоматической загрузкой константы для 9,6 реально получалось 9,0-9,1?
странно и непонятно ...

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 12:48:25

Да, это так.
Таймер отсчитывал вместо 15 минут ровно 16 минут.
Сейчас он-же отсчитывает 15 минут 2 секунды.
Ради этого все и затевалось. :))

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 13:10:34

так тинька с алишечки. У меня тиньки тикают на RC как швейцарские часы.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 14:10:07

...
Таймер отсчитывал вместо 15 минут ровно 16 минут.
Сейчас он-же отсчитывает 15 минут 2 секунды.
Ради этого все и затевалось. :))

Есть большая вероятность некорректности составления алгоритма программы.
8)

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 14:23:40

Вряд-ли.
Я так не думаю.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 15:01:27

А что это за мелкосхема "SMA7029"???
Явно ж не аттини13а...
:roll:

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 15:36:50

Драйвер шагового двигателя. От лазерного принтера платка с драйвером и сам шаговик остались.
Для регенерирования ионообменной смолы от водного фильтра мешалку придумал.
На 3-х литровой банке на крышке моторчик, 15 сек перемешивает, 15 мин отдыхает!
И даже кнопочку специальную придумал, которая запускает процесс для визуального созерцания!
И светодиодик мигает, типа все ок.
:)) :)) :))

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 16:29:48

Может не трогать OSCCAL. Типа
-программа выдачи на OC0A F_CPU/2 и её измерение внешним измерителем
-забить полученную частоту в основную программу отсчета интервалов.
Последний раз редактировалось akl Сб окт 16, 2021 07:01:58, всего редактировалось 2 раз(а).

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 16:35:12

Карбофос, после окончания цикла
while(--pulses);
ты лишний раз увеличиваешь счетчик переполнений:
++ovf_count;
из-за этого у тебя и получается частота ниже, чем она и есть.
откуда и получилось, что с автоматической загрузкой константы для 9,6 реально получалось 9,0-9,1

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 16:40:46

Нет, только по условию:
Код:
  // Check for overflow
  if(bit_is_set(TIFR0, _BV(TOV0))) {
    TIFR0 |= _BV(TOV0);
    ++ovf_count;
  }

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 16:47:02

да на хрен это твое условие нужно. оно только тебе вред приносит.
именно из-за этого условия ты насчитываешь лишнее число импульсов - еще лишних 256 импульсов прибавляешь в таймер0.
неужели ты думаешь константа для 9,6 МГц неправильно записана в МК? сильно ошибаешься ...

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 16:50:13

Этот алгоритм взят из AVR053, страница 10.
Контроль настроенного осциллятора через OCR0A F_CPU/2 - там ровно 4.8 МГц после настройки.
Как, и 4.5 МГц с заводской настройкой.

И, в даташите ATtiny13a Factory Calibration имеет допуск +-10%, так-что заводская предустановка в него укладывается.
К тому-же, она при напряжении 3 вольта.

Re: Калибровка встроенного RC-генератора

Пт окт 15, 2021 18:04:16

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

Добавлено after 14 minutes 41 second:
если для ATtiny13A это +/-10%, то твои 9,0-9,1 вполне попадают в этот диапазон.
так что зря на тебя наезжали, что большая ошибка к номиналу.
Ответить