基于单片机的正弦波与方波峰峰值与频率测量系统设计

1. 系统总体设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/91860308

1.1 设计背景

在电子测量与信号分析领域中,信号的幅值、频率以及占空比是最基本且最重要的参数。传统示波器虽然功能强大,但成本较高、体积较大,不适合嵌入式或便携式应用。因此,基于单片机设计一套具备峰峰值、频率及占空比测量功能的系统,具有重要的工程意义与应用价值。

本系统针对正弦波与方波信号,利用A/D采样与定时测量相结合的方法,实现对信号特征参数的高精度测量。通过合理的电路设计与软件算法优化,系统能够将测量误差控制在±1%以内,满足一般电子测量需求。


1.2 系统功能设计

本系统主要实现以下功能:

  1. 峰峰值测量:通过A/D采样获取信号最大值与最小值,计算峰峰值;
  2. 频率测量:通过测量信号周期,计算信号频率;
  3. 占空比测量:针对方波信号,测量高电平时间与周期比值;
  4. 波形识别:自动识别输入信号为正弦波或方波;
  5. LCD显示:显示信号类型、峰峰值、电压单位、频率及占空比;
  6. 高精度测量:整体误差控制在±1%以内。

2. 系统电路设计

2.1 单片机最小系统电路设计

本系统采用STC89C52单片机作为核心控制单元。

最小系统包括:

  1. 晶振电路:采用11.0592MHz晶振,提高计时精度;
  2. 复位电路:RC复位电路保证系统稳定启动;
  3. 电源电路:提供稳定5V电压。

2.2 信号调理电路设计

输入信号可能存在幅值过大或带有负电压的情况,需要进行调理。

设计方案:

  1. 使用运算放大器进行电压跟随或放大;
  2. 加入偏置电路,将信号抬升至0~5V范围;
  3. 设置限幅电路保护ADC输入端;
  4. 加入滤波电路降低噪声干扰。

2.3 A/D采样电路设计

采用ADC0808进行模数转换。

设计要点:

  1. 输入信号接入ADC通道;
  2. 分辨率为8位;
  3. 支持多通道扩展;
  4. 数据输出连接单片机P0口。

2.4 零交叉检测电路设计

用于频率测量与波形识别。

设计方法:

  1. 使用比较器(如LM393)检测信号过零点;
  2. 输出方波信号供单片机捕获;
  3. 提供稳定的周期测量基础。

2.5 定时器与计数电路设计

利用单片机内部定时器实现时间测量。

功能:

  1. 计量周期时间;
  2. 测量高电平持续时间;
  3. 提供频率与占空比计算基础。

2.6 LCD1602显示电路设计

用于显示测量结果。

显示内容包括:

  1. 波形类型(SIN/SQR);
  2. 峰峰值;
  3. 频率;
  4. 占空比。

3. 系统程序设计

3.1 程序总体结构设计

系统程序采用模块化设计,包括采样模块、计算模块、显示模块与测量模块。

主程序如下:

c 复制代码
void main()
{
    System_Init();
    while(1)
    {
        Sample_Data();
        Calculate_Vpp();
        Measure_Frequency();
        Measure_Duty();
        Wave_Identify();
        LCD_Display();
    }
}

3.2 A/D采样程序设计

c 复制代码
unsigned char Read_ADC()
{
    START = 1;
    ALE = 1;
    delay_us(5);
    START = 0;
    ALE = 0;
    
    while(EOC == 0);
    
    OE = 1;
    return P0;
}

用于采集信号电压。


3.3 峰峰值计算程序设计

c 复制代码
void Calculate_Vpp()
{
    max_val = 0;
    min_val = 255;

    for(i=0;i<100;i++)
    {
        val = Read_ADC();
        if(val > max_val) max_val = val;
        if(val < min_val) min_val = val;
    }

    Vpp = (max_val - min_val) * 5.0 / 255.0;
}

实现峰峰值测量。


3.4 频率测量程序设计

c 复制代码
void Measure_Frequency()
{
    TH0 = 0;
    TL0 = 0;
    TR0 = 1;

    while(Zero_Cross == 0);
    while(Zero_Cross == 1);
    while(Zero_Cross == 0);

    TR0 = 0;
    period = (TH0<<8) | TL0;

    freq = 1.0 / period;
}

实现周期测量。


3.5 占空比测量程序设计

c 复制代码
void Measure_Duty()
{
    while(Signal == 0);
    TH0 = TL0 = 0;
    TR0 = 1;

    while(Signal == 1);
    high_time = (TH0<<8) | TL0;

    while(Signal == 0);
    total_time = (TH0<<8) | TL0;

    TR0 = 0;

    duty = (float)high_time / total_time * 100;
}

用于方波占空比测量。


3.6 波形识别程序设计

c 复制代码
void Wave_Identify()
{
    if(duty > 40 && duty < 60)
        wave_type = SQUARE;
    else
        wave_type = SINE;
}

简单判断波形类型。


3.7 LCD显示程序设计

c 复制代码
void LCD_Display()
{
    LCD_ShowString(0,0,"Type:");
    LCD_ShowString(5,0,wave_type);

    LCD_ShowString(0,1,"Vpp:");
    LCD_ShowNum(4,1,Vpp,2);

    LCD_ShowString(9,1,"F:");
    LCD_ShowNum(11,1,freq,2);
}

实现数据显示。


4. 系统总结

本系统基于单片机实现了正弦波与方波的峰峰值、频率及占空比测量功能。通过信号调理、电压采样及定时测量相结合,实现了高精度测量。

在电路设计方面,各模块结构合理,抗干扰能力强;在程序设计方面,采用高效算法与模块化设计,使系统具有良好的实时性与稳定性。

系统能够满足一般电子测量需求,具有较高的应用价值和推广意义。

相关推荐
山木嵌入式2 小时前
【STM32实战】轻量级任务调度器实现
stm32·单片机·rtos·任务调度器·裸机开发
guygg882 小时前
基于霍尔传感器的BLDC控制源码
单片机·嵌入式硬件
ytttr8733 小时前
DSP 28335 CAN总线通信程序
开发语言·stm32·单片机
一枝小雨5 小时前
RISC-V架构sp寄存器 & RISC-V架构下FreeRTOS任务上下文保存与恢复
单片机·架构·嵌入式·risc-v·rtos·内核原理
BW.SU6 小时前
PackagingTool 嵌入式资源打包合并工具
单片机·二进制·嵌入式开发·资源合并软件·图片打包
长安第一美人6 小时前
工业级实时监控系统开发:PHP+ZMQ+JS 前后端分离架构全解析
前端·嵌入式硬件·架构·交互·rk3588·zmq后端
田甲6 小时前
STM32开发环境迁移实践:从 CubeMX 生成 CMake 工程到 VS Code 编译与调试
stm32·单片机·嵌入式硬件
hoiii1876 小时前
在 STM32F1上读取 BMX055 三轴加速度
stm32·单片机·嵌入式硬件
嵌入式小站7 小时前
STM32 零基础可移植教程 04:按键输入,为什么按下去读到的是 0 或 1
chrome·stm32·嵌入式硬件
三佛科技-187366133977 小时前
BP8522D贴片SOP7,5V150mA高集成度无VCC电容降压型恒压芯片解析
单片机·嵌入式硬件