From b8fac32aed712a3e0e87cea99b9c6d5ef5e12d2b Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期五, 07 三月 2025 18:02:15 +0800 Subject: [PATCH] 现在单个测距完成,然后3s测一次距功能实现 --- keil/include/drivers/mk_calib.c | 77 ++++++++++++++++++++++++++++++++++---- 1 files changed, 69 insertions(+), 8 deletions(-) diff --git a/keil/include/drivers/mk_calib.c b/keil/include/drivers/mk_calib.c index f4eebfd..8db2199 100644 --- a/keil/include/drivers/mk_calib.c +++ b/keil/include/drivers/mk_calib.c @@ -79,9 +79,9 @@ uint32_t val; // load cap - if (board_param.flag & (1 << BOARD_LOAD_CAP)) + if (board_param.flag & (1 << BOARD_X38M4_LOAD_CAP)) { - calib_xtal38m4_load_cap_set(board_param.load_cap); + calib_xtal38m4_load_cap_set(board_param.x38m4_load_cap); } if (board_param.flag & (1 << BOARD_X32K_LOAD_CAP)) { @@ -166,7 +166,7 @@ // REG_WRITE(0x4000020c, val | (0x18 << 7)); #if (LOW_POWER_EN) && (XTAL32K_EN == 0) - rco32k_clk_calibrate(RCO32K_MEAS_TIME_64_CYCLES); + clk32k_ppm_calibrate(CLK32K_MEAS_TIME_64_CYCLES); #endif } @@ -190,7 +190,68 @@ tmp_val &= ~0x7FU; tmp_val |= (val & 0x7FU); REG_WRITE(0x40000048, tmp_val); - LOG_INFO(TRACE_NO_REPORT_HOST | TRACE_MODULE_DRIVER, "XTAL load cap tune %d : %d\r\n", ppm, (tmp_val & 0x7FU)); + LOG_INFO(TRACE_NO_REPORT_HOST | TRACE_MODULE_DRIVER, "X38M4 load cap tune %d : %d\r\n", ppm, (tmp_val & 0x7FU)); +} + +void calib_xtal38m4_load_cap_auto_tune_to_center(int32_t ppm, uint8_t calib_load_cap) +{ + // unit is 0.01pm, the value 478 is the frequency offset that the loadcap value from 0 to 1 + int32_t load_cap_ppm_offset[128] = {0, 478, 465, 449, 441, 421, 410, 398, 379, 374, 365, 353, 350, 333, 328, 315, 320, 300, 292, 285, 282, 271, + 265, 257, 249, 245, 241, 235, 234, 225, 220, 215, 249, 205, 200, 197, 195, 189, 185, 180, 175, 174, 171, 166, + 167, 161, 157, 155, 157, 148, 147, 143, 143, 138, 137, 133, 130, 130, 127, 125, 126, 121, 120, 116, 182, 112, + 111, 110, 108, 106, 105, 102, 98, 100, 97, 97, 96, 95, 92, 91, 92, 88, 87, 86, 86, 83, 83, 81, + 78, 80, 78, 77, 77, 75, 75, 73, 85, 71, 71, 70, 70, 67, 67, 66, 65, 65, 63, 63, 63, 61, + 61, 60, 61, 60, 57, 58, 57, 56, 56, 55, 53, 53, 53, 53, 52, 52, 51, 50}; + uint8_t load_cap_value = 0; + if (ppm >= 0) + { + for (uint8_t ii = calib_load_cap; ii < 127; ii++) + { + if (ppm > load_cap_ppm_offset[ii + 1]) + { + ppm -= load_cap_ppm_offset[ii + 1]; + } + else if (ppm > (load_cap_ppm_offset[ii + 1] / 2)) + { + ppm -= load_cap_ppm_offset[ii + 1]; + load_cap_value = ii + 1; + break; + } + else + { + load_cap_value = ii; + break; + } + } + } + else + { + ppm = ABS(ppm); + for (uint8_t ii = calib_load_cap; ii > 0; ii--) + { + if (ppm > load_cap_ppm_offset[ii]) + { + ppm -= load_cap_ppm_offset[ii]; + } + else if (ppm > (load_cap_ppm_offset[ii] / 2)) + { + load_cap_value = ii; + break; + } + else + { + ppm -= load_cap_ppm_offset[ii]; + load_cap_value = ii - 1; + break; + } + } + } + + uint8_t load_cap_current = REG_READ(0x40000048) & 0x7FU; + if (load_cap_current != load_cap_value) + { + calib_xtal38m4_load_cap_set(load_cap_value); + } } void calib_xtal38m4_load_cap_set(uint8_t val) @@ -201,7 +262,7 @@ val &= 0x7FU; REG_WRITE(0x40000048, tmp_val | val); - LOG_INFO(TRACE_MODULE_DRIVER, "XTAL load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU); + LOG_INFO(TRACE_MODULE_DRIVER, "X38M4 load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU); } void calib_xtal38m4_with_clock_out(uint8_t val) @@ -220,7 +281,7 @@ REG_WRITE(0x40000048, tmp_val | val); REG_WRITE(0x40000104, 0x3FFF); - LOG_INFO(TRACE_MODULE_DRIVER, "XTAL load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU); + LOG_INFO(TRACE_MODULE_DRIVER, "X38M4 load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU); } void calib_xtal32k_load_cap_set(uint8_t val) @@ -231,7 +292,7 @@ val &= 0x7FU; REG_WRITE(0x4000004C, tmp_val | val); - LOG_INFO(TRACE_MODULE_DRIVER, "32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU); + LOG_INFO(TRACE_MODULE_DRIVER, "X32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU); } void calib_xtal32k_with_clock_out(uint8_t val) @@ -254,7 +315,7 @@ val &= 0x7FU; REG_WRITE(0x4000004C, tmp_val | val); - LOG_INFO(TRACE_MODULE_DRIVER, "32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU); + LOG_INFO(TRACE_MODULE_DRIVER, "X32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU); } void CALIB_IRQHandler(void) -- Gitblit v1.9.3