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

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Здравствуйте!
Понадобилось мне откалибровать встроенный 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.
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Karbofos, всё хорошо, только в каком диапазоне температур будет работать тинька? Если в достаточно широком, то частота уйдёт. Может прицепить на тиньку терморезистор, мерять температуру и корректировать OSCCAL? Ну, если уж надо вогнать в 1%. Кода добавится хрен да ни хрена.
Я всё-всё узнAю и стану профессором.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

При комнатной температуре далеко не убежит.
Зато, встроенный генератор можно перенастроить на какую-то другую частоту, отличной от предлагаемых по-умолчанию.
Например, F_CPU = 12000000
В т.ч. с использованием встроенных делителей на 2 и на 8.
Хотелось как-то автоматизировать этот процесссс.
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Карбофос, ты посмотри графики в даташите от температуры.
при тактовой 9,6 МГц 20 градусов дают изменение примерно 0,125 МГц.
это примерно 0,0625 МГЦ на 1 градус. что составит примерно 0,65% на 1 градус.
а температура в комнате может изменятся гораздо больше (лето/зима), чем на 1 градус.
так что, тебе калибровку придется делать чуть ли не ежедневно перед каждым использованием твоего устройства.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Погрел феном на 50гр.С тиньку, контрольная частота убежала с 4.8 до 4.88..4.89 МГц.
Ну и ладно.
Все равно, это лучше, чем с заводской предустановкой, вместо 9.6 получалось 9.0..9.1 МГц тактовой.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение dgrett »

НА 50С - это до 70С?
Ну, если устраивает - ура :)
Я всё-всё узнAю и стану профессором.
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

это что, с автоматической загрузкой константы для 9,6 реально получалось 9,0-9,1?
странно и непонятно ...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Да, это так.
Таймер отсчитывал вместо 15 минут ровно 16 минут.
Сейчас он-же отсчитывает 15 минут 2 секунды.
Ради этого все и затевалось. :))
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

так тинька с алишечки. У меня тиньки тикают на RC как швейцарские часы.
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="Карбофос",url="/forum/viewtopic.php?p=4106109#p4106109"]...
Таймер отсчитывал вместо 15 минут ровно 16 минут.
Сейчас он-же отсчитывает 15 минут 2 секунды.
Ради этого все и затевалось. :))[/uquote]
Есть большая вероятность некорректности составления алгоритма программы.
8)
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Вряд-ли.
Я так не думаю.
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А что это за мелкосхема "SMA7029"???
Явно ж не аттини13а...
:roll:
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Драйвер шагового двигателя. От лазерного принтера платка с драйвером и сам шаговик остались.
Для регенерирования ионообменной смолы от водного фильтра мешалку придумал.
На 3-х литровой банке на крышке моторчик, 15 сек перемешивает, 15 мин отдыхает!
И даже кнопочку специальную придумал, которая запускает процесс для визуального созерцания!
И светодиодик мигает, типа все ок.
:)) :)) :))
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Может не трогать OSCCAL. Типа
-программа выдачи на OC0A F_CPU/2 и её измерение внешним измерителем
-забить полученную частоту в основную программу отсчета интервалов.
Последний раз редактировалось akl Сб окт 16, 2021 07:01:58, всего редактировалось 2 раза.
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Карбофос, после окончания цикла
while(--pulses);
ты лишний раз увеличиваешь счетчик переполнений:
++ovf_count;
из-за этого у тебя и получается частота ниже, чем она и есть.
откуда и получилось, что с автоматической загрузкой константы для 9,6 реально получалось 9,0-9,1
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Нет, только по условию:

Код: Выделить всё

  // Check for overflow
  if(bit_is_set(TIFR0, _BV(TOV0))) {
    TIFR0 |= _BV(TOV0);
    ++ovf_count;
  }
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

да на хрен это твое условие нужно. оно только тебе вред приносит.
именно из-за этого условия ты насчитываешь лишнее число импульсов - еще лишних 256 импульсов прибавляешь в таймер0.
неужели ты думаешь константа для 9,6 МГц неправильно записана в МК? сильно ошибаешься ...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

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

И, в даташите ATtiny13a Factory Calibration имеет допуск +-10%, так-что заводская предустановка в него укладывается.
К тому-же, она при напряжении 3 вольта.
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

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

Вернуться в «AVR»