Калибриране на INTOSC
в PIC12F629 и PIC12F675
/kn34pc.com/конструкции/...
За
непрецизни времеви отчети и функции мокроконтролерът PIC12F675/PIC12F629
разполага и с вътрешен RC генератор (INTOSC Internal Oscillator), който е
фабрично калибриран до ±1% (UDD = 3.5V, 25°C). За точността отговаря
последната клетка от флаш-паметта с адрес 0x3FF, където е записан
калибрационен коефициент.
За конкретния мой екземпляр PIC12F675:
адрес 0x3FF -> калибрационен коефициент 0x344C.
Старшия байт винаги е 0x34.
При старт потребителската програма прочита съдържанието на клетката с адрес
0x3FF и със стойността й (младшия байт) зарежда регистър OSCCAL (Oscillator
Calibration Register) с адрес 0x90 (в случая: OSCCAL = 0x4C), с което се коригира
честотата на вътрешния клок. Стъпките на изменение са 64 [b7:b2] (двата
най-младши бита не участват).
За
конкретния PIC12F675 максималното изменение на
честотата, което измерих на
CLKOUT е:
При +UDD = 5V:
OSCCAL = 0x3400 -> Fintosc/4 = 815551 Hz
...
OSCCAL = 0x344C -> Fintosc/4 = 978338 Hz, factory calibrated
...
OSCCAL = 0x34FC -> Fintosc/4 = 1307916 Hz
Професионалните типове програматори (напр. PICKIT2/3), както и софтуерът им
за поддръжка, предотвратяват случайното изтриване/модифициране на
съдържанието на последната клетка, a някои типове поддържат автоматичното
възстановяване на калибровъчния коефициент (PICKIT2).
В любителска среда, както често се случва, при невнимателно боравене при
запис (и напр. с програматори тип JDM и с всевъзможния им софтуер за поддръжка)
последната клетка от флаш-паметта бива затрита/променена, с което честотата
се променя непредвидимо, с всички негативи за последващите събития от това
изменение. Затова колеги
съветват да се запише/архивира стойността на клетката някъде, преди каквато
и да е манипулация с PIC12F629
/ PIC12F675.
В миналото на първият ми използван МК PIC12F675 бях затрил последната клетка
памет точно поради посочените причини. Следващите микроконтролери от този
тип в кутийката вече си имат добавено листче хартийка с прилежно записана
константа за евентуално бъдещо възстановяване
.
Въпросната
конструкция може да се използва за контрол и възстановяване на вече изгубен калибрационен коефициент, като предвид съществуването на многобройни подобни
конструкции в интернет, целта ми е по-скоро да си изясня някои моменти от
процесите за себе си. Използвам CCS за PIC.
pic12f6xx_osccal.zip [c,h,hex][3kb]
Два бутона управляват вътрешния генератор: FOSC- и FOSC+. За контрол на генераторната честота използвам изход CLKOUT (pin 3/GP4), като FCLKOUT = FOSC/4. Необходим е външен честотомер. Стъпката на изменение на честотата е голяма (64 стъпки: dF = 7..9 kHz), затова прецизността на показанията на честотомера не e определяща.
След получаване на максимално близко показание на честотата до 1000000 Hz, е необходимо да се натиснат двата бутона едновременно. OSCCAL се записва в нулевата клетка на EEPROM (адрес 0x00). Към нея да се добави 0x34. Напр. получено: 0x58 -> 0x3458, ръчен запис в последната клетка във флаш-паметта или за напр. PICKIT3 програматор и софтуер към него Tools -> ОSCCAL -> Set Manually -> OSCCAL value 3458 (hex).
Генераторната честота зависи от температурата и от приложеното захранващо
напрежение. За конкретни приложения би било добре калибрирането да се
извършва на работното напрежение (напр. UDD = 5V).
Свързването на схемата може да се изпълни и на експериментална платка, като
монтажът дори върху пластмасовия breadboard е приложим. Така за операцията
по калибрирането са необходими примерно 5 мин. Да не се пропуска свързване
на филтриращ кондензатор 100..470 nF, разположен максимално близко до
захранващите изводи (1 и 8) на микроконтролера!
Полезни препратки:
1.
PIC12F629/675 Data Sheet, Microchip [pdf][1,4mb]
2.
12F675 OSCCAL Calibration
3.
Internal Oscillator Recalibration Utility for PIC 12F629 & 12F675
LZ2WSG, KN34PC
1 януари 2023 година