标题STM32Cube配置等精度测频和测相位差

一、测量精度:

1、频率精度

频率测量、周期测量的信号频率范围扩展为1Hz~20MHz(这里由于信号发生器最高产生20MHz频率,所以更高频率未尝试,预计更高可达到50MHz),频率测量、周期测量的测量误差为0.000001.

2、相位差精度

相位差测量,可以达到量程:0~360°;测量准确度:1°;分辨率:0.1°的题目要求

二、项目配置

1、时钟配置

stm32F429最高主频为168MHz

配置时钟源

2、定时器配置

  1. Time1配置
  2. Time2配置
  3. Time3配置

  4. Time4配置
  5. Time5配置
  6. Time8配置
  7. Time9配置
  8. Time12配置
  9. 定时器优先级配置

3、生成工程配置


3、串口配置

配置两个串口,一个收一个发,防止数据传输时大彩屏卡死;

三、Keil5编写代码

1、main函数代码

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "base.h"       //包含基本按键、灯、位带操作等
#include "stdio.h"
#include "head_define.h"
#include "Algorithm.h"
#include "arm_math.h"
#include "hmi_user_uart.h"
#include "cmd_process.h"
#include "outputdata.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define Period_Num 1
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//*测频测周变量定义*/
uint8_t     TIM4CH1_CAPTURE_STA=0X80;      //输入捕获状态
uint32_t    TIM5_COUNTER_VAL[Period_Num];           //定时器1计数组,测系统时钟
uint32_t    TIM2_COUNTER_VAL[Period_Num];          //定时器2计数组,被测信号周期
float       TIM5_COUNTER_Val;               //定时器1计数值,测系统时钟
float       TIM2_COUNTER_Val;               //定时器2计数值,被测信号周期
float       TIM_FREQ;                       //频率值
float       TIM_period;                     //周期值
uint8_t     TIM4CH1_CAPTURE_GATE=0;         //预设闸门标志位
uint8_t     TIM4CH1_CAPTURE_STB=0;          //数组存满标志位
static uint8_t     i,j=0;                       //数组用
uint32_t    TIM5_COUNTER_TEMP;              //定时器1计数滤波
uint32_t    TIM2_COUNTER_TEMP;              //定时器2计数滤波
float       TIM_FREQ2;
float       TIM_FREQ3;
float       TIM_FERQ[5];/*相位变量定义*/
uint32_t capture_period=0,capture_sta=0,capture_period1=0,capture_sta1=0;
float Phase=0,capture_period2=0;
//校准后的频率
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_TIM2_Init();MX_TIM3_Init();MX_TIM4_Init();MX_TIM5_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();MX_TIM8_Init();MX_TIM9_Init();MX_TIM12_Init();/* USER CODE BEGIN 2 */TFT_Init();    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);  //使能PWM波HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);  //使能PWM波 HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1); //使能TIM4输入捕获中断__HAL_TIM_ENABLE_IT(&htim4, TIM_CHANNEL_1); //使能更新中断HAL_TIM_Base_Start_IT(&htim1);             //使能TIM5定时器中断HAL_TIM_IC_Start_IT(&htim9,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_1);
//  HAL_TIM_Base_Start_IT(&htim1);//使能定时器1中断__HAL_TIM_SET_COUNTER(&htim5,0);      //定时器1清零__HAL_TIM_SET_COUNTER(&htim2,0);      //定时器2清零 TIM4CH1_CAPTURE_GATE = 1;               //开启预设闸门/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */capture_period2=capture_period/2.0;Phase=((capture_period1-capture_period2)/capture_period1)*360.0+21;SetTFTText(0,3,"%.1f度",Phase);SetTFTText(0,5,"%.2f",10.2);HAL_Delay(100);if(TIM4CH1_CAPTURE_STB)//判断数组是否存满{     TIM5_COUNTER_Val = (float) TIM5_COUNTER_TEMP / Period_Num;    //定时器1计数滤波(100个数组求平均)TIM2_COUNTER_Val = (float) TIM2_COUNTER_TEMP / Period_Num;    //定时器2计数滤波 (100个数组求平均)      TIM_FREQ = 1000.0*(TIM2_COUNTER_Val*3000.0)/TIM5_COUNTER_Val; //定时器2计数值*定时器1频率/定时器1计数值if(TIM_FREQ<=300){TIM_FREQ2=TIM_FREQ*1.00020;TIM_period=1.0/TIM_FREQ2;SetTFTText(0,1,"%.6fHz",TIM_FREQ2);SetTFTText(0,2,"%.6fs",TIM_period);}else{TIM_FREQ2=TIM_FREQ*0.9999480027038594;TIM_period=1.0/TIM_FREQ2;SetTFTText(0,1,"%.6fMHz",TIM_FREQ2/1000000.0);SetTFTText(0,2,"%.6fus",TIM_period*1000000.0);}TIM5_COUNTER_TEMP = 0;        //定时器5计数值清零TIM2_COUNTER_TEMP = 0;        //定时器2计数值清零TIM4CH1_CAPTURE_STB = 0;       //数组存满标志位TIM4CH1_CAPTURE_STA |= 0X80;    //输入捕获状态HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1);//使能TIM4输入捕获中断}  }/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage */__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
//定时器TIM4输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{    //***********************************************************************//测频率if(TIM4CH1_CAPTURE_GATE==0){   if(TIM4CH1_CAPTURE_STA&0X40)    //闸门关闭后第二次捕获到一个上升沿      {                         TIM4CH1_CAPTURE_STA = 0X80;      //标记成功捕获到闸门的一次高电平脉宽TIM5_COUNTER_VAL[i] = __HAL_TIM_GET_COUNTER(&htim5); //获取定时器1计数值TIM2_COUNTER_VAL[i] = __HAL_TIM_GET_COUNTER(&htim2); //获取定时器2计数值TIM5_COUNTER_TEMP += TIM5_COUNTER_VAL[i];TIM2_COUNTER_TEMP += TIM2_COUNTER_VAL[i];i++;if(i == Period_Num)//100个闸门周期{                        i = 0;TIM4CH1_CAPTURE_STB = 1;//数组存满标志位TIM4CH1_CAPTURE_STA = 0;//标记捕获到了上升沿状态位清零HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_1);  //关闭输入捕获}                 HAL_TIM_Base_Stop(&htim5);            //关闭定时器5HAL_TIM_Base_Stop(&htim2);            //关闭定时器2   __HAL_TIM_SET_COUNTER(&htim5,0);      //定时器5清零__HAL_TIM_SET_COUNTER(&htim2,0);      //定时器2清零                }}if(TIM4CH1_CAPTURE_GATE==1){if(TIM4CH1_CAPTURE_STA&0X80)//第一次捕获上升沿{TIM4CH1_CAPTURE_STA = 0X40;      //标记捕获到了上升沿开始计数HAL_TIM_Base_Start(&htim5);     //使能定时器1,对标准信号一直计数HAL_TIM_Base_Start(&htim2);     //使能定时器2,对被测信号一直计数}} ***********************************************************************//测相位 if(htim->Instance==TIM9){if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){if(!capture_sta){__HAL_TIM_SET_COUNTER(&htim9,0);}}     }if(htim->Instance==TIM12){if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){HAL_TIM_IC_Stop_IT(&htim9,TIM_CHANNEL_1);capture_period=__HAL_TIM_GET_COMPARE(&htim9,TIM_CHANNEL_1);  if(!capture_sta1){     __HAL_TIM_SET_COUNTER(&htim12,0);                capture_sta1=1;            }else{HAL_TIM_IC_Start_IT(&htim9,TIM_CHANNEL_1);__HAL_TIM_SET_COUNTER(&htim9,0);capture_period1=__HAL_TIM_GET_COMPARE(&htim12,TIM_CHANNEL_1);  capture_sta1=0;}}} }//定时器TIM5溢出中断处理回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(TIM1 == htim->Instance){ PCout(9)=~PCout(9);if(TIM4CH1_CAPTURE_GATE){TIM4CH1_CAPTURE_GATE = 0;}else {TIM4CH1_CAPTURE_GATE = 1;}}}    /* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

