蓝桥杯物联网竞赛_STM32L071KBU6_解决脉冲输出频率数值不稳定BUG

问题:

在用脉冲进行做题的时候发现脉冲输出的频率随着脉冲数值增大而越来越不稳定

典型的情况是10000HZ的时候会变成0HZ或者infHZ也就是无穷大

代码:

c 复制代码
int BEIGNNUMBER = 0;
int ENDNUMBER = 0;
unsigned char STATETIM = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	//OLED_ShowString(0, "ok");
	if(STATETIM == 0){
		STATETIM ++;
		BEIGNNUMBER = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_3, TIM_ICPOLARITY_FALLING);
	}else if(STATETIM == 1){
		STATETIM ++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_3, TIM_ICPOLARITY_RISING);
	}else if(STATETIM == 2){
		STATETIM ++;
		ENDNUMBER = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);
	}
}

void Function_PluseShow(){
  if(STATETIM == 3){
		PLUSEVALUE = (int)(10000 * 1.0 / (ENDNUMBER - BEIGNNUMBER));
		myprintf(2, "     %dHZ      ",  PLUSEVALUE);
		//myprintf(0, "   %d  ", ENDNUMBER - BEIGNNUMBER); 
		//myprintf(2, "   %.1f   ", (ENDNUMBER - BEIGNNUMBER) / 10.0);
		STATETIM = 0;
	  HAL_Delay(200);
	}
}

原因:

原因出在了我CUBMX中TIM3配置的预分频为3200 - 1也就是记一次数花费0.1ms

当脉冲频率足够大的时候也就是说单位时间的脉冲个数也会足够多,此时对于单个脉冲所占据的时间就会越小,以至于小于0.1ms,由于计数器记的数肯定是整数,然而单个脉冲持续时间小于0.1ms,那么计数器记的数只有0或者1,当计数器记的数为0也就是ENDNUMBER - BEIGNNUMBER为0,也就造成了除法分母为0的操作,自然会出BUG

解决方法:

将预分频调成32 - 1也就是记录单个数耗费0.001ms那么脉冲自然而然稳定

c 复制代码
void Function_PluseShow(){
  if(STATETIM == 3){
		PLUSEVALUE = (int)(1000000 * 1.0 / (ENDNUMBER - BEIGNNUMBER));
		myprintf(2, "     %dHZ      ",  PLUSEVALUE);
		//myprintf(0, "   %d  ", ENDNUMBER - BEIGNNUMBER); 
		//myprintf(2, "   %.1f   ", (ENDNUMBER - BEIGNNUMBER) / 10.0);
		STATETIM = 0;
	  HAL_Delay(200);
	}
}

Function函数记得也要改一下

相关推荐
MetrixAeroCore3 小时前
美国物联网设备出海通信适配指南|北美全域组网合规方案(MetrixAeroCore)
物联网
破晓单片机6 小时前
067、STM32项目分享:语音儿童学习书桌系统
stm32·单片机·嵌入式硬件
欢乐熊嵌入式编程6 小时前
嵌入式 + MQTT:数据上传到阿里云实战(从0到1完整教程)
stm32·单片机·mqtt·freertos·嵌入式架构·efr32
破晓单片机9 小时前
068、STM32项目分享:智能小区门禁系统
stm32·单片机·嵌入式硬件
AGIPlayer9 小时前
没有生态的大模型不算前沿
大数据·人工智能·物联网
TDengine (老段)10 小时前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据
bkspiderx11 小时前
Windows DLL核心技术:深入理解__declspec(dllexport)与__declspec(dllimport)
windows·stm32·单片机·dllimport·dllexport·windows dll·__declspec
m0_5474866611 小时前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
砍材农夫12 小时前
物联网实战|Spring Boot + Netty 搭建 MQTT 消息路由与流转层
java·spring boot·后端·物联网·spring
星夜夏空9913 小时前
STM32单片机学习(37) —— PWR和BKP
stm32·单片机·学习