stm32f10x输入捕获测占空比代码完整版
时间: 2023-10-03 18:10:07 浏览: 80
stm32标准库输入捕获测频率、占空比.rar
5星 · 资源好评率100%
以下是一个使用STM32F10x定时器输入捕获测量PWM占空比的完整代码:
```c
#include "stm32f10x.h"
#define TIM_PERIOD 65535 // 定时器的周期,16位计数器最大值
// 定义用于存储输入捕获值的变量
__IO uint16_t IC1Value = 0;
__IO uint16_t IC2Value = 0;
// 定义用于存储测量结果的变量
__IO uint32_t DutyCycle = 0;
__IO uint32_t Frequency = 0;
int main(void)
{
// 启用定时器2和GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0和PA1为输入模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置定时器2为输入捕获模式
TIM_ICInitTypeDef TIM_ICInitStruct;
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 = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
// 启用定时器2中断
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
// 启用定时器2
TIM_Cmd(TIM2, ENABLE);
// 设置定时器2的自动重载寄存器
TIM_SetAutoreload(TIM2, TIM_PERIOD);
while (1)
{
// 主循环中不需要做任何事情
}
}
void TIM2_IRQHandler(void)
{
// 检查捕获事件是否是由输入捕获通道1触发的
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
// 获取输入捕获值
IC1Value = TIM_GetCapture1(TIM2);
// 清除中断标志位
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
}
// 检查捕获事件是否是由输入捕获通道2触发的
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
// 获取输入捕获值
IC2Value = TIM_GetCapture2(TIM2);
// 计算PWM占空比和频率
if (IC2Value > IC1Value)
{
DutyCycle = ((IC2Value - IC1Value) * 100) / (IC2Value);
Frequency = SystemCoreClock / (TIM_PERIOD * (IC2Value - IC1Value));
}
else
{
DutyCycle = ((IC1Value - IC2Value) * 100) / (IC1Value);
Frequency = SystemCoreClock / (TIM_PERIOD * (IC1Value - IC2Value));
}
// 清除中断标志位
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
}
}
```
在以上代码中,我们使用TIM2定时器的通道1和通道2进行输入捕获,然后通过计算PWM占空比和频率来测量输入的PWM信号。在主循环中没有做任何事情,因为我们的测量过程完全依靠中断来完成。当有输入捕获事件发生时,中断服务程序会被调用,我们在其中处理捕获到的数据并计算结果。最终的结果存储在全局变量DutyCycle和Frequency中,可以在需要的时候使用。
阅读全文