feat(FOC): 添加速度目标突变检测和积分清零机制
- 在velocity_control()函数中添加目标速度突变检测,当速度变化 超过5.0f时自动清零积分项 - 在angle_control_with_velocity_limit()函数中添加相同的速度 突变检测逻辑 - 在MIT_Mode()函数中实现速度环积分清零功能 - 添加reset_integral()方法到PID控制器用于清零积分项 refactor(Filter): 将角度卡尔曼滤波器替换为α-β观测器 - 重构EncoderAngleKalman类,将内部卡尔曼滤波器改为α-β观 测器算法 - 保留原有的接口名称和参数以维持兼容性 - 添加ANGLE_OBSERVER_ALPHA和ANGLE_OBSERVER_BETA配置参数 - 修改速度获取逻辑,直接从观测器状态获取速度估计值 perf(systick): 实现基于DWT的CPU使用率监测 - 使用DWT周期计数器精确测量任务执行周期 - 添加busy_task_enter()和busy_task_exit()函数追踪忙碌周期 - 实现每秒统计CPU占用率并提供get_cpu_usage()接口 - 在CAN数据包中添加CPU使用率传输字段 fix(Can): 修复CANFD数据包中的整数打包问题 - 将16位整数正确拆分为两个字节进行传输 - 修正了test_u16数据的字节序打包方式 chore(config): 更新软件版本号并优化配置参数 - 将版本号从26.4.26更新到26.5.17 - 调整角度/速度α-β观测器的相关增益参数
This commit is contained in:
@@ -50,9 +50,43 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
volatile static uint32_t delay;
|
||||
volatile static uint32_t systick_ms = 0; // 系统运行时间(毫秒)
|
||||
|
||||
// ============================================================================
|
||||
// DWT-based CPU usage measurement
|
||||
// ============================================================================
|
||||
// GD32C103 = Cortex-M4 @ 120MHz, DWT_CYCCNT 可用
|
||||
//
|
||||
// 原理:
|
||||
// do_task() 入口记录 CYCCNT → task_enter_cyccnt
|
||||
// do_task() 出口记录 CYCCNT → 差值 = 本次忙碌周期
|
||||
// 累加到 busy_cycles_accum
|
||||
// SysTick 每 1s 统计:cpu% = busy_cycles_accum * 100 / SystemCoreClock
|
||||
//
|
||||
// 不需要 idle_task_count(),DWT 直接数周期
|
||||
// ============================================================================
|
||||
|
||||
volatile static uint32_t task_enter_cyccnt = 0; // do_task 入口 CYCCNT
|
||||
volatile static uint32_t busy_cycles_accum = 0; // 1s 内累计忙碌周期
|
||||
volatile static uint16_t sample_seconds = 0; // 统计窗口(秒)
|
||||
volatile static uint8_t cpu_usage = 0; // CPU 使用率(0~100%)
|
||||
volatile static uint8_t dwt_initialized = 0; // DWT 初始化标志
|
||||
extern CAN_transmiter CAN0_transmiter;
|
||||
extern FlashEEPROM flashEEP;
|
||||
|
||||
/*!
|
||||
\brief 初始化 DWT 周期计数器
|
||||
\note 使能 DWT 的 CYCCNT,用于精确测量 CPU 周期
|
||||
*/
|
||||
static void dwt_init(void) {
|
||||
/* 使能 DWT 和 ITM(TRCENA 位在 DEMCR 中) */
|
||||
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||
/* 复位 CYCCNT */
|
||||
DWT->CYCCNT = 0;
|
||||
/* 使能 CYCCNT */
|
||||
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
|
||||
dwt_initialized = 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief get system tick time in milliseconds
|
||||
\param[in] none
|
||||
@@ -70,6 +104,9 @@ uint32_t get_systick_ms(void) {
|
||||
\retval none
|
||||
*/
|
||||
void systick_config(void) {
|
||||
/* 初始化 DWT 周期计数器 */
|
||||
dwt_init();
|
||||
|
||||
/* setup systick timer for 1000Hz interrupts */
|
||||
if (SysTick_Config(SystemCoreClock / 1000U)) {
|
||||
/* capture error */
|
||||
@@ -89,6 +126,24 @@ void systick_config(void) {
|
||||
extern "C" void SysTick_Handler(void) {
|
||||
systick_ms++; // 递增系统时间
|
||||
delay_decrement(); // 递减延时计数器
|
||||
|
||||
/* 每 1 秒统计一次 CPU 占用率 */
|
||||
sample_seconds++;
|
||||
if (sample_seconds >= 1000U) {
|
||||
if (dwt_initialized) {
|
||||
/* 1 秒总周期 = SystemCoreClock (120,000,000) */
|
||||
/* CPU% = busy_cycles_accum * 100 / SystemCoreClock */
|
||||
uint64_t busy_64 = (uint64_t)busy_cycles_accum * 100U;
|
||||
uint32_t busy_percent = (uint32_t)(busy_64 / SystemCoreClock);
|
||||
if (busy_percent > 100U) {
|
||||
busy_percent = 100U;
|
||||
}
|
||||
cpu_usage = (uint8_t)busy_percent;
|
||||
}
|
||||
|
||||
busy_cycles_accum = 0;
|
||||
sample_seconds = 0;
|
||||
}
|
||||
}
|
||||
/*!
|
||||
\brief delay a time in seconds
|
||||
@@ -128,6 +183,33 @@ void delay_decrement(void) {
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief 空闲任务计数(兼容接口,DWT 版本无需操作)
|
||||
*/
|
||||
void idle_task_count(void) {
|
||||
/* DWT 版本:空闲周期 = 总周期 - 忙碌周期,无需手动计数 */
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief do_task 入口调用,记录忙碌起始周期
|
||||
*/
|
||||
void busy_task_enter(void) {
|
||||
if (dwt_initialized) {
|
||||
task_enter_cyccnt = DWT->CYCCNT;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief do_task 出口调用,累加忙碌周期
|
||||
*/
|
||||
void busy_task_exit(void) {
|
||||
if (dwt_initialized) {
|
||||
busy_cycles_accum += (DWT->CYCCNT - task_enter_cyccnt);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t get_cpu_usage(void) { return cpu_usage; }
|
||||
|
||||
/*!
|
||||
\brief system soft reset
|
||||
\param[in] none
|
||||
@@ -207,4 +289,4 @@ void app_prepare_deep_sleep(bool save_data) {
|
||||
}
|
||||
}
|
||||
jumpToBOOT(); // 跳转到 bootloader 正式休眠,进入低功耗待机模式
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user