feat(FOC): 添加电源电压更新功能

在 FOC 控制器中新增 `update_power` 方法,用于实时获取母线电压,
提升控制系统对电源状态的感知能力。

feat(CAN): 优化 CAN 配置与通信处理
将 CAN 相关宏定义改为 constexpr 常量,并引入角度转换因子。
修正接收数据解析方式,增强通信稳定性与精度。

feat(angle_sensor): 实现角度累积与绕回处理
重写角度传感器驱动,支持角度连续测量与自动绕回处理。
新增 `update`、`getAngle` 和 `reset` 接口,提高角度读取准确性。

feat(main): 增加角度传感器磁感应强度测试
在主函数初始化阶段调用磁感应强度检测函数,辅助判断传感器工作状态。
This commit is contained in:
cbb
2025-11-02 01:54:01 +08:00
parent 0c5ab9c1d8
commit 974b8e6675
9 changed files with 79 additions and 66 deletions
+40 -49
View File
@@ -10,56 +10,12 @@
constexpr float ANGLE_FACTOR = 1.0f / 65536.0f * 360.0f;
constexpr u16 DEFAULT_COMMAND = 0x0000;
constexpr u16 FAULT_RECEIVE = 0xFFFF;
constexpr u16 REDDUCTION_RATIO = 25;
// DMA传输完成标志
volatile bool spi_dma_tx_complete = false;
volatile bool spi_dma_rx_complete = false;
/**
* @brief Send or read half word through SPI using polling method
*
* @param[in] spi_periph SPI peripheral
* @param[in] i_HalfWord data
*/
u16 spi_rw_half_word(u32 spi_periph, const u16 i_HalfWord) {
u32 timeout;
u16 received_data = FAULT_RECEIVE;
/* Wait until transmit buffer is empty */
timeout = 200;
while ((RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE)) && --timeout)
;
if (timeout == 0)
return FAULT_RECEIVE;
/* Clear RX buffer if not empty */
if (SET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE)) {
(void)spi_i2s_data_receive(spi_periph);
}
/* Send data */
spi_i2s_data_transmit(spi_periph, i_HalfWord);
/* Wait for response */
timeout = 200;
while ((RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE)) && --timeout)
;
if (timeout == 0)
return FAULT_RECEIVE;
/* Read received data */
received_data = spi_i2s_data_receive(spi_periph);
/* Wait until SPI is not busy */
timeout = 200;
while ((SET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TRANS)) && --timeout)
;
if (timeout == 0)
return FAULT_RECEIVE;
return received_data;
}
/**
* @brief SPI DMA initialization
*/
@@ -102,8 +58,8 @@ void spi_dma_init(void) {
spi_dma_enable(SPI0, SPI_DMA_RECEIVE);
// 配置DMA中断
nvic_irq_enable(DMA0_Channel2_IRQn, 1, 1);
nvic_irq_enable(DMA0_Channel1_IRQn, 1, 1);
nvic_irq_enable(DMA0_Channel2_IRQn, 0, 1);
nvic_irq_enable(DMA0_Channel1_IRQn, 0, 1);
// 使能DMA传输完成中断
dma_interrupt_enable(DMA0, DMA_CH2, DMA_INT_FTF);
@@ -239,7 +195,7 @@ angle_sensor::angle_sensor(void) { KTH7823_init(); }
* @brief 读取传感器数据
* @return 传感器数据
*/
float angle_sensor::readAngle(void) {
float angle_sensor::read_sensorAngle(void) {
u16 u16data = FAULT_RECEIVE;
SPI_CS_ENABLE();
@@ -250,7 +206,42 @@ float angle_sensor::readAngle(void) {
} else {
SPI_CS_DISABLE();
// 处理读取错误
printf("Error reading angle from sensor.\n");
// printf("Error reading angle from sensor.\n");
return FAULT_RECEIVE; // 错误返回
}
}
float angle_sensor::update(void) {
float currentAngle = read_sensorAngle();
if (m_firstUpdate) {
m_lastAngle = currentAngle;
m_firstUpdate = false;
return m_cumulativeAngle;
}
// 计算角度变化
float delta = currentAngle - m_lastAngle;
// 处理角度绕回情况(0度和360度之间的跳变)
// 如果变化超过180度,说明发生了绕回
if (delta > 180.0f) {
// 从接近360度绕回到接近0度
delta -= 360.0f;
} else if (delta < -180.0f) {
// 从接近0度绕到接近360度
delta += 360.0f;
}
m_cumulativeAngle += delta / REDDUCTION_RATIO;
m_lastAngle = currentAngle;
return m_cumulativeAngle;
}
float angle_sensor::getAngle(void) const { return m_cumulativeAngle; }
void angle_sensor::reset(void) {
m_cumulativeAngle = 0.0f;
m_firstUpdate = true;
}