he与6-6的不同即为,有两条不同的输入捕获通道
IC输入捕获通道的代码
#include "stm32f10x.h" // Device header
void IC_Init(void)
{
//1.开启GPIO外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//开启TIM2时钟外设
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//选择时基单元的时钟
TIM_InternalClockConfig(TIM3);
//2.配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//结构体类型名
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//指定时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式,向上计数
//关键计数器的值(决定定时时间)
/*CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
例如1s = 1HZ
所以CK_CNT_OV = 1HZ = CK_PSC(72MHZ)/ (PSC + 1) / (ARR + 1)
最后保证PSC和ARR取值在0~65535
*/
//ARR多,PSC少 即高频率记比较多的数,反之亦然;
TIM_TimeBaseInitStructure.TIM_Period = 65536-1;//ARR自动重装器的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;//PSC预分频器的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值(高级计数器)
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//3.初始化输入捕获单元
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道参数
TIM_ICInitStructure.TIM_ICFilter = 0xF;//选择输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性选择上升沿和下降沿
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//选择触发信号分频器,只有1,2,4,8分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择触发信号从哪个引脚输入(直连通道,交叉通道)
//配置两个不同的通道同时捕获一个引脚的模式
TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);
//4.触发源选择
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
//5.选择从模式
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
//6.调用TIM_Cmd来启动定时器
TIM_Cmd(TIM3,ENABLE);
}
//返回最新的频率
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3)+1);
}
//获取占空比的函数
uint32_t IC_GetDuty(void)
{
//高电平的计数值存在CCR2里,整个周期的计数值存在CCR1里,所以占空比就是CCR2/CCR1
return (TIM_GetCapture2(TIM3) + 4)* 100 / (TIM_GetCapture1(TIM3) + 1);//CCR2/CCR1
//为了保证整数输出所以+了其他数字,其实可加可不加
}
//配置两个不同的通道同时捕获一个引脚的模式
TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);
核心
main
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
int main(void)
{
OLED_Init();
PWM_Init();
IC_Init();
OLED_ShowString(1,1,"Freq:00000HZ");
OLED_ShowString(2,1,"Duty:00%");
//频率1KHZ ,占空比50%
PWM_SetPrescaler(7200-1); //频率 = 72M/(PSC+1)/100
PWM_SetCompare1(99); //占空比 = CCR/(ARR+1)
while (1)
{
OLED_ShowNum(1,6,IC_GetFreq(),5);
OLED_ShowNum(2,6,IC_GetDuty(),2);
}
}