STM32F103vet6 TIM4 PD12/PD13双通道PWM捕捉程序

STM32F103vet6 TIM4 PD12/PD13双通道PWM捕捉程序

作者:方工,2019.3.4

typedef struct _pwm_catch_parameter
{
	//PWM捕获 周期A
	u16 PeriodA1;
	u16 PeriodA2;
	u16 PeriodA;
	u16 Period_A;//送风机转速RPM
	//PWM捕获 周期B
	u16 PeriodB1;
	u16 PeriodB2;
	u16 PeriodB;
	u16 Period_B;//排风机转速RPM
}pwm_catch_parameter;
extern pwm_catch_parameter PWM_Catch;
void PWM_IN_Config(void);

pwm_catch_parameter PWM_Catch;

void PWM_IN_Config(void)
{
	//这些都是一些结构体的声明,去下载一本库函数手册一看就知道 很简单的?
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_ICInitTypeDef TIM4_ICInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	//这个就是时钟使能了 我使能TIM4 和GPIOD
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能AFIO时钟。重映射必须使能AFIO时钟
	GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);//开启重映射

	//输入捕捉,当然端口要设置为输入模式了
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_Init(GPIOD, &GPIO_InitStructure);

	TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//这个就是设置计数值的最大值,就是这个寄存器能计多少个数,一般设置成0XFFFF
	TIM_TimeBaseStructure.TIM_Prescaler = 1000 -1;//上面这个计数寄存器的频率的分频系数 分频的值=psc+1 所以你要2分频的话,psc= 1,以此类推
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割 这在有一些情况用,这里我们不受影响?
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数向上计数
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化

	TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道1
	TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发还是下降沿触发的设置
	TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TT1上
	TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频 不分频
	TIM4_ICInitStructure.TIM_ICFilter = 0x01; //滤波的问题 先不管
	TIM_ICInit(TIM4, &TIM4_ICInitStructure);

	TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2; 
	TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
	TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
	TIM4_ICInitStructure.TIM_ICFilter = 0x01;
	TIM_ICInit(TIM4, &TIM4_ICInitStructure);

	//PWM捕获 周期A
	PWM_Catch.PeriodA1=0;
	PWM_Catch.PeriodA2=0;
	PWM_Catch.PeriodA=0;
	//PWM捕获 周期B
	PWM_Catch.PeriodB1=0;
	PWM_Catch.PeriodB2=0;
	PWM_Catch.PeriodB=0;

	//中断设置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4发生中断 其实就是上面发生你设置上升沿和下降沿触发事件
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占中断等级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从中断等级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
	NVIC_Init(&NVIC_InitStructure); //初始化?

	TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_CC2,ENABLE);//使能各个中断
	TIM_Cmd(TIM4,ENABLE ); //使能定时器TIM4
}

void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) //CH1通道(PB6)发生触发事件
	{
		PWM_Catch.PeriodA1=TIM_GetCapture1(TIM4);
		if(PWM_Catch.PeriodA1>PWM_Catch.PeriodA2)
			PWM_Catch.PeriodA=PWM_Catch.PeriodA1-PWM_Catch.PeriodA2;
		else PWM_Catch.PeriodA=0xffff-PWM_Catch.PeriodA+PWM_Catch.PeriodA2;
		PWM_Catch.PeriodA2=PWM_Catch.PeriodA1;
	}

	if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET) //CH2通道(PB7)发生触发事件
	{
		PWM_Catch.PeriodB1=TIM_GetCapture2(TIM4);
		if(PWM_Catch.PeriodB1>PWM_Catch.PeriodB2)
			PWM_Catch.PeriodB=PWM_Catch.PeriodB1-PWM_Catch.PeriodB2;
		else PWM_Catch.PeriodB=0xffff-PWM_Catch.PeriodB+PWM_Catch.PeriodB2;
		PWM_Catch.PeriodB2=PWM_Catch.PeriodB1;
	}

	TIM_ClearITPendingBit(TIM4, TIM_IT_CC1|TIM_IT_CC2); //清楚中断标志
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要配置STM32F103VET6的定时器TIM8来生成PWM信号,可以按照以下步骤进行操作: 1. 首先,要确保您已经熟悉STM32CubeMX工具,并且已经创建了一个新的工程。 2. 打开STM32CubeMX工具,选择正确的芯片型号(STM32F103VET6)并创建一个新的工程。 3. 在Pinout & Configuration选项卡中,选择TIM8并将其配置为PWM模式。您可以选择一个可用的PWM输出引脚,并将其分配给TIM8。 4. 在Configuration选项卡中,配置TIM8的基本设置。您可以设置TIM8的时钟源、预分频因子和计数器周期。这些设置将根据您的具体需求而定。 5. 在Configuration选项卡中,选择TIM8的通道并配置为PWM输出模式。您可以设置PWM的占空比、极性和输出比较模式。 6. 在Configuration选项卡中,配置TIM8的时钟使能和DMA使能(如果需要)。 7. 单击Generate Code按钮生成代码,并将生成的代码导入您的开发环境中。 8. 在生成的代码中,找到TIM8的初始化函数,并调用该函数来初始化TIM8。确保在初始化之前先使能相关的时钟。 9. 在生成的代码中,找到设置PWM占空比的函数,并调用该函数来设置PWM的占空比。您可以根据需要在程序中改变占空比的值。 10. 最后,编译并下载代码到您的STM32F103VET6开发板上。启动程序后,您应该能够在相应的PWM输出引脚上看到生成的PWM信号。 希望这些步骤能帮助您成功配置定时器TIM8并生成PWM信号。如果您有任何进一步的问题,请随时提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值