着重说明一下第二点 定时器模块
时间: 2025-08-05 12:09:32 浏览: 5
### STM32定时器模块在智能避障小车中的应用及实现方式
#### 1. **PWM信号生成**
STM32的定时器模块能够通过其捕获比较寄存器(CCR)和自动重装载寄存器(ARR),配合输出比较单元,生成精确的PWM波形。这种波形常用于控制直流电机的速度与转向以及舵机的角度调节[^1]。例如,利用TIM3定时器初始化函数`TIM3_Int_Init(u16 arr, u16 psc)`设置预分频器psc和计数周期arr后,可以通过修改比较值来动态调整PWM占空比。
```c
// 初始化定时器3以生成PWM信号
TIM3_Int_Init(199, 71); // 设置ARR=199, PSC=71对应约1KHz PWM频率
TIM_SetCompare1(TIM3, compare_value); // 动态更新占空比
```
#### 2. **超声波测距时间测量**
对于HC-SR04这样的超声波传感器而言,它的工作原理依赖于发射脉冲后的回响持续时长计算距离。此时可采用输入捕获模式下的上升沿触发记录开始时刻Tstart,下降沿再次捕捉得到结束时刻Tend,两者差值即代表往返飞行时间t_flight=(Tend-Tstart)*Tclock,其中Tclock为系统时钟周期[^2]。
```c
void TIM_CaptureConfig(void){
GPIO_InitTypeDef GPIO_InitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 配置PA.08(TIMER2 CH1)脚为复用输入 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_INPUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/* 定时器基本参数设定 */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;// 自动重载值
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
/* 输入捕获配置 */
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2,&TIM_ICInitStruct);
/* 开启中断 */
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);
}
```
#### 3. **延时功能提供**
除了上述两种核心应用场景之外,还有一种较为基础但也十分重要的用途便是创建软件层面所需的各类固定长度延迟操作。这通常经由编写专门服务于特定毫秒级或微秒级别等待需求的服务例程达成目标[^3]。
```c
u8 Delay_Flag=0;
Times Time={0};
/* 中断服务程序 - 更新全局变量Time */
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)
{
if(Time.us >= 1000){
Time.ms++;
Time.us %= 1000;
}
if(Time.ms >= 1000){
Time.s++;
Time.ms%=1000;
}
if(Time.min >0 && Time.s>=60){
Time.min--;
Time.s=0;
}
Delay_Flag =1 ;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
/* 用户调用接口 - 实现精准ms级延时 */
void delay_ms(unsigned int t)
{
Times temp_time=Time;
while((Time.ms-temp_time.ms)<t);
}
```
---
###
阅读全文
相关推荐


















