TIM输入捕获---STM
一、简介
IC输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存在CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
每个高级定时器和通用定时器都拥有4个输入捕获通道
可配置为PWMI模式,同事测量频率和占空比
可配合主从触发模式。实现硬件全自动测量
二、工程代码
项目一:
程序现象:自己“测”自己;输入捕获模式测频率
配置流程:
1.RCC开启时钟
2.GPIO初始化,配置为输入模式
3.配置时基单元
4.配置输入捕获单元(捕获通道、捕获方式、输入捕获预分频器)
5.选择从模式触发源
6.触发之后进行的操作
7.开始定时器
接线:一根杜邦线一端接在单片机的PA6,另一端接在PA0
这个是输入捕获的代码,输出波形的代码在在我之前写的TIM输出比较的文章里面pwm_led.c里面;
pwm_ic.c
#include "stm32f10x.h" // STM32F10x外设库头文件
#include "pwm_ic.h" // PWM控制相关头文件
#include "delay.h" // 延时函数头文件
// 按键初始化函数
void PWM_IC_Init(void)
{
// 定义定时器基础结构体和输出比较结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure; // GPIO初始化结构体
TIM_ICInitTypeDef TIM_ICInitStruct; // 定时器输入捕获初始化结构体
// 使能TIM3和GPIOA的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能定时器TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
// 配置GPIOA的引脚6为定时器的输入引脚(PWM输入)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 配置GPIOA的Pin6
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引脚的速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 配置为输入下拉模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的Pin6引脚
/* 配置时钟源 */
TIM_InternalClockConfig(TIM3); // 选择TIM3为内部时钟源,若不调用此函数,TIM默认也是内部时钟
// 配置定时器基本参数
TIM_TimeBaseStructure.TIM_Period = 65535 - 1; // 自动重载值,定时器的计数周期为65535,即计数从0到65534,周期为65535个时钟周期
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频器值,定时器时钟源被分频为72MHz / 72 = 1000000Hz,即定时器时钟频率为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割设置为1,表示不进行时钟分割,保持时钟完整性
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式设置为向上计数模式,从0计数到自动重载值(65535)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器设置为0,不启用重复计数器,定时器只进行单次计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定时器TIM3,应用上述配置
// 配置定时器输入捕获参数
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // 使用TIM3的通道1
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 选择直接连接到TI1的输入信号
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 输入捕获预分频器为1
TIM_ICInitStruct.TIM_ICFilter = 0xF; // 输入滤波器设置为最大滤波值
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿触发输入捕获
TIM_ICInit(TIM3, &TIM_ICInitStruct); // 初始化输入捕获
// 配置触发器
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 选择输入触发器为TIM3通道1的输入(TI1)
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 配置为复位模式,作为从设备
// 启动定时器TIM3
TIM_Cmd(TIM3, ENABLE); // 启动TIM3,使其开始计数并处理输入捕获
}
// 获取PWM频率的函数
u32 IC_GetFreq(void)
{
// 计算PWM频率(单位为Hz),根据捕获到的输入信号周期
return 1000000 / (TIM_GetCapture1(TIM3) + 1); // 以微秒为单位进行计算
}
pwm_ic.h
#ifndef __PWM_IC_H
#define __PWM_IC_H
#include "stm32f10x.h"
#include "sys.h"
void PWM_IC_Init(void);
u32IC_GetFreq(void);
#endif
main.c
#include "stm32f10x.h" // 设备相关头文件
#include "pwm_ic.h" // PWM控制相关头文件
#include "delay.h" // 延时相关头文件
int main(){
PWM_IC_Init(); // 初始化PWM
delay_init(); // 初始化延时函数
/*使用PWM模块提供输入捕获的测试信号*/
PWM_SetPrescaler(720 - 1);//PWM频率Freq = 72M / (PSC + 1) / 100//这两个函数在之前输出比较文章中pwm_led.c里面
PWM_SetCompare1(50);//PWM占空比Duty = CCR / 100
while(1)
{
IC_GetFreq();
}
}
项目二:
程序现象:PWMI模式测频率占空比
pwmi_ic.c
#include "stm32f10x.h" // STM32F10x外设库头文件
#include "pwmi_ic.h" // PWM控制相关头文件
#include "delay.h" // 延时函数头文件
// 按键初始化函数
void PWMI_IC_Init(void)
{
// 定义定时器基础结构体和输出比较结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure; // GPIO初始化结构体
TIM_ICInitTypeDef TIM_ICInitStruct; // 定时器输入捕获初始化结构体
// 使能TIM3和GPIOA的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能定时器TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
// 配置GPIOA的引脚6为定时器的输入引脚(PWM输入)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 配置GPIOA的Pin6
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引脚的速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 配置为输入下拉模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的Pin6引脚
/* 配置时钟源 */
TIM_InternalClockConfig(TIM3); // 选择TIM3为内部时钟源,若不调用此函数,TIM默认也是内部时钟
// 配置定时器基本参数
TIM_TimeBaseStructure.TIM_Period = 65535 - 1; // 自动重载值,定时器的计数周期为65535,即计数从0到65534,周期为65535个时钟周期
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频器值,定时器时钟源被分频为72MHz / 72 = 1000000Hz,即定时器时钟频率为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割设置为1,表示不进行时钟分割,保持时钟完整性
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式设置为向上计数模式,从0计数到自动重载值(65535)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器设置为0,不启用重复计数器,定时器只进行单次计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定时器TIM3,应用上述配置
// 配置定时器输入捕获参数
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // 使用TIM3的通道1
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 选择直接连接到TI1的输入信号
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 输入捕获预分频器为1
TIM_ICInitStruct.TIM_ICFilter = 0xF; // 输入滤波器设置为最大滤波值
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿触发输入捕获
TIM_ICInit(TIM3, &TIM_ICInitStruct); // 初始化输入捕获
// // 配置定时器输入捕获参数
// TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; // 使用TIM3的通道2
// TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI; // 选择交叉输入到TI1的输入信号
// TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 输入捕获预分频器为1
// TIM_ICInitStruct.TIM_ICFilter = 0xF; // 输入滤波器设置为最大滤波值
// TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling; // 下降沿触发输入捕获
// TIM_ICInit(TIM3, &TIM_ICInitStruct);
TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
// 配置触发器
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 选择输入触发器为TIM3通道1的输入(TI1)
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 配置为复位模式,作为从设备
// 启动定时器TIM3
TIM_Cmd(TIM3, ENABLE); // 启动TIM3,使其开始计数并处理输入捕获
}
// 获取PWM频率的函数
u32 IC_GetFreq(void)
{
// 计算PWM频率(单位为Hz),根据捕获到的输入信号周期
return 1000000 / (TIM_GetCapture1(TIM3) + 1); // 以微秒为单位进行计算
}
u32IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1)* 100 / (TIM_GetCapture1(TIM3) + 1);
}
pwmi_ic.h
#ifndef __PWMI_IC_H
#define __PWMI_IC_H
#include "stm32f10x.h"
#include "sys.h"
void PWMI_IC_Init(void);
u32IC_GetFreq(void);
u32IC_GetDuty(void);
#endif
main.c
#include "stm32f10x.h" // 设备相关头文件
#include "pwmi_ic.h" // PWM控制相关头文件
#include "delay.h" // 延时相关头文件
int main(){
PWMI_IC_Init(); // 初始化PWM
delay_init(); // 初始化延时函数
/*使用PWM模块提供输入捕获的测试信号*/
PWM_SetPrescaler(720 - 1);//PWM频率Freq = 72M / (PSC + 1) / 100
PWM_SetCompare1(50);//PWM占空比Duty = CCR / 100
while(1)
{
IC_GetFreq();
IC_GetDuty();
}
}
原文地址:https://blog.csdn.net/2301_76762351/article/details/144270445
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!