Barbeque了 2023-06-25 16:41 采纳率: 100%
浏览 38
已结题

STM32定时器输入捕获测量频率

STM32F103C6T6不能使用同一个定时器的多个通道进行测量频率,只使用通道一时可以测量出频率,但是使用其他通道就不行,代码如下,看半天没看出哪有问题。


```c
void IC2Init(void)
{
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 2. GPIO初始化
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // 上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // 上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 3. 配置时基单元
    TIM_InternalClockConfig(TIM2);    // 选择内部时钟
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    
    TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;    // ARR,该值应该设置的尽量大,防止计数溢出
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;    // PSC,它的值决定了测周法的标准频率fc,它的值要根据测量信号的频率范围来调整,这里fc为1MHz
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;    
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    // 4. 配置输入捕获单元
    TIM_ICInitTypeDef TIM_ICInitStruct;
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;                    // IC通道1
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                            // 滤波属性(滤波检测频率应远高于被测频率)
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;        // 边沿检测
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;                // 触发信号分频器
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;    // 配置数据选择器(这里选择直连通道)
    TIM_ICInit(TIM2, &TIM_ICInitStruct);
    
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;                    // IC通道2
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                            // 滤波属性(滤波检测频率应远高于被测频率)
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;        // 边沿检测
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;                // 触发信号分频器
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;    // 配置数据选择器(这里选择直连通道)
    TIM_ICInit(TIM2, &TIM_ICInitStruct);

    // 5. 选择从模式的触发源
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
    
    // 6. 选择从模式触发后执行的操作
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
    
    // 7. 开启定时器
    TIM_Cmd(TIM2, ENABLE);
}

uint32_t IC_GetFreq21(void)
{
    // 测周法标准频率为1MHz
    return 1000000 / TIM_GetCapture1(TIM2) ;    
}
uint32_t IC_GetFreq22(void)
{
    // 测周法标准频率为1MHz
    return 1000000 / TIM_GetCapture2(TIM2);
}

```

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 6月25日
    • 赞助了问题酬金15元 6月25日
    • 创建了问题 6月25日

    悬赏问题

    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音
    • ¥30 Pytorch深度学习服务器跑不通问题解决?
    • ¥15 部分客户订单定位有误的问题
    • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
    • ¥15 Bug traq 数据包 大概什么价
    • ¥15 在anaconda上pytorch和paddle paddle下载报错
    • ¥25 自动填写QQ腾讯文档收集表