refactor(device): 重构角度传感器模块并优化ADC电压计算

- 将 tle5012b 角度传感器相关文件重命名为 ang_sensor,统一接口命名
- 修正母线电压采样计算公式,增加 VCC_FACTOR 校正系数
- 移除 main.cpp 中重复和未使用的头文件引用
- 删除对旧角度传感器初始化函数的调用,改用新接口读取角度
```
This commit is contained in:
cbb
2025-10-31 01:17:52 +08:00
parent 180a46271c
commit 867a37ff79
7 changed files with 24 additions and 43 deletions
+2 -2
View File
@@ -14,8 +14,8 @@ project:
files: files:
- file: device/Can.cpp - file: device/Can.cpp
- file: device/Can.h - file: device/Can.h
- file: device/tle5012b.cpp - file: device/ang_sensor.cpp
- file: device/tle5012b.h - file: device/ang_sensor.h
- file: device/ADC.cpp - file: device/ADC.cpp
- file: device/adc.h - file: device/adc.h
- file: device/Timer.cpp - file: device/Timer.cpp
+5 -3
View File
@@ -129,7 +129,8 @@ float sampler::get_vbus_voltage() {
* 如果计算结果超出有效范围(-40到255摄氏度),则重新采样计算。 * 如果计算结果超出有效范围(-40到255摄氏度),则重新采样计算。
*/ */
void sampler::update_mcu_temp() { 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] = mcu_temp_samples[FILTER_SIZE] =
(1.43f - adc_value[0] * ADC_SCALE) * TEMP_FACTOR + 35.0f; (1.43f - adc_value[0] * ADC_SCALE) * TEMP_FACTOR + 35.0f;
} }
@@ -138,7 +139,8 @@ void sampler::update_mcu_temp() {
* @brief 更新MCU温度 * @brief 更新MCU温度
*/ */
void sampler::update_drv_temp() { 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; float R_now = (float)adc_value[1] / (4096 - (float)adc_value[1]) * 4700;
drv_temp_samples[FILTER_SIZE] = drv_temp_samples[FILTER_SIZE] =
1.0f / (0.00335f + 0.00025f * log(R_now / 10000.0f)) - 273.15f; 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() { void sampler::update_vbus_voltage() {
memmove(vbus_samples, vbus_samples + 1, FILTER_SIZE * sizeof(float)); 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;
} }
+1
View File
@@ -1,6 +1,7 @@
#include "Timer.h" #include "Timer.h"
#include "Can.h" #include "Can.h"
#include "DengFOC.h" #include "DengFOC.h"
#include "ang_sensor.h"
#include "Timer.h" #include "Timer.h"
#include "adc.h" #include "adc.h"
#include "gd32c10x.h" #include "gd32c10x.h"
@@ -1,22 +1,14 @@
#include "tle5012b.h" #include "ang_sensor.h"
#include "core_cmInstr.h" #include "core_cmInstr.h"
#include "gd32c10x_gpio.h" #include "gd32c10x_gpio.h"
#include "gd32c10x_spi.h" #include "gd32c10x_spi.h"
#include "stdbool.h" #include "stdbool.h"
#include "systick.h" #include "systick.h"
#include <cstdio>
#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)
#define SPI_CS_ENABLE() gpio_bit_reset(GPIOA, GPIO_PIN_15) #define SPI_CS_ENABLE() gpio_bit_reset(GPIOA, GPIO_PIN_15)
#define SPI_CS_DISABLE() gpio_bit_set(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 * @brief Send or read half word through SPI
@@ -81,7 +73,7 @@ void KHT7823_gpio_init(void) {
GPIO_PIN_3 | GPIO_PIN_5); GPIO_PIN_3 | GPIO_PIN_5);
/* PB4 → MISO, 浮空输入 */ /* PB4 → MISO, 浮空输入 */
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 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 * @brief Initialize SPI module
@@ -92,7 +84,7 @@ void KHT7823_spi_init(void) {
spi_parameter_struct spi_init_str; spi_parameter_struct spi_init_str;
spi_struct_para_init(&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.device_mode = SPI_MASTER;
spi_init_str.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_str.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_str.frame_size = SPI_FRAMESIZE_16BIT; spi_init_str.frame_size = SPI_FRAMESIZE_16BIT;
@@ -100,7 +92,7 @@ void KHT7823_spi_init(void) {
spi_init_str.nss = SPI_NSS_SOFT; spi_init_str.nss = SPI_NSS_SOFT;
spi_init_str.endian = SPI_ENDIAN_MSB; 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_init(SPI0, &spi_init_str);
spi_nss_output_enable(SPI0); spi_nss_output_enable(SPI0);
spi_nssp_mode_enable(SPI0); spi_nssp_mode_enable(SPI0);
@@ -113,23 +105,15 @@ void KHT7823_init(void) {
} }
float KHT7823_readAngle() { float KHT7823_readAngle() {
u16 u16Command = 0x4000; u16 u16Command = 0x0000; // 读取角度命令
float ang = 0; float ang = 0;
SPI_CS_ENABLE(); SPI_CS_ENABLE();
// 2. 发送命令1,同时接收回答1 // 发送命令1,同时接收回答1
SPI_DATA(SPI0) = u16Command; u16 u16data = spi_rw_half_word(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
SPI_CS_DISABLE(); SPI_CS_DISABLE();
// 将15位角度值转换为角度(0-360度) ang = u16data * ANGLE_FACTOR;
ang = ((float)u16data * 360.0f) / 32767.0f;
return ang; return ang;
} }
@@ -1,5 +1,5 @@
#ifndef _5012B_H #ifndef _angsensor_H
#define _5012B_H #define _angsensor_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -8,7 +8,7 @@ extern "C" {
void KHT7823_init(void); void KHT7823_init(void);
u16 spi_rw_half_word(u32 spi_periph, const u16 i_HalfWord); u16 spi_rw_half_word(u32 spi_periph, const u16 i_HalfWord);
void KHT7823_readAngle(void); float KHT7823_readAngle(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
-4
View File
@@ -3,12 +3,10 @@
#include "Timer.h" #include "Timer.h"
#include "adc.h" #include "adc.h"
#include "core_cm4.h" #include "core_cm4.h"
#include "device/tle5012b.h"
#include "initial.h" #include "initial.h"
#include "main.h" #include "main.h"
#include "sys/initial.h" #include "sys/initial.h"
#include "systick.h" #include "systick.h"
#include "tle5012b.h"
#include <cinttypes> #include <cinttypes>
#include <cstdio> #include <cstdio>
@@ -31,8 +29,6 @@ void test_1111() {
// printf(" the angle is %2.2f\r\n", tle5012b_read()); // printf(" the angle is %2.2f\r\n", tle5012b_read());
printf("\n----------------------------------------------------\n"); printf("\n----------------------------------------------------\n");
// TLI5012B测试
Test_TLI5012B();
} }
// can_loopback_test(); // can_loopback_test();
} }
+2 -4
View File
@@ -6,12 +6,10 @@
#include "adc.h" #include "adc.h"
#include "core_cm4.h" #include "core_cm4.h"
#include "core_cm4.h" #include "core_cm4.h"
#include "device/tle5012b.h" #include "ang_sensor.h"
#include "gd32c10x_gpio.h" #include "gd32c10x_gpio.h"
#include "initial.h" #include "initial.h"
#include "sys/initial.h"
#include "systick.h" #include "systick.h"
#include "tle5012b.h"
#include <cstdio> #include <cstdio>
// 全局变量定义 // 全局变量定义
@@ -35,7 +33,7 @@ int main(void) {
while (1) { while (1) {
/* clear the FWDGT reset flag */ /* clear the FWDGT reset flag */
// std::printf("1\n"); // std::printf("1\n");
// KHT7823_init(); // delay_1ms(100);
fwdgt_counter_reload(); fwdgt_counter_reload();
CAN0_transmiter.communication_check(); CAN0_transmiter.communication_check();
} }