找回密码
 注册

QQ登录

只需一步,快速开始

搜索

基于stm32的单片机的简易数字频率计设计

[复制链接]
路漫漫 发表于 2020-5-24 17:49:45 | 显示全部楼层 |阅读模式
简易频率计详细文档和代码.rar (663.26 KB, 售价: 3 E币)
1.简介:数字频率计主要由四个部分组成:时基电路,整形电路,控制电路和显示电路组成。在一个测量周期过程中,由时基电路产生一标准时间信号控制阀门,调节时基电路中的电阻可产生需要的标准时间信号。信号输入整形电路中,经过整形,输出一方波,通过阀门后,计时器对其计数。当计数完毕,时基电路输出一个上升沿,使锁存器打开,计数器计数结果输入译码器,从而让显示器显示,达到测量频率的目的。文件包括设计电路图,设计源代码与设计报
2.目标:本设计主要完成以下目标:
  1.测量信号输入幅度1V~5V方波,频率为1kHz~10kHz,测量精度1%,信号输入幅度1V~5V三角波,频率为1kHz~10kHz,测量精度1%,信号输入幅度2V~5V正弦波,频率为1kHz~10kHz,测量精度1%;
2.当输入信号幅度大于15V时,具有报警功能,测量结果为数字显示;
3.测量具有串口通信功能;
4.信号输入幅度为1V~10V脉冲,频率为20Hz~1kHz时,测量并计算占空比。
3.硬件设计:
3.硬件设计原理
硬件电路图:
141345ohdzb0e0v48r4u6h.jpg
1.测频部分:先对输入信号进行波形转换,通过一个过零比较器将三角波、正弦波转化为方波,之后将将方波输入单片机 口进行波形测试。
2.限幅报警部分:输入信号经过D1变成半波信号,之后经过C3,C4,C5,C6,C7进行整流成为幅值直流信号,之后将信号输入电位器进行分压,保证15v电压经过电位器后剩余3.3v电压。最后输出到端口上与3.3v电压进行比较,将比较结果输入单片机 口。
3.单片机供电部分:通过供电模块输出3.3v电压供给stm32单片机。
4.软件设计原理:
硬件部分会将所有波形统一成方波输入。使用TIM3与TIM4计时器。TIM3进行波形捕捉。TIM3捕捉波形的上升沿或者下降沿。开始计数,知道捕捉到相对应的上升沿或者下降沿。根据所计数的多少即可计算出波形的占空比。每次捕捉到上升沿且之前为低电平,频率计数加一。TIM4计数器用来计数一秒,当TIM4计数满一秒时,发生TIM4中断,根据TIM3的频率计数,即可计算出输入波形的频率。
部分源码
  1. void TIM3_Cap_Init(uint16_t arr, uint16_tpsc)                                  //TIM3用于输入捕获
  2. {
  3.          GPIO_InitTypeDefGPIO_InitStructure;
  4.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.          TIM_ICInitTypeDef  TIM3_ICInitStructure;
  6.      NVIC_InitTypeDef NVIC_InitStructure;

  7.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);     //使能TIM3时钟
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);          //使能GPIOA时钟

  9.          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;                      //选择6号引脚
  10.          GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;                      //输入下拉
  11.          GPIO_Init(GPIOA,&GPIO_InitStructure);                                             //初始化PA6
  12.          GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                    //PA6下拉

  13.          //初始化定时器3 TIM3  
  14.          TIM_TimeBaseStructure.TIM_Period= arr;                               //设定计数器自动重装值
  15.          TIM_TimeBaseStructure.TIM_Prescaler=psc;                                    //预分频器
  16.          TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  17.          TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式
  18.          TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  19.          //初始化TIM3输入捕获参数
  20.          TIM3_ICInitStructure.TIM_Channel= TIM_Channel_1;                   //CC1S=01选择输入端 IC1映射到TI1上
  21.        TIM3_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;      //上升沿捕获
  22.        TIM3_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //映射到TI1上
  23.        TIM3_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;   //配置输入分频,不分频
  24.        TIM3_ICInitStructure.TIM_ICFilter = 0x00;                                  //IC1F=0000 配置输入滤波器 不滤波
  25.        TIM_ICInit(TIM3,&TIM3_ICInitStructure);

  26.          //中断分组初始化
  27.          NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;            //TIM3中断
  28.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;  //先占优先级0级
  29.          NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;          //从优先级0级
  30.          NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;           //IRQ通道被使能
  31.          NVIC_Init(&NVIC_InitStructure);

  32.          TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);

  33.      TIM_Cmd(TIM3,ENABLE );     //使能定时器3
复制代码
检测结果
当正弦波的频率为5khz时,数字频率计显示结果为
1.png
当方波的频率为8khz时,数字频率计显示结果为
2.png
当输入信号幅度大于15V时,绿灯被点亮,进行报警
3.png
测量占空比
4.png
Benett 发表于 2023-3-16 08:29:05 | 显示全部楼层
多谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-22 00:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表