2、大彩屏

3、项目接线连接

需要将Time3的CH3连接到Time4中,否则无法测量。

4、项目工程代码

如需项目工程代码,请关注公众号:漂流小江,在公众号中即可获取代码

STM32Cube配置等精度测频和测相位差相关推荐

  1. 等精度测频原理--频率计

    等精度测频原理--频率计 本系统采用等精度测频的原理来测量频率,其原理如图2所示. 图2 等精度测频原理图 图2中的门控信号是可预置的宽度为Tpr的一个脉冲.CNT1和CNT2是两个可控计数器.标准频 ...

  2. 等精度测频法以及Verilog实现

    原理 常用的频率测量方法有直接测频法,测周期法和等精度测频法. 直接测频法是由时基信号产生闸门,对被测信号进行计数,此法只适合测高频信号.测周期法是由被测信号产生闸门,对时基脉冲进行计数,此法只适合测 ...

  3. VScode配置C语言环境 亲测 可用!!!

    VScode配置C语言环境 亲测 可用!!! 一.首先下载vscode,地址:https://code.visualstudio.com/ 此时我已经安装好了 二.对VSCode进行汉化安装插件Chi ...

  4. VM虚拟机Ubuntu配置静态ip,亲测有效

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VM虚拟机Ubuntu配置静态ip,亲测有效 一.先设置一下本机的VMnet8的ip吧 二.首先设置NAT 三.设置虚拟网络编辑器 四 ...

  5. PVE配置GPU显卡直通(亲测可用)

    PVE配置GPU显卡直通(亲测可用) 1.进入网址 2.输入用户名密码 3.点击local上传镜像 4.进入命令行模式 shell 5.换源 apt install apt-transport-htt ...

  6. STM32Cube配置串口

    配置串口 配置中断 时钟简单配置,生成代码即可 编写代码 使用STM32cube生成的代码,基本的串口初始化以及完成,首先在主函数中,while(1)前添加 HAL_UART_Receive_IT(& ...

  7. 华为交换机维护助手配置案例-定时任务自动ping测

    交换机型号:华为CE6851,锐捷F9300 业务场景:华为CE6851与锐捷F9300起3层互联,因为业务需要,需要华为交换机定时ping测与锐捷交换机互联的V6地址,所以在华为交换机配置维护助手, ...

  8. geany配置python win1_(亲测十分方便)win10下 配置python编辑器Geany配置

    (亲测十分方便)win10下 配置python编辑器Geany配置 (亲测,十分方便!)win10下 配置python编辑器Geany配置 一.Python的安装 Python直接可以在官网下载(ht ...

  9. VS2019中配置opencv4.3.0(亲测有效)

    写在前面:之前一直使用vs2017+opencv的配置,现在体验vs2019+opencv 4.3.0的配置.由于之前的配置相隔很久,忘记很多东西,如今重新配置还是踩了很多坑,记录如下,希望对读者有帮 ...

最新文章

  1. svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口
  2. Delphi 中的 XMLDocument 类详解(13) - 关于 XML 属性
  3. gini系数 决策树_决策树系列--ID3、C4.5、CART
  4. 如何注册MSN(Microsoft ID)
  5. matlab m语言电路仿真,基于Matlab的TFT-LCD解码电路的仿真设计(含程序)
  6. tensorflow.python.framework.tensor_shape.is_fully_defined()
  7. python爬取公众号,用最简单的方式爬虫
  8. JavaFx系列(二) Thread顯示進度窗的對話框
  9. GFP_KERNEL的作用
  10. 在actionbar中加入item的方法
  11. ggplot2默认字体修改
  12. 升级node时遇见一直报Could not access network location *:\……的错
  13. 免费的行程单打印软件
  14. 西安交通大学计算机张飞导师,航海学院邀请西安交通大学段战胜教授来院作学术报告...
  15. 《腾讯云CityBase产品白皮书》
  16. 将3060独显笔记本升级为高级AI工作站
  17. 线性回归(Lasso,Ridge,ElasticNet)调参
  18. 安装2008 R2 SQL,在安装程序支持文件时页面闪退
  19. 在windows系统写脚本,如何去掉回车换行符
  20. 我国老年人交通安全宣传教育现状及存在问题研究

热门文章

  1. 设备更新,工作室搬迁
  2. MongoDB权威指南读书笔记——CRUD
  3. 计算机二级抽题规律,计算机二级考试抽题规律计算机二级考试题及答案.doc
  4. Node.js 入门
  5. 追忆第一次南下深圳有哪些重大抉择(二)?
  6. MATLAB【函数和图像】
  7. android 非SDK API blacklist处理
  8. SSD 速度对编译的影响
  9. 《Google Android 开发入门与实战》
  10. 基于java的人力资源管理系统_基于JavaWeb的企业人力资源管理系统的设计与实现...