高级会员

- 积分
- 724
- 金钱
- 724
- 注册时间
- 2026-1-29
- 在线时间
- 55 小时
|
在STM32F103中产生超声波的程序设计,核心是利用其定时器(Timer)输出特定频率的PWM(脉宽调制)信号,驱动超声波传感器(如HC-SR04)的压电陶瓷换能器,通过逆压电效应产生机械振动并发射出超声波。以下是详细原理和实现要点:
### **一、超声波产生的核心原理:逆压电效应**
超声波的本质是机械波,其产生依赖于**压电材料**的**逆压电效应**。
- **压电效应**:某些材料(如压电陶瓷PZT)在受到机械应力时会产生电荷(正压电效应,用于接收超声波);反之,当材料两端施加交变电压时,会发生机械形变(逆压电效应,用于发射超声波)。
- **超声波发射过程**:给压电陶瓷施加高频交变电压(如40kHz的方波),其会随电压变化快速伸缩振动,推动周围介质(如空气)产生疏密交替的机械波,即超声波(频率高于20kHz,超出人耳听觉范围)。
### **二、STM32F103如何控制超声波发射?**
STM32F103通过**定时器(Timer)**生成高频PWM信号,作为压电陶瓷的驱动电压。具体步骤如下:
#### **1. 定时器配置:生成PWM信号**
STM32F103的通用定时器(如Timer2、Timer3、Timer4)支持PWM输出模式,需配置以下参数:
- **PWM频率**:超声波的典型工作频率(如HC-SR04模块为40kHz)。
频率计算公式:
\[
f_{\text{PWM}} = \frac{f_{\text{APB1}}}{(ARR + 1) \times (PSC + 1)}
\]
其中,\( f_{\text{APB1}} \) 是定时器时钟(通常为36MHz或72MHz,需根据系统时钟配置确认),ARR是自动重装载寄存器值,PSC是预分频器值。
例如,若需40kHz的PWM信号,且 \( f_{\text{APB1}} = 72MHz \),则:
\[
ARR + 1 = \frac{72MHz}{40kHz \times (PSC + 1)}
\]
通常选择PSC=0,则ARR=1799(72MHz/(40kHz×1)=1800,故ARR=1799)。
- **占空比**:通常设置为50%(高电平时间与周期的比值),以最大化压电陶瓷的振动效率。
#### **2. 驱动电路:增强信号功率**
STM32的GPIO输出电流较小(约25mA),无法直接驱动压电陶瓷(需较高电压,如5V或更高)。因此需通过**三极管或MOS管**放大PWM信号的功率,或使用专用驱动芯片(如MAX232升压)。
### **三、程序设计关键步骤(以HC-SR04为例)**
HC-SR04是常用的超声波测距模块,其发射部分需STM32输出10μs以上的高电平触发信号,模块内部自动产生40kHz超声波。程序流程如下:
#### **1. 初始化GPIO和定时器**
- 配置GPIO为推挽输出模式(增强驱动能力)。
- 初始化定时器(如Timer2)为PWM模式,设置频率40kHz、占空比50%。
#### **2. 发射触发信号(针对HC-SR04)**
- 向Trig引脚输出10μs高电平(可通过GPIO直接控制,或用定时器精确计时)。
- 模块自动发射40kHz超声波,并等待回波。
#### **3. 接收回波(可选,用于测距)**
- 模块Echo引脚输出高电平(持续时间为超声波往返时间),STM32需用定时器捕获该高电平的时长,计算距离:
\[
距离 = \frac{高电平时间 \times 声速(约340m/s)}{2}
\]
### **四、示例代码片段(STM32F103标准库)**
以下为初始化Timer2输出40kHz PWM的代码示例:
```c
#include "stm32f10x.h"
void Ultrasonic_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
// 开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0为TIM2_CH1输出(PWM模式)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置TIM2时基(72MHz时钟,PSC=0,ARR=1799 → 40kHz)
TIM_TimeBaseStruct.TIM_Prescaler = 0;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 1799;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);
// 配置TIM2_CH1为PWM模式1(占空比50%)
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 900; // 占空比=900/(1799+1)=50%
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStruct);
// 使能TIM2
TIM_Cmd(TIM2, ENABLE);
}
int main(void) {
Ultrasonic_Init();
while(1) {
// 程序主循环(可添加触发或测距逻辑)
}
}
```
### **五、注意事项**
- **频率匹配**:压电陶瓷有固定谐振频率(如40kHz),PWM频率需接近该值以最大化发射效率。
- **信号隔离**:若驱动大功率超声波模块,需使用光耦隔离防止干扰STM32。
- **回波处理**:测距应用中需用定时器捕获Echo高电平时间(如TIM3的输入捕获模式)。
通过以上原理和代码,STM32F103可灵活控制超声波的发射,广泛应用于测距、测厚、避障等场景。 |
|