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

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. 系统总结

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

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

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

相关推荐
嵌入式-老费18 分钟前
esp32开发与应用(如何解决SoC冷启动的问题)
单片机·嵌入式硬件
一 乐1 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
充哥单片机设计2 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
EatFan2 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网·esp32
sunoo-2293 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
张宜强3 小时前
025 安居租赁 · 房屋租赁平台
java·课程设计
Brilliantwxx3 小时前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
Doraemomo4 小时前
IMX6ULL裸机开发——PWM
arm开发·嵌入式硬件·imx6ull
老当益壮梁奶奶5 小时前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
西城微科方案开发6 小时前
基于SIC8F0535芯片的红外额温枪开发方案
单片机·嵌入式硬件