diff --git a/Robot_V2/Robot_V2.cproject.yml b/Robot_V2/Robot_V2.cproject.yml index 97f75c2..6fff240 100644 --- a/Robot_V2/Robot_V2.cproject.yml +++ b/Robot_V2/Robot_V2.cproject.yml @@ -14,8 +14,8 @@ project: files: - file: device/Can.cpp - file: device/Can.h - - file: device/tle5012b.cpp - - file: device/tle5012b.h + - file: device/ang_sensor.cpp + - file: device/ang_sensor.h - file: device/ADC.cpp - file: device/adc.h - file: device/Timer.cpp diff --git a/Robot_V2/device/ADC.cpp b/Robot_V2/device/ADC.cpp index 1268fb2..66f7a54 100644 --- a/Robot_V2/device/ADC.cpp +++ b/Robot_V2/device/ADC.cpp @@ -129,7 +129,8 @@ float sampler::get_vbus_voltage() { * 如果计算结果超出有效范围(-40到255摄氏度),则重新采样计算。 */ void sampler::update_mcu_temp() { - memmove(mcu_temp_samples, mcu_temp_samples + 1, FILTER_SIZE * sizeof(float)); + memmove(mcu_temp_samples, mcu_temp_samples + 1, + FILTER_SIZE * sizeof(float)); mcu_temp_samples[FILTER_SIZE] = (1.43f - adc_value[0] * ADC_SCALE) * TEMP_FACTOR + 35.0f; } @@ -138,7 +139,8 @@ void sampler::update_mcu_temp() { * @brief 更新MCU温度 */ void sampler::update_drv_temp() { - memmove(drv_temp_samples, drv_temp_samples + 1, FILTER_SIZE * sizeof(float)); + memmove(drv_temp_samples, drv_temp_samples + 1, + FILTER_SIZE * sizeof(float)); float R_now = (float)adc_value[1] / (4096 - (float)adc_value[1]) * 4700; drv_temp_samples[FILTER_SIZE] = 1.0f / (0.00335f + 0.00025f * log(R_now / 10000.0f)) - 273.15f; @@ -165,5 +167,5 @@ void sampler::update_current() { */ void sampler::update_vbus_voltage() { memmove(vbus_samples, vbus_samples + 1, FILTER_SIZE * sizeof(float)); - vbus_samples[FILTER_SIZE] = adc_value[5] * ADC_SCALE; + vbus_samples[FILTER_SIZE] = adc_value[5] * ADC_SCALE * VCC_FACTOR; } \ No newline at end of file diff --git a/Robot_V2/device/Timer.cpp b/Robot_V2/device/Timer.cpp index da16973..0022769 100644 --- a/Robot_V2/device/Timer.cpp +++ b/Robot_V2/device/Timer.cpp @@ -1,6 +1,7 @@ #include "Timer.h" #include "Can.h" #include "DengFOC.h" +#include "ang_sensor.h" #include "Timer.h" #include "adc.h" #include "gd32c10x.h" diff --git a/Robot_V2/device/tle5012b.cpp b/Robot_V2/device/ang_sensor.cpp similarity index 70% rename from Robot_V2/device/tle5012b.cpp rename to Robot_V2/device/ang_sensor.cpp index e77a899..363ebf4 100644 --- a/Robot_V2/device/tle5012b.cpp +++ b/Robot_V2/device/ang_sensor.cpp @@ -1,22 +1,14 @@ -#include "tle5012b.h" +#include "ang_sensor.h" #include "core_cmInstr.h" #include "gd32c10x_gpio.h" #include "gd32c10x_spi.h" #include "stdbool.h" #include "systick.h" - -#define SPI_TX_OFF() \ - do { \ - gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, \ - GPIO_PIN_5); \ - } while (0) -#define SPI_TX_ON() \ - do { \ - gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5); \ - } while (0) +#include #define SPI_CS_ENABLE() gpio_bit_reset(GPIOA, GPIO_PIN_15) #define SPI_CS_DISABLE() gpio_bit_set(GPIOA, GPIO_PIN_15) +constexpr float ANGLE_FACTOR = 1.0f / 65536.0f * 360.0f; /** * @brief Send or read half word through SPI @@ -81,7 +73,7 @@ void KHT7823_gpio_init(void) { GPIO_PIN_3 | GPIO_PIN_5); /* PB4 → MISO, 浮空输入 */ gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, - GPIO_PIN_4 | GPIO_PIN_10); + GPIO_PIN_4 | GPIO_PIN_10 | GPIO_PIN_11); } /** * @brief Initialize SPI module @@ -92,15 +84,15 @@ void KHT7823_spi_init(void) { spi_parameter_struct spi_init_str; spi_struct_para_init(&spi_init_str); - /* SPI参数:16bit, 主机, 全双工, CPOL=0 CPHA=1, MSB first */ + /* SPI参数:16bit, 主机, 全双工, CPOL=1 CPHA=1, MSB first */ spi_init_str.device_mode = SPI_MASTER; spi_init_str.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_str.frame_size = SPI_FRAMESIZE_16BIT; spi_init_str.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; spi_init_str.nss = SPI_NSS_SOFT; spi_init_str.endian = SPI_ENDIAN_MSB; - - spi_init_str.prescale = SPI_PSC_16; /* 8MHz @ 128MHz */ + + spi_init_str.prescale = 24; /* 5MHz @ 120MHz */ spi_init(SPI0, &spi_init_str); spi_nss_output_enable(SPI0); spi_nssp_mode_enable(SPI0); @@ -113,23 +105,15 @@ void KHT7823_init(void) { } float KHT7823_readAngle() { - u16 u16Command = 0x4000; + u16 u16Command = 0x0000; // 读取角度命令 float ang = 0; - SPI_CS_ENABLE(); - // 2. 发送命令1,同时接收回答1 - SPI_DATA(SPI0) = u16Command; - while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)) - ; // 等待发送缓冲区空 - while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)) - ; // 等待接收缓冲区满 - u16 u16data = SPI_DATA(SPI0); // 读取回答1 - + // 发送命令1,同时接收回答1 + u16 u16data = spi_rw_half_word(SPI0, u16Command); SPI_CS_DISABLE(); - // 将15位角度值转换为角度(0-360度) - ang = ((float)u16data * 360.0f) / 32767.0f; + ang = u16data * ANGLE_FACTOR; return ang; } \ No newline at end of file diff --git a/Robot_V2/device/tle5012b.h b/Robot_V2/device/ang_sensor.h similarity index 73% rename from Robot_V2/device/tle5012b.h rename to Robot_V2/device/ang_sensor.h index cf42134..f57d4d2 100644 --- a/Robot_V2/device/tle5012b.h +++ b/Robot_V2/device/ang_sensor.h @@ -1,5 +1,5 @@ -#ifndef _5012B_H -#define _5012B_H +#ifndef _angsensor_H +#define _angsensor_H #ifdef __cplusplus extern "C" { #endif @@ -8,7 +8,7 @@ extern "C" { void KHT7823_init(void); u16 spi_rw_half_word(u32 spi_periph, const u16 i_HalfWord); -void KHT7823_readAngle(void); +float KHT7823_readAngle(void); #ifdef __cplusplus } #endif diff --git a/Robot_V2/device/test.cpp b/Robot_V2/device/test.cpp index 22547a5..a8b44a6 100644 --- a/Robot_V2/device/test.cpp +++ b/Robot_V2/device/test.cpp @@ -3,12 +3,10 @@ #include "Timer.h" #include "adc.h" #include "core_cm4.h" -#include "device/tle5012b.h" #include "initial.h" #include "main.h" #include "sys/initial.h" #include "systick.h" -#include "tle5012b.h" #include #include @@ -31,8 +29,6 @@ void test_1111() { // printf(" the angle is %2.2f\r\n", tle5012b_read()); printf("\n----------------------------------------------------\n"); - // TLI5012B测试 - Test_TLI5012B(); } // can_loopback_test(); } \ No newline at end of file diff --git a/Robot_V2/main.cpp b/Robot_V2/main.cpp index b8aee29..3bbb0b8 100644 --- a/Robot_V2/main.cpp +++ b/Robot_V2/main.cpp @@ -6,12 +6,10 @@ #include "adc.h" #include "core_cm4.h" #include "core_cm4.h" -#include "device/tle5012b.h" +#include "ang_sensor.h" #include "gd32c10x_gpio.h" #include "initial.h" -#include "sys/initial.h" #include "systick.h" -#include "tle5012b.h" #include // 全局变量定义 @@ -35,7 +33,7 @@ int main(void) { while (1) { /* clear the FWDGT reset flag */ // std::printf("1\n"); - // KHT7823_init(); + // delay_1ms(100); fwdgt_counter_reload(); CAN0_transmiter.communication_check(); }