
当前工程 GPIO 引脚映射1. 主要外设引脚在 main.h 定义MOTOR_STBY-PB0– – –standby引脚低电平待机MOTOR_AIN1-PB12MOTOR_AIN2-PB13MOTOR_BIN1-PB14MOTOR_BIN2-PB15DC-PC6RES-PC7CS-PC8BLK-PC9Buzz-PA82. 其他外设引脚在Core/Src/*.c中配置I2C2PB10-I2C2_SCLPB11-I2C2_SDASPI1PA5-SPI1_SCKPA7-SPI1_MOSIUSART1PA9-USART1_TXPA10-USART1_RX定时器 / 编码器PB4-TIM3_CH1PB5-TIM3_CH2PB6-TIM4_CH1PB7-TIM4_CH2PA0-TIM2_CH1PA1-TIM2_CH2转速核心公式转速 (RPS, 每秒数) CP×G×M×T\frac{C}{P \times G \times M \times T}P×G×M×TC其中CCC(Counts)你读取到的编码器脉冲数比如你测到的 20, 25。PPP(PPR)编码器单圈线数查到13 线。GGG(Gear Ratio)减速比查到48MMM(Multiplier)倍频。因为设置的是TIM_ENCODERMODE_TI12这是 4 倍频模式在 A、B 相的上升沿和下降沿都计数所以M4M 4M4。TTT(Time)采样时间。定时器中断是 10ms即T0.01sT 0.01sT0.01s。小车尺寸DDD(diameter)6.6cmXXX(轮距) 13.2cm综上转速 (RPS, 每秒数) C×25624\frac{C \times 25}{624}624C×25线速度 (cm/s)VC×0.8307V C \times 0.8307VC×0.8307**// 假设采集到的原始脉冲数为 short count (TIMx-CNT) float wheel_velocity; const float pulse_to_speed 0.8307f; // 这里的系数包含了所有转换 // 在10ms定时器中断里执行 wheel_velocity (float)count * pulse_to_speed;关于轮距XXX(13.2cm)轮距XXX在计算单轮线速度时用不到但当计算小车的转向角速度或者**航迹推算Odometry**时它是核心参数小车中心速度VcenterVleftVright2V_{center} \frac{V_{left} V_{right}}{2}Vcenter2VleftVright小车转向角速度ωVright−VleftX\omega \frac{V_{right} - V_{left}}{X}ωXVright−VleftPID调试checklist for adc setting确保你的 3 路 ADCPC0, PC1, PC2能一次性配置成功请对照这份STM32F103 ADCDMA 最终检查清单一、 硬件连接检查 (Hardware)引脚确认确保连接的是 PC0 (IN10), PC1 (IN11), PC2 (IN12)。电压安全确认传感器输出电压在0V - 3.3V之间ADC 模式下引脚不耐 5V超过 3.3V 会烧坏。共地传感器模块的 GND 必须与 STM32 的 GND 连在一起。二、 CubeMX 参数设置 (ADC1 详情页)通道勾选左侧勾选了IN10,IN11,IN12。Number of Conversion设置为3。Scan Conversion ModeEnabled(多通道必须开启)。Continuous Conversion ModeEnabled(自动循环采样)。Rank 设置滚动条拉到底Rank 1 - Channel 10, Rank 2 - Channel 11, Rank 3 - Channel 12。Sampling Time全部改为55.5 Cycles或更高默认 1.5 太快数值会抖。三、 DMA 设置 (DMA Settings 标签页)Add ADC1添加了ADC1的 DMA 请求。Mode设置为Circular(循环模式搬完一轮自动重来)。Increment AddressPeripheral外设不勾选。Memory内存必须勾选(数据才会按 [0][1][2] 排队)。Data WidthPeripheral 和 Memory 都选Half Word(16位)。四、 时钟设置 (Clock Configuration)ADC Prescaler在时钟树中确认 ADC 分频器选的是/6或/8使得 ADC Clock小于 14MHz(红叉必须消失)。五、 代码实现 (Code)包含头文件#include stdio.h(如果要打印)。全局变量定义在main.c顶部uint16_tadc_buf[3];// 存放 3 路数据校准与启动在main函数内MX_ADC1_Init之后HAL_ADCEx_Calibration_Start(hadc1);// 自动校准让测量更准HAL_ADC_Start_DMA(hadc1,(uint32_t*)adc_buf,3);// 启动 3 通道搬运读取数据adc_buf[0]- PC0 的值 (0-4095)adc_buf[1]- PC1 的值adc_buf[2]- PC2 的值六、 常见坑点 (Pitfalls)数据错位如果发现 PC0 的数据跑到了adc_buf[1]里通常是因为Number of Conversion设置的数字和HAL_ADC_Start_DMA最后一个参数不一致。数值全为 0检查是否漏掉了HAL_ADC_Start_DMA启动函数。数值全为 4095检查传感器是否没接好或者引脚悬空。