国民技术usart2的Remap复用配置
2026/7/7 1:37:23
关键词:机械电子毕业设计、STM32、ROS、智能小车、PID、传感器融合
做智能小车毕设,90% 的同学卡在同三个坑里:
我踩坑的顺序是:先调电机,再调传感器,最后才发现控制周期抖动才是万恶之源。下文把每一步拆给你看,让你少熬三个通宵。
| 维度 | Arduino Uno | STM32F103 | STM32F407 |
|---|---|---|---|
| 主频 | 16 MHz | 72 MHz | 168 MHz |
| 定时器 | 8 bit×2 | 16 bit×4 | 32 bit×2 |
| 片上 ADC | 10 bit | 12 bit | 12 bit×3 |
| 价格 | 25 元 | 9 元 | 29 元 |
| ROS 支持 | 靠串口 | 串口/USB/CAN 全支持 | 同上 |
结论:
RTOS 选不选?
通信:
rosserial一键配置;超声波 40 kHz 采样,IMU 1 kHz。融合策略:
位置环 100 Hz,速度环 1 kHz。
增量公式:
Δu(k) = Kp·Δe(k) + Ki·e(k) + Kd·[Δe(k)-Δe(k-1)]调参顺序:
以下代码在 STM32CubeMX 生成的基础上补全,直接复制可跑通。
/* 1. 定时器 1 kHz 中断初始化 */ static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 84-1; // 84 MHz / 84 = 1 MHz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 1000-1; // 1 MHz / 1000 = 1 kHz htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); } /* 2. 中断服务函数:1 kHz 控制周期 */ void TIM2_IRQHandler(void) { if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE)) { __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE); /* 读取编码器 */ int16_t speed = __HAL_TIM_GET_COUNTER(&htim3); /* 计算增量 PID */ static float err1=0, err2=0; float err = target_speed - speed; float du = KP*(err-err1) + KI*err + KD*(err-2*err1+err2); err2 = err1; err1 = err; /* 更新 PWM */ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, (int)(du + pwm_offset)); /* 打包上传 ROS */ static uint16_t cnt=0; if(++cnt >= 100) { // 10 Hz 上传 tx_buf[0] = 0xAA; // 帧头 tx_buf[1] = (speed>>8)&0xFF; tx_buf[2] = speed&0xFF; tx_buf[3] = (int16_t)(du)>>8; tx_buf[4] = (int16_t)du; tx_buf[5] = 0x55; // 帧尾 HAL_UART_Transmit_DMA(&huart1, tx_buf, 6); cnt = 0; } } }把上述模块串起来,三天就能在实验室走廊完成“直线+避障”闭环。答辩老师最常问的三句话:
毕设不是写论文,是让电路转起来、让代码稳住、让自己睡得着。本文代码和 PCB 源文件已开源在 GitHub,搜“SmartCar_STM32_ROS”就能找到。别急着一次做完美,先把电机转圈、超声波测距、PID 调平这三板斧跑通,再去想 SLAM、深度学习、视觉避障——小车先能走,才能去远方。祝你调试顺利,答辩一次过!