6-7PWMI模式占空比

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);
	}
}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值