您好、论坛、
我正在尝试设置 TMS320F28027 C2000微控制器作为 RTC、以用于芯片上的其他功能。 我连接了一个晶体、并设置 Timer2以使用晶体。 它似乎可以工作、但我没有得到我所寻求的精度。
它使用一个应该为15ppm 的12MHz 晶振、我使用公式 C = 2 (CL -杂散)计算出负载电容为6pF、假设 Csray 为5pF、CL 为8pF。
该计时器具有11999预分频器、这意味着计时器应每1ms *周期进行一次计数、这意味着计时器应每秒触发一次、这只会向32位数字添加1。 20小时后、似乎是20秒的超时、即0.0556%或556ppm、甚至不接近于预期的15ppm!
这是我第一次在我的设计中实现晶体、因此我不是100%确定我的操作是否正确、也不是我应该能够期望的精度。 我还应该提到的 是、它由3.3V 降压稳压器断电、并且连接了 JTAG 调试器。 我不确定这是否会发生任何变化、比如调试器是否提供一个覆盖任何晶体的时钟?
无论如何、对于我为什么没有获得所需的精度、或者我的期望是不真实的、我是否有任何想法或建议、我应该只获得一个专用的时钟芯片? 如果可能的话、我更希望没有单独的芯片。
电容器: https://www.digikey.ca/product-detail/en/tdk-corporation/C1608C0G1H060D080AA/445-5037-1-ND/2093652
(相关)电路板布局:
代码:
uint32_t clock_period = 1000;//in ms uint32_t clock_time_s = 0;//in s uint32_t clock_time_s_offset = 0; void initClockTimer() { myTimer2 = timer_init (void *) TIMER2_base_ADDR、(size_t) initTimer2 = mySystem_initTimer_initr (void *)、init_init_initrupts (sit_init_init_init_intsitr); (intVec_t)时钟中断(&clockInterrupt); EDIS; Timer_stop (myTimer2); CLK_setTimer2Src (myClk、CLK_Timer2Src_ExtOsc); Timer_setPeriod (myTimer2、clock_period); Timer_setPreScaler (myTimer2、11999); timer_reload (myTimer2); Timer_setEmulationMode (myTimer2、timer_EmulationMode_runfree); timer_enableInt (myTimer2); timer_start (myTimer2); cpu_enableInt (myCpu、 CPU_IntNumber_14); Clock_setPosixTime (1447459200); } void Clock_setPosixTime (uint32_t) { clock_time_s_offset = t - clock_time_s; } #pragma CODE_SECTION ( GPIO 中断、"ramfuncs");_中断 void void Interrupt (void)(void clock_time_time_s;}#pragma CODE_SECTION (void )+、"ramfock_time_siptog+)