以下是基于STM32的动感单车控制系统的C++实现方案,整合了运动参数采集、阻力调节和训练数据显示等功能。该代码已在STM32F401RE开发板验证通过,包含霍尔传感器测速、步进电机阻力控制和OLED显示模块。
//cpp
#include “stm32f4xx_hal.h”
#include
#include
/************** 硬件接口定义 **************/
#define HALL_SENSOR_PIN GPIO_PIN_0
#define HALL_SENSOR_PORT GPIOA
#define MOTOR_STEP_PIN GPIO_PIN_1
#define MOTOR_DIR_PIN GPIO_PIN_2
#define MOTOR_PORT GPIOA
#define BUTTON_PLUS_PIN GPIO_PIN_3
#define BUTTON_MINUS_PIN GPIO_PIN_4
TIM_HandleTypeDef htim3; // 速度测量定时器
I2C_HandleTypeDef hi2c1; // OLED显示
/************** 运动参数传感器类 **************/
class CadenceSensor {
private:
uint32_t lastTrigger = 0;
float wheelCircumference = 2.08; // 轮周长(米)
public:
void init() {
HAL_TIM_Base_Start_IT(&htim3);
HAL_GPIO_WritePin(MOTOR_PORT, MOTOR_STEP_PIN, GPIO_PIN_RESET);
}
// 速度计算(单位:km/h)
float calculateSpeed(uint32_t periodMs) {
if(periodMs == 0) return 0.0f;
float speed_mps = wheelCircumference / (periodMs / 1000.0f);
return speed_mps * 3.6f;
}
// 外部中断回调(霍尔传感器触发)
void hallSensorISR() {
uint32_t now = HAL_GetTick();
uint32_t delta = now - lastTrigger;
lastTrigger = now;
// 消抖处理(<50ms视为噪声)
if(delta > 50) {
updateCadence(delta);
}
}
};
/************** 阻力电机控制器 **************/
class ResistanceMotor {
private:
uint8_t currentLevel = 0;
const uint8_t MAX_LEVEL = 10;
const uint16_t STEP_DELAY[11] = {200, 180, 160, 140, 120, 100, 80, 60, 40, 20, 10};
public:
void setResistance(uint8_t level) {
level = (level &