diff --git a/Robot_V2/device/ADC.cpp b/Robot_V2/device/ADC.cpp index c97df3b..0b1d412 100644 --- a/Robot_V2/device/ADC.cpp +++ b/Robot_V2/device/ADC.cpp @@ -109,9 +109,10 @@ void adc_config(void) { /** * @brief 采样类初始化 */ -void sampler::init() { +sampler::sampler() { dma_config(); // DMA采样ADC初始化 adc_config(); // ADC初始化 + // 初始采样 for (int i = 0; i < FILTER_SIZE + 1; i++) { mcu_temp_samples[i] = (1.43f - adc_value[0] * ADC_SCALE) * TEMP_FACTOR + 35.0f; diff --git a/Robot_V2/device/Can.cpp b/Robot_V2/device/Can.cpp index 9ad9f83..4509f37 100644 --- a/Robot_V2/device/Can.cpp +++ b/Robot_V2/device/Can.cpp @@ -22,6 +22,7 @@ extern CAN_transmiter CAN0_transmiter; extern FOC_Controlroller FOC; extern sampler sampler; +extern angle_sensor KTH7823; // 添加DMA相关变量 dma_parameter_struct dma_rx_parameter; @@ -346,7 +347,7 @@ void canfd_loopback_test(void) { void can_loopback_test(void) { can_trasnmit_message_struct transmit_message; can_receive_message_struct receive_message; - uint32_t timeout = 0xF; + uint32_t timeout = 0xFF; uint8_t transmit_mailbox = 0; std::mt19937 gen(rand()); // 使用随机设备生成的种子 @@ -429,7 +430,7 @@ void CAN_transmiter::update(void) { mcu_temp = sampler.get_mcu_temp() * 100; motor_temp = sampler.get_drv_temp() * 100; Power_Voltage = sampler.get_vbus_voltage() * 1000; - rt_angle_union.f = KHT7823_readAngle(); + rt_angle_union.f = KTH7823.readAngle(); rt_velocity_union.f = 0.0f; Status_code = (gpio_input_bit_get(GPIOB, GPIO_PIN_2) == SET) ? 0 : 1; diff --git a/Robot_V2/device/Can.h b/Robot_V2/device/Can.h index 75a628c..1a12631 100644 --- a/Robot_V2/device/Can.h +++ b/Robot_V2/device/Can.h @@ -89,7 +89,6 @@ class CAN_transmiter { can_trasnmit_message_struct transmit_message; // 发送消息结构体 u8 transmit_mailbox = CAN_NOMAILBOX; // 初始化为无mailbox状态 - u32 timeout = 0XFFFF; // 默认超时为0xFFFF u8 transmit_data[64]; // CANFD最大64字节 void update(); // 更新数据 diff --git a/Robot_V2/device/Timer.cpp b/Robot_V2/device/Timer.cpp index ff9ec0c..e610a8c 100644 --- a/Robot_V2/device/Timer.cpp +++ b/Robot_V2/device/Timer.cpp @@ -12,10 +12,6 @@ #include #include -// 配置定时器每100微秒中断一次 -// 系统时钟为120MHz,要得到100微秒的中断周期 -// 可以使用预分频器119,定时器时钟为120MHz/(119+1) = 1MHz -// 然后设置周期为99,即计数100次,1MHz/100 = 10kHz = 100微秒 constexpr int TIMER2_PRESCALER = 119; // 120MHz / 120 = 1MHz constexpr int TIMER2_PERIOD = 99; // 1MHz / 100 = 100us constexpr int TIMER3_PRESCALER = 119; // 120MHz / 120 = 1MHz diff --git a/Robot_V2/device/adc.h b/Robot_V2/device/adc.h index 59a0e28..244464a 100644 --- a/Robot_V2/device/adc.h +++ b/Robot_V2/device/adc.h @@ -19,7 +19,7 @@ class sampler { float tempora_sample; public: - void init(); + sampler(); void update_mcu_temp(void); void update_drv_temp(void); void update_vbus_voltage(void); diff --git a/Robot_V2/device/ang_sensor.cpp b/Robot_V2/device/ang_sensor.cpp index 5614dcd..43d45f2 100644 --- a/Robot_V2/device/ang_sensor.cpp +++ b/Robot_V2/device/ang_sensor.cpp @@ -4,7 +4,6 @@ #include "gd32c10x_spi.h" #include - #define SPI_CS_ENABLE() gpio_bit_reset(GPIOA, GPIO_PIN_15) #define SPI_CS_DISABLE() gpio_bit_set(GPIOA, GPIO_PIN_15) @@ -179,7 +178,7 @@ extern "C" void DMA0_Channel1_IRQHandler(void) { * @brief 角度传感器初始化 * @param 无 */ -void KHT7823_gpio_init(void) { +void KTH7823_gpio_init(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_SPI0); @@ -204,7 +203,7 @@ void KHT7823_gpio_init(void) { * * @details Configures SPI hardware and initializes necessary settings */ -void KHT7823_spi_init(void) { +void KTH7823_spi_init(void) { spi_parameter_struct spi_init_str; spi_struct_para_init(&spi_init_str); @@ -224,27 +223,34 @@ void KHT7823_spi_init(void) { } /** - * @brief KHT7823 初始化 + * @brief KTH7823 初始化 */ -void KHT7823_init(void) { - KHT7823_gpio_init(); // GPIO初始化 - KHT7823_spi_init(); // SPI初始化 +void angle_sensor::KTH7823_init(void) { + KTH7823_gpio_init(); // GPIO初始化 + KTH7823_spi_init(); // SPI初始化 spi_dma_init(); // DMA初始化 } +/** + * @brief 角度传感器构造函数 + */ +angle_sensor::angle_sensor(void) { KTH7823_init(); } /** * @brief 读取传感器数据 * @return 传感器数据 */ -float KHT7823_readAngle() { +float angle_sensor::readAngle(void) { + u16 u16data = FAULT_RECEIVE; + SPI_CS_ENABLE(); // 使用DMA发送命令并接收数据 - u16 u16data; if (spi_rw_half_word_dma(SPI0, DEFAULT_COMMAND, &u16data) == 0) { SPI_CS_DISABLE(); return u16data * ANGLE_FACTOR; } else { SPI_CS_DISABLE(); + // 处理读取错误 + printf("Error reading angle from sensor.\n"); return FAULT_RECEIVE; // 错误返回 } } \ No newline at end of file diff --git a/Robot_V2/device/ang_sensor.h b/Robot_V2/device/ang_sensor.h index 84a6e8a..f1f6c76 100644 --- a/Robot_V2/device/ang_sensor.h +++ b/Robot_V2/device/ang_sensor.h @@ -1,15 +1,24 @@ #ifndef _angsensor_H #define _angsensor_H +#include #ifdef __cplusplus extern "C" { #endif #include "gd32c10x_eval.h" #include "stdio.h" -void KHT7823_init(void); u16 spi_rw_half_word(u32 spi_periph, const u16 i_HalfWord); -float KHT7823_readAngle(void); -int spi_rw_half_word_dma(uint32_t spi_periph, uint16_t tx_data, uint16_t* rx_data); +int spi_rw_half_word_dma(uint32_t spi_periph, uint16_t tx_data, + uint16_t *rx_data); + +class angle_sensor { + public: + angle_sensor(); + float readAngle(void); + + protected: + void KTH7823_init(void); +}; #ifdef __cplusplus } diff --git a/Robot_V2/main.cpp b/Robot_V2/main.cpp index 17fc34f..2cce2d2 100644 --- a/Robot_V2/main.cpp +++ b/Robot_V2/main.cpp @@ -3,29 +3,27 @@ #include "DengFOC.h" #include "Timer.h" #include "adc.h" -#include "core_cm4.h" #include "ang_sensor.h" +#include "core_cm4.h" #include "initial.h" #include "systick.h" // 全局变量定义 -CAN_transmiter CAN0_transmiter; //CAN初始化 +CAN_transmiter CAN0_transmiter; // CAN初始化 FOC_Controlroller FOC; // FOC控制初始化 sampler sampler; // 采样器初始化 +angle_sensor KTH7823; // 角度传感器初始化 int main(void) { - systick_config(); // 系统时钟初始化 - USART0_init(); // 调试串口初始化 - User_timer_init(); // Timer初始化 - sampler.init(); // ADC采样器初始化 - KHT7823_init(); // 角度传感器初始化 - driver_init(); // 电机驱动初始化 - - watchdog_init(5000); + systick_config(); // 系统时钟初始化 + USART0_init(); // 调试串口初始化 + User_timer_init(); // Timer初始化 + driver_init(); // 电机驱动初始化 + watchdog_init(5000); // 看门狗初始化 while (1) { // delay_1ms(100); - fwdgt_counter_reload(); // 看门狗复位 + fwdgt_counter_reload(); // 看门狗复位 CAN0_transmiter.communication_check(); // CAN通信 } -} +} \ No newline at end of file