本项目为 “第十四届全国海洋航行器设计与制作大赛 - F1帆船模型竞速” 的软件控制部分,使用 STM32F103C8T6 微控制器实现红外数据采集、舵机角度控制与通信调试,完成自动控制路径跟踪功能。
注:原视频见 演示视频
User/
├── GPIO/ # GPIO初始化,包含红外、PWM引脚配置
│ ├── GPIO.c
│ └── GPIO.h
│
├── Timer1/ # TIM3定时中断,每67ms触发一次数据处理与舵机控制
│ ├── Timer1.c
│ └── Timer1.h
│
├── Usart1/ # USART1串口初始化及数据发送函数
│ ├── usart1.c
│ └── usart1.h
│
├── pwm/ # PWM输出模块(TIM1与TIM3控制舵机)
│ ├── pwm.c
│ └── pwm.h
│
├── main.c # 主程序入口,包含红外采集与控制主循环
│
├── stm32f10x_conf.h # 标准外设库配置文件
├── stm32f10x_it.c # 中断服务函数实现
└── stm32f10x_it.h # 中断服务函数声明
| 模块 | 功能描述 |
|---|---|
| GPIO | 配置红外接收输入、PWM输出及串口通信引脚 |
| PWM | 通过 TIM1(PA8)和 TIM3(PA7)输出 PWM 控制信号 |
| Timer1 | 配置 TIM3 每 67ms 触发一次中断,用于红外信号处理与舵机角度计算 |
| USART1 | 初始化串口 9600 波特率,支持 printf 重定向,便于蓝牙或串口调试 |
| 主逻辑 | 实时读取 15 路红外传感器数据,识别红外信号区域,计算舵机角度,并输出控制信号 |
| 模块 | 引脚 | 说明 |
|---|---|---|
| PWM输出1 | PA8 | TIM1_CH1 控制主舵机角度 |
| PWM输出2 | PA7 | TIM3_CH2 预留控制第二通道 |
| USART1 - TX | PA9 | 串口发送(连接蓝牙模块) |
| USART1 - RX | PA10 | 串口接收 |
| 红外接收 | PB3~PB5、PB10~PB15、PC6~PC7、PC10~PC12、PD2、PA15 | 共15路红外输入信号 |
注:通过关闭 JTAG 释放 PB3~PB5 端口用于红外输入
- 红外采样逻辑:采用边沿检测替代电平累加,将高速信号采集与低速控制决策分离,保证红外脉冲计数的准确性和系统控制的稳定性
- 定时处理:TIM3中断每67ms触发一次,完成以下任务:
- 分类红外区域(左/中/右)信号强度
- 丢信号检测与上次角度保持处理
- 寻找信号连续的最大块,计算其重心位置作为角度输入
- 输出 PWM 控制信号至舵机(角度范围 900 ~ 2100)
- 调试信息:当开启
bluetoothsend = 1时,通过串口输出传感器数据、角度值、PWM控制量等调试信息。
angle_pwm = 1500 - (int)((angle - 8) * 200) + (angle - anglelast) * 40;注:angle_pwm 限制在 [900, 2100] 范围内
注:由于 Coder 是一名 mac 重度使用者🧑🏻💻,这里以少为人知的 mac 使用方法作为讲解
- 通过 Terminal 执行
brew install stlink下载烧录工具,用于与ST-Link V2和电脑之间通信 - 通过
st-info --probe查看电脑是否识别到 STM 芯片,如果识别到,大致格式如下:
Found 1 stlink programmers
version: V2J37S7
serial: 37FF71064E573436FC871343
flash: 262144 (pagesize: 2048)
sram: 65536
chipid: 0x414
dev-type: F1xx_HD
- 通过 Crossover 基于 x86 to arm 的 wine 配置转译运行的 Keil µVision5 生成项目对应 .bin 二进制文件
- 通过
st-flash write XXX.bin 0x8000000将 .bin 文件 (如 BH-F103.bin) 烧录到对应 STM 芯片中
注1:执行 st-flash 一般需要先执行
st-flash erase用于擦除芯片旧二进制信息注2:据 st-link 命令行工具官方说明,st-link version 1.8.0 之后将不再提供对 mac 的支持,详见 stlink-org/stlink
- 下载 bleak 库实现 BLE 协议 蓝牙通信
pip install bleak - 配置 UUID 为 BT16 模块,即
- Service UUID: 0000FFE0-0000-1000-8000-00805F9B34FB
- Notify UUID: 0000FFE1-0000-1000-8000-00805F9B34FB
- Write UUID: 0000FFE2-0000-1000-8000-00805F9B34FB
- 执行对应 监听代码 即可读取串口信息
- 通过 正则表达式 过滤无关信息获得
Vendor specific: bytearray中串口内容
注:在 macOS Sequoia 大版本之后,mac 在 kernal 层不再支持对传统 SPP 协议蓝牙模块的支持 (如 HC-05),BLE 因而成为首选
| 参数 | 默认值 | 说明 |
|---|---|---|
| TIM3 周期 | 674 | 对应约 67ms 中断周期 |
| PWM 主舵机通道 | TIM1_CH1 / PA8 | 控制主向偏转角 |
| 中心角度基准 | 1500 | 舵机中位值 |
| 红外采样窗口 | 15通道 | 从 IRM1 ~ IRM15 并行处理 |




