本次小节通过PA1输出指定频率的PWM波形,再通过PA6定时捕获功能实现测频功能。
操作流程如下:
1.开启相应的GPIO口时钟
2.定义GPIO结构体,初始化GPIO模式
3.开启定时器内部时钟
4.初始化TIM结构体,配置定时器相关参数(时基模块)
5.定义输入捕获结构体,初始化输入捕获的相关参数
6.选择TIM输入触发模式,和从模式
7.使能TIM
8.写获取频率和占空比的函数
具体代码如下:
#include "stm32f10x.h" // Device header
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;//PA6
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);//开启内部时钟
TIM_TimeBaseInitTypeDef TIM_TimebaseStruct;
TIM_TimebaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
TIM_TimebaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimebaseStruct.TIM_Period = 65536-1; //ARR // 最低测量频率=1M/65535
TIM_TimebaseStruct.TIM_Prescaler = 72-1; //PSC 标准频率fc/72=1MHz
TIM_TimebaseStruct.TIM_RepetitionCounter = 0;//高级定时器采用
TIM_TimeBaseInit(TIM3,&TIM_TimebaseStruct);
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ;//通道1
TIM_ICInitStructure.TIM_ICFilter = 0xf;//滤波0-0xff
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//直接
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);//自动把剩下的通道初始化成相反的配置(CH2)
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//输入沿
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式
TIM_Cmd(TIM3,ENABLE);//使能TIM
}
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1);//基准频率÷CCR1=被测频率
}
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);//(CCR2÷CCR1)× 100%
}
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}