20年吉林省综合测评
由于当时不让带手机,这里凭借深刻的记忆来描述一下题目要求:
- 设计一个波形发生器,产生200-1600Hz连续可调的方波
- 设计一个二分频器,对1生成的信号进行二分频
- 根据波形发生器的频率实现以200Hz为单位依次点亮八个LED灯。
实际条件:一片CD4011,一块洞洞板,一片stm32f103zet6最小系统,八个LED,电阻电容导线焊锡等
软件部分
使用cube MX + Keil5快速建立程序框架,首先打开程序新建工程,详细流程请参考我之前的博客:
https://editor.csdn.net/md/?articleId=108711636
硬件队友焊接时,我们写测频程序,在硬件没有焊出前需要把程序按照理想情况调试好(理想情况指波形是稳定的方波,上升沿下降沿没有剧烈的抖动,频率稳定,电压合适),下面直接贴出我调试好的程序。
使用定时器2测量两个上升沿之间的实际时间,倒数即为频率,然后把得到的频率传到一个封装好的函数,题目要求频率误差在10%以内,判断是否在范围内,然后按字输出对应的管脚点亮LED。
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** <h2><center>© Copyright (c) 2020 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 <stdio.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#ifdef __GNUC_
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint8_t ledduan[8]={0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; //0~8 LED 共阳极
/* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
uint32_t capture[2];
uint16_t V,F;
/* 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 */
void light(uint16_t L)
{if(L>190&&L<210) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[0])); return;} else if (L>390&&L<410) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[1])); return; }else if (L>590&&L<605) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[2])); return; }else if (L>790&&L<805) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[3])); return; }else if (L>990&&L<1010) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[4])); return;}else if (L>1190&&L<1210) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[5])); return;}else if (L>1390&&L<1410) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[6])); return;}else if (L>1590&&L<1610) { GPIO_Write(GPIOC,(uint16_t)(~ledduan[7])); return;}
}
/* 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_TIM2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("F: %2d\r\n",F*2);HAL_Delay(100);light(F*2);}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{UNUSED(htim); static uint8_t i;if(htim->Instance == htim2.Instance){capture[i] = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2); i++;if(i==2) { i=0;V = capture[1]-capture[0]; }F = 1000000 / V; //得到实际频率}
}
/* 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****/
由于HAL库并没有字输出函数,这里参考标准库自己封装一个,ODR寄存器对应16个管脚,1高0低。
程序调试完成后,使用信号发生器产生一个100-800Hz的3-5V的方波连接到PA1脚,使用USB转TTL(核心板有集成CH340芯片不需要此步骤)对应连接到开发板,使用串口调试助手观察打印信息,验证程序测频是否准确。
硬件部分
一片CD4011,集成4个与非门,两个用来产生方波,两个用来构成分频器。具体原理图如下。
Q和Q非任取一个即可,实测也可以直接焊在一起。
以上就是全部实测可行的方案,但是焊接这玩意有点玄学,可能由于一个小问题就是不好使,如果产生方波后,波形不稳定可以在CD4011的VCC与GND间加一个103电容,如果还不行就接一个负载(加一个电阻在输出和地之间)。如果不能产生方波那就…程序产生PWM频率根据电位器电压调节,如果分频器焊不出来那就继续软件二分频,直接使用IO外部中断,中断两次翻转IO电平即可。
20年吉林省综合测评相关推荐
- C/C++学生综合测评系统[2023-03-18]
C/C++学生综合测评系统[2023-03-18] 题目14 学生综合测评系统的设计与实现 一.问题描述: 每个学生的综合测评信息包括:学号.姓名.语文成绩.数学成绩.外语成绩.考试平均成绩.同学互评 ...
- 大学计算机学生成绩综合管理系统,大学综合测评成绩管理系统的研究 计算机专业毕业论文.doc...
UNIVERSITY 毕业设计(论文) 设计(论文)题目: 系 部: 计算机科学与技术系 专 业: 计算机科学与技术 学 生 姓 名: 班 级: 学号 指导教师姓名: 职称 讲师 最终评定成绩 教务处 ...
- 计算机二级能加综合测评,2016综合测评加分细则.doc
2016综合测评加分细则 生化学院2012年综合测评说明 总 则 一.学生综合测评内容:以德育.学业.能力.个性发展为一级评价指标,其中德育.学业.能力为基本指标,个性发展为附加指标. 二.学生综合测 ...
- 大学综合测评中,使用VBA代码自动完成EXCEL成绩表
更新:2014-04-18 下午 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- 2019年全国电子设计大赛综合测评感悟
第一次写博客,不太会格式,大家将就看吧. 2019年国赛综合测评题目大概要求是利用四运放LM324和四通道与非门74LS00芯片各一片,设计产生: (1)频率可调(19-21KHz),幅度不小于3.4 ...
- MySQL学生综合测评系统_大学生综合测评系统的设计和实现(MySQL)
大学生综合测评系统的设计和实现(MySQL)(任务书,开题报告,中期检查表,毕业论文20000字,程序代码,数据库) 摘 要 本文详细介绍了本系统设计的基本方法.系统的需求分析.系统的架构设计和系统 ...
- java毕业设计——基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码)——综合测评系统
基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Applet+access的综合测评系统设计与实现,文章末尾附有本毕业设计的 ...
- 学生计算机测评安排,计算机系学生综合测评细则
为认真贯彻执行党的教育方针,促进大学生德.智.体全面发展,鼓励学生刻苦学习.争先创优,提高综合素质,根据上级有关文件精神和<集宁师范学院学生综合测评办法>的要求,特制定本细则. 一.综合测 ...
- 大学生综合测评系统(C++)
大学生综合测评系统(C++) #include<iostream> #include<fstream> #include<string> #include<i ...
最新文章
- oracle元数据存储在表空间,[Oracle] dbms_metadata.get_ddl 的使用方法总结
- Markdown基本语法【转】
- 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展
- kafka学习(二)kafka工作流程分析
- C++创建对象:栈和堆的区别
- 如何配置x225/x235/x335/x345的LSI SCSI卡实现RAID-1功能
- matlab的一些关于块分类的函数~~~
- 躺枪实惨!与新冠病毒“重名”,这款墨西哥国民啤酒宣布暂停生产...
- orchard文档之-搜索和索引
- android谷歌反地理,android – 谷歌地理编码服务是不可用的(协调地址)
- 软件测试--04测试用例/测试方法
- python shell 方向键不可用
- 定位CPU高问题三把斧
- SPLUS数据库导入导出操作
- 证件照素材大合集(全网最全版本),满足证件照的一切需求!
- python爬取动态页面图片_python动态网页爬取:爬取pexel上的图片
- iOS安全逆向之旅---逆向基本知识概要介绍
- 清北学堂2019.8.7
- utils方法,时间工具,数组排序,违禁词检测
- 申报绿色工厂的条件和标准是什么?