stm32f103c8t6接SG90舵机和HC-SR04怎么接
时间: 2025-05-22 09:45:55 浏览: 35
### STM32F103C8T6与SG90舵机和HC-SR04超声波模块的硬件连接
#### SG90舵机的连接
SG90舵机通常有三条线:棕色(GND)、红色(电源)和橙色(信号)。对于STM32F103C8T6微控制器,可以按照以下方式连接:
- **棕色线 (GND)** 连接到 STM32 的 GND 引脚。
- **红色线 (VCC)** 连接到 STM32 的 3.3V 或 5V 引脚,具体取决于舵机的工作电压范围[^1]。
- **橙色线 (PWM Signal)** 可以连接到任意一个 GPIO 引脚,例如 `PA1`。
因此,具体的接线如下:
- 舵机棕色线 → STM32 GND
- 舵机红色线 → STM32 3.3V/5V
- 舵机橙色线 → STM32 PA1[^1]
#### HC-SR04超声波模块的连接
HC-SR04超声波模块具有四个引脚:VCC、Trig、Echo 和 GND。其连接方法如下:
- **VCC** 连接到 STM32 的 5V 引脚。
- **GND** 连接到 STM32 的 GND 引脚。
- **Trig** 是触发信号输入端口,可连接到任意一个 GPIO 输出引脚,例如 `PB8`。
- **Echo** 是回响信号输出端口,可连接到另一个 GPIO 输入引脚,例如 `PB9`。
具体的接线配置为:
- HC-SR04 VCC → STM32 5V
- HC-SR04 GND → STM32 GND
- HC-SR04 Trig → STM32 PB8
- HC-SR04 Echo → STM32 PB9
#### 示例代码
以下是用于控制 SG90 舵机和读取 HC-SR04 数据的一个简单示例程序:
```c
#include "stm32f10x.h"
// 配置GPIO引脚
void GPIO_Configuration(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 配置PA1作为PWM输出(舵机)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PB8作为Trig输出(HC-SR04)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置PB9作为Echo输入(HC-SR04)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
int main() {
GPIO_Configuration();
while (1) {
// 控制舵机转动角度
TIM_SetCompare1(TIM2, 100); // 假设TIM2通道1已初始化并设置为PWM模式
// 发送Trig脉冲给HC-SR04
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
delay_us(2); // 短暂低电平
GPIO_SetBits(GPIOB, GPIO_Pin_8);
delay_us(10); // 保持高电平至少10us
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
// 测量Echo返回时间
while (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)); // 等待上升沿
uint32_t start_time = get_microsecond_timer(); // 获取当前时间戳
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)); // 等待下降沿
uint32_t end_time = get_microsecond_timer();
uint32_t duration = end_time - start_time; // 计算持续时间
float distance = duration * 0.034 / 2; // 转换为距离(单位:厘米)
// 打印或处理测得的距离值
}
}
```
以上代码假设已经完成了定时器和延时函数的相关初始化工作。
---
阅读全文
相关推荐


















