由于当时不让带手机,这里凭借深刻的记忆来描述一下题目要求:

  1. 设计一个波形发生器,产生200-1600Hz连续可调的方波
  2. 设计一个二分频器,对1生成的信号进行二分频
  3. 根据波形发生器的频率实现以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>&copy; 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年吉林省综合测评相关推荐

  1. C/C++学生综合测评系统[2023-03-18]

    C/C++学生综合测评系统[2023-03-18] 题目14 学生综合测评系统的设计与实现 一.问题描述: 每个学生的综合测评信息包括:学号.姓名.语文成绩.数学成绩.外语成绩.考试平均成绩.同学互评 ...

  2. 大学计算机学生成绩综合管理系统,大学综合测评成绩管理系统的研究 计算机专业毕业论文.doc...

    UNIVERSITY 毕业设计(论文) 设计(论文)题目: 系 部: 计算机科学与技术系 专 业: 计算机科学与技术 学 生 姓 名: 班 级: 学号 指导教师姓名: 职称 讲师 最终评定成绩 教务处 ...

  3. 计算机二级能加综合测评,2016综合测评加分细则.doc

    2016综合测评加分细则 生化学院2012年综合测评说明 总 则 一.学生综合测评内容:以德育.学业.能力.个性发展为一级评价指标,其中德育.学业.能力为基本指标,个性发展为附加指标. 二.学生综合测 ...

  4. 大学综合测评中,使用VBA代码自动完成EXCEL成绩表

    更新:2014-04-18       下午 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  5. 2019年全国电子设计大赛综合测评感悟

    第一次写博客,不太会格式,大家将就看吧. 2019年国赛综合测评题目大概要求是利用四运放LM324和四通道与非门74LS00芯片各一片,设计产生: (1)频率可调(19-21KHz),幅度不小于3.4 ...

  6. MySQL学生综合测评系统_大学生综合测评系统的设计和实现(MySQL)

    大学生综合测评系统的设计和实现(MySQL)(任务书,开题报告,中期检查表,毕业论文20000字,程序代码,数据库) 摘  要 本文详细介绍了本系统设计的基本方法.系统的需求分析.系统的架构设计和系统 ...

  7. java毕业设计——基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码)——综合测评系统

    基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Applet+access的综合测评系统设计与实现,文章末尾附有本毕业设计的 ...

  8. 学生计算机测评安排,计算机系学生综合测评细则

    为认真贯彻执行党的教育方针,促进大学生德.智.体全面发展,鼓励学生刻苦学习.争先创优,提高综合素质,根据上级有关文件精神和<集宁师范学院学生综合测评办法>的要求,特制定本细则. 一.综合测 ...

  9. 大学生综合测评系统(C++)

    大学生综合测评系统(C++) #include<iostream> #include<fstream> #include<string> #include<i ...

最新文章

  1. oracle元数据存储在表空间,[Oracle] dbms_metadata.get_ddl 的使用方法总结
  2. Markdown基本语法【转】
  3. 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展
  4. kafka学习(二)kafka工作流程分析
  5. C++创建对象:栈和堆的区别
  6. 如何配置x225/x235/x335/x345的LSI SCSI卡实现RAID-1功能
  7. matlab的一些关于块分类的函数~~~
  8. 躺枪实惨!与新冠病毒“重名”,这款墨西哥国民啤酒宣布暂停生产...
  9. orchard文档之-搜索和索引
  10. android谷歌反地理,android – 谷歌地理编码服务是不可用的(协调地址)
  11. 软件测试--04测试用例/测试方法
  12. python shell 方向键不可用
  13. 定位CPU高问题三把斧
  14. SPLUS数据库导入导出操作
  15. 证件照素材大合集(全网最全版本),满足证件照的一切需求!
  16. python爬取动态页面图片_python动态网页爬取:爬取pexel上的图片
  17. iOS安全逆向之旅---逆向基本知识概要介绍
  18. 清北学堂2019.8.7
  19. utils方法,时间工具,数组排序,违禁词检测
  20. 申报绿色工厂的条件和标准是什么?

热门文章

  1. JSVC简介之快速入门
  2. threejs 的思维导图
  3. VTK显示CT图像视图
  4. Marklogic学习 —— XQuery语法之排序
  5. ACM 动态规划(简称dp) 分类
  6. Windows 必备——cmder 一款比cmd牛逼的Win软件
  7. Matlab unravel函数,有没有更好的方法在python中执行“unravel”函数?
  8. CVE-2019-0708漏洞检测工具
  9. 项目路演/课题答辩/毕业论文答辩PPT制作
  10. cout输出格式控制