feat(ADC): 重构采样器初始化为构造函数

将 `sampler::init()` 方法改为构造函数 `sampler()`,并在其中完成 DMA 和 ADC 的初始化配置,
同时进行初始采样操作。

feat(CAN): 更新角度传感器类接口并修复拼写错误
将全局函数 `KHT7823_readAngle()` 替换为 `angle_sensor::readAngle()` 类成员函数调用,
统一命名风格并修正部分函数名中的拼写错误(如 KHT7823 -> KTH7823)。

refactor(Can): 移除冗余的 timeout 成员变量
在 `CAN_transmiter` 类中移除了未使用的 `timeout` 成员变量,减少资源占用。

refactor(Timer): 删除重复注释内容
清理 `Timer.cpp` 中关于定时器配置的重复注释信息,保留核心常量定义。

refactor(ADC): 修正头文件中函数声明
将 `adc.h` 中的 `init()` 函数声明更新为构造函数 `sampler()`,保持实现与声明一致。

refactor(ang_sensor): 将角度传感器相关功能封装为类
将原先分散的 C 风格函数封装进 `angle_sensor` 类中,提升代码结构清晰度和可维护性。
添加构造函数和读取角度的方法,并修正原有函数命名不一致问题。

refactor(main): 调整初始化顺序并移除多余包含
修改 `main.cpp` 中外设初始化顺序,移除对 `core_cm4.h` 的重复包含,
并将角度传感器和采样器通过类实例方式初始化。
This commit is contained in:
cbb
2025-11-01 23:41:32 +08:00
parent bd77f7a9a9
commit 0c5ab9c1d8
8 changed files with 43 additions and 33 deletions
+2 -1
View File
@@ -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;
+3 -2
View File
@@ -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;
-1
View File
@@ -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(); // 更新数据
-4
View File
@@ -12,10 +12,6 @@
#include <stdint.h>
#include <stdio.h>
// 配置定时器每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
+1 -1
View File
@@ -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);
+15 -9
View File
@@ -4,7 +4,6 @@
#include "gd32c10x_spi.h"
#include <stdint.h>
#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; // 错误返回
}
}
+12 -3
View File
@@ -1,15 +1,24 @@
#ifndef _angsensor_H
#define _angsensor_H
#include <cstdio>
#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
}
+4 -6
View File
@@ -3,25 +3,23 @@
#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);
watchdog_init(5000); // 看门狗初始化
while (1) {
// delay_1ms(100);