(蓝桥杯嵌入式)多通道输入捕获频率占空比

目录

1.pwm_in.c

2.pwm_in.h

3.捕获显示与100ms切换一次捕获通道


1.pwm_in.c


#include "pwm_in.h"

void TIM3_PWM_IN(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
  TIM_ARRPreloadConfig(TIM3, ENABLE);
  TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
  TIM_Cmd(TIM3, ENABLE);

}

float TIM3_CH1_Duty=0,TIM3_CH2_Duty=0;
u8 Number=0,CH_Flag=0;
u16 ReadValue1=0,ReadValue2=0;
u16 CH1_FRQ=0,CH2_FRQ=0;


void TIM3_IRQHandler(void)
{
		if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
    {
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
		if(CH_Flag==1)  //在1ms定时中断中,100ms改变一次CH_Flag的值               
   	{
			if(Number==0)
			{
				TIM_SetCounter(TIM3,0);
				Number=1;
				TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);
			}
			else if(Number==1)
			{
				Number=2;
				TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);
				ReadValue1=TIM_GetCounter(TIM3);
			}
			else if(Number==2)
			{
				Number=0;
				ReadValue2=TIM_GetCounter(TIM3);
				CH1_FRQ=1000000/ReadValue2;
				TIM3_CH1_Duty=ReadValue1*100/ReadValue2;
			}
		}
   }
		
	 		if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
    {
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
		if(CH_Flag==0)
   	{
			if(Number==0)
			{
				TIM_SetCounter(TIM3,0);
				Number=1;
				TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);
			}
			else if(Number==1)
			{
				Number=2;
				TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising);
				ReadValue1=TIM_GetCounter(TIM3);
			}
			else if(Number==2)
			{
				Number=0;
				ReadValue2=TIM_GetCounter(TIM3);
				CH2_FRQ=1000000/ReadValue2;
				TIM3_CH2_Duty=ReadValue1*100/ReadValue2;
			}
		}
   }
	 
	 
}













2.pwm_in.h


#ifndef __PWM_IN_H
#define __PWM_IN_H

#include "stm32f10x.h"

void TIM3_PWM_IN(void);

extern float TIM3_CH1_Duty,TIM3_CH2_Duty;
extern u8 Number,CH_Flag;
extern u16 ReadValue1,ReadValue2;
extern u16 CH1_FRQ,CH2_FRQ;

#endif /* __PWM_IN_H */

3.捕获显示与100ms切换一次捕获通道

	//TIM3输入捕获通道100ms切换一次
	if(TIM3_Count==100)
	{
		TIM3_Count=0;
		CH_Flag^=1;
		Number=0;
	}


    sprintf((char*)DisBuff,"CH1_FRQ:%05d", CH1_FRQ);
LCD_DisplayStringLine(Line5,DisBuff);	
	sprintf((char*)DisBuff,"CH2_FRQ:%05d", CH2_FRQ);
LCD_DisplayStringLine(Line6,DisBuff);	
	sprintf((char*)DisBuff,"TIM3_CH1_Duty: %.2f",TIM3_CH1_Duty);
LCD_DisplayStringLine(Line7,DisBuff);	
	sprintf((char*)DisBuff,"TIM3_CH2_Duty: %.2f",TIM3_CH2_Duty);
LCD_DisplayStringLine(Line8,DisBuff);	






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CubeIDE是一个嵌入式开发工具,可以帮助开发者简化嵌入式系统的开发过程。在CubeIDE中使用定时器进行输入捕获是一种常见的应用场景。 输入捕获是指通过定时器来测量外部信号的频率或脉宽,并将测量结果保存在寄存器中。这种功能在很多应用中都有广泛的应用,比如测量脉冲信号的频率、计算PWM波的占空比、检测编码器的旋转等等。 在CubeIDE中进行定时器输入捕获的步骤大致如下: 1. 打开CubeIDE,创建一个新的工程。 2. 在工程上右键点击,选择“添加功能”,然后选择“定时器”。 3. 根据硬件平台选择相应的定时器,比如TIM1、TIM2等。 4. 在定时器配置页面,选择输入捕获模式。 5. 设置捕获触发方式,可以选择边沿触发或者脉冲宽度触发,根据实际需求进行配置。 6. 设置定时器的溢出计数值,根据需求设置适当的值。 7. 配置输入捕获通道和管脚,选择要测量的输入信号通道和其对应的引脚。 8. 配置输入捕获的时间基准,可以选择外部时钟源或者内部时钟源。 9. 在程序中编写相应的中断服务程序,处理捕获到的数据。 10. 编译并下载程序到目标硬件平台上。 通过以上步骤,我们就可以在CubeIDE中完成定时器的输入捕获功能的配置和开发。定时器输入捕获功能的实现可以根据不同的需求进行定制,比如可以通过中断服务程序处理捕获到的数据,或者将数据传输给其他模块进行处理和分析。总的来说,CubeIDE提供了方便易用的界面和工具,使得我们能够更快速地进行定时器输入捕获的开发和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值