feat(FOC): 添加电源电压更新功能
在 FOC 控制器中新增 `update_power` 方法,用于实时获取母线电压, 提升控制系统对电源状态的感知能力。 feat(CAN): 优化 CAN 配置与通信处理 将 CAN 相关宏定义改为 constexpr 常量,并引入角度转换因子。 修正接收数据解析方式,增强通信稳定性与精度。 feat(angle_sensor): 实现角度累积与绕回处理 重写角度传感器驱动,支持角度连续测量与自动绕回处理。 新增 `update`、`getAngle` 和 `reset` 接口,提高角度读取准确性。 feat(main): 增加角度传感器磁感应强度测试 在主函数初始化阶段调用磁感应强度检测函数,辅助判断传感器工作状态。
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user