stm32f103c8t6pwm输入捕获 计算占空比
时间: 2025-01-07 19:02:13 浏览: 5
### STM32F103C8T6 PWM 输入捕获计算占空比
对于STM32F103C8T6来说,通过PWM输入捕获来测量信号频率和占空比是一个常见的应用需求。下面提供了一个基于HAL库实现此功能的具体方法。
#### 初始化配置
首先,在`main.c`文件中初始化TIMx定时器用于捕捉外部PWM波形:
```c
void MX_TIM2_Init(void)
{
TIM_HandleTypeDef htim2;
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 79;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim2) != HAL_OK){
Error_Handler();
}
}
```
接着定义两个全局变量存储上升沿时间和下降沿时间差值以便后续处理:
```c
volatile uint32_t RisingEdgeTime, FallingEdgeTime;
volatile float DutyCyclePercentage;
```
为了获取更精确的结果,还需要设置回调函数以响应中断事件并更新这些计数值:
```c
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t PreviousRisingEdgeTime = 0;
static uint32_t PeriodValue = 0;
if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1IF)){
// 获取当前通道的捕获值
RisingEdgeTime = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
if(PreviousRisingEdgeTime!=0){
PeriodValue=RisingEdgeTime-PreviousRisingEdgeTime;
if(RisingEdgeTime<PreviousRisingEdgeTime){
PeriodValue+=htim->Init.Period+1;
}
// 计算高电平持续的时间长度
FallingEdgeTime=PeriodValue-DutyCycleMeasurement_GetDutyCycle();
// 更新上一次记录到的上升沿时刻
PreviousRisingEdgeTime=RisingEdgeTime;
// 调用自定义函数完成最终百分比转换
DutyCyclePercentage=(float)(DutyCycleMeasurement_GetDutyCycle()*100)/((float)PeriodValue);
printf("Frequency:%luHz,Duty Cycle:%.2f%%\r\n",SystemCoreClock/PeriodValue,DutyCyclePercentage);
}else {
PreviousRisingEdgeTime=RisingEdgeTime;
}
}
}
// 自定义辅助函数返回实际测得的高低脉冲宽度之差作为占空比参数
uint32_t DutyCycleMeasurement_GetDutyCycle(){
return FallingEdgeTime;
}
```
上述代码片段展示了如何利用STM32CubeMX生成的基础框架配合HAL库APIs编写程序逻辑[^2]。注意这里假设已经完成了必要的硬件连接以及软件环境搭建工作,并且确保了正确的时钟源配置使得定时器能够正常运作。
阅读全文