基于单片机的两路PWM信号输出及频率占空比相位差调节系统

基于单片机的两路PWM信号输出及频率占空比相位差调节系统设计

点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081465


1. 系统功能介绍

本系统基于51单片机设计,旨在实现两路PWM信号的独立输出,并可通过按键实时调节其频率、占空比及相位差。PWM(Pulse Width Modulation,脉宽调制)信号广泛应用于电机控制、信号调制、功率控制以及信号仿真等领域,因此本系统不仅具有实验教学价值,还可作为通用信号源模块应用于各类嵌入式开发场景。

系统主要功能如下:

  1. 双路PWM信号输出:通过定时器实现两路可调PWM波形输出,信号频率和占空比均可独立调节。
  2. 频率可调:系统支持通过按键切换不同频率档位,输出频率可在数百Hz到数十kHz范围内调节。
  3. 占空比可调:用户可通过按键调节PWM波形的高电平占比,实现信号强度或功率控制。
  4. 相位差可调:两路PWM信号之间的相位差可手动设置,适用于相移控制、电机驱动及逆变实验等应用。
  5. LCD1602实时显示:液晶屏实时显示当前PWM信号的频率、占空比及相位差值,方便用户观察与调整。
  6. 按键人机交互:设置四个按键,分别用于频率加减、占空比加减和相位差调节,操作简便直观。
  7. 稳定可靠:系统采用定时器精确计时、软件延时微调、抗抖处理等技术,保证输出波形的稳定性与可重复性。

该系统可广泛应用于信号仿真、电机调速实验、电子教学平台及PWM控制相关领域。


2. 系统电路设计

本系统电路设计以STC89C52单片机为核心,外围包括LCD1602液晶显示模块、按键输入模块、PWM输出电路及电源管理模块。各模块相互协作,实现PWM信号的精确生成与参数调节。


2.1 单片机控制模块

系统采用 STC89C52 单片机 作为核心控制单元。该芯片基于8051内核,内置8KB Flash存储器和256B RAM,具备丰富的I/O端口和3个16位定时器,可满足多路PWM信号的生成需求。

在本系统中,单片机承担以下任务:

  • 利用定时器产生周期性PWM信号;
  • 根据按键输入调整频率、占空比及相位差;
  • 实时更新LCD1602显示内容;
  • 实现两路PWM信号的同步与相移输出。

主控引脚分配如下:

  • P1.0:PWM1信号输出;
  • P1.1:PWM2信号输出;
  • P2口:LCD1602数据总线;
  • P3.0~P3.3:按键输入端;
  • P2.6、P2.7:LCD1602控制端RS、EN。

单片机系统采用12MHz晶振电路,保证内部时钟稳定,配合上电复位电路实现可靠启动。


2.2 LCD1602液晶显示模块

LCD1602是一种常用的字符型液晶显示器,可显示两行共16个字符,适合用于显示PWM参数。

在本系统中,LCD用于显示以下信息:

  • 第一行:显示当前PWM信号的频率;
  • 第二行:显示占空比与相位差。

例如:

复制代码
FREQ:1.00kHz
DUTY:50% PHASE:90°

LCD采用4位数据总线方式与单片机通信,以节省I/O资源。控制线RS、EN分别连接至P2.6、P2.7,RW接地以简化控制逻辑。LCD通过标准指令初始化与显示更新,单片机通过函数调用完成显示刷新。


2.3 按键输入模块

系统设置四个独立按键,用于用户输入调节指令:

  • K1:增加频率;
  • K2:减少频率;
  • K3:增加占空比;
  • K4:增加相位差。

按键采用独立下拉电阻结构,按下时输入端为高电平。每个按键均配有软件防抖逻辑,确保输入信号的稳定与准确。

每次按键操作后,单片机立即更新内部参数表,并重新计算PWM输出参数,刷新LCD显示结果。


2.4 PWM输出电路

PWM输出信号通过单片机I/O口直接输出,若用于高功率场合(如电机控制),可通过MOSFET或达林顿管扩流。

系统设计两路独立PWM输出端:

  • PWM1信号用于基准通道;
  • PWM2信号可调相位差。

输出信号可直接接入示波器观察波形变化,用于验证频率、占空比与相位差调节的正确性。

PWM信号的生成基于 定时器中断机制:定时器按照设定周期溢出,在中断服务函数中改变输出引脚电平,实现周期性方波输出。两路PWM可分别使用定时器0与定时器1生成。


2.5 电源与稳定模块

系统工作电源为5V直流电压,采用7805稳压芯片提供稳定电源。LCD1602与单片机共用电源,按键模块与PWM输出端均连接电源地,以避免地电位差造成误触发。


3. 系统程序设计

系统软件采用 C语言 编写,开发环境为Keil uVision。整个程序结构采用模块化设计,主要分为:

  • 主控制程序;
  • 定时器PWM控制程序;
  • 按键扫描与参数调节模块;
  • LCD显示驱动模块;
  • 相位差控制模块。

系统通过中断方式实现PWM信号的实时刷新,主循环则处理参数更新与LCD显示。


3.1 主程序设计

主程序主要实现系统初始化、按键检测和参数刷新逻辑。初始化阶段完成定时器、LCD与中断的配置,随后进入循环检测用户输入,根据按键更新频率、占空比与相位差。

主程序框架如下:

c 复制代码
#include <reg52.h>
#include "lcd1602.h"
#include "key.h"
#include "pwm.h"

unsigned int freq = 1000;  // 初始频率 1kHz
unsigned char duty = 50;   // 初始占空比 50%
unsigned char phase = 0;   // 初始相位差 0°

void main()
{
    LCD_Init();
    PWM_Init();
    Key_Init();
    LCD_Show(freq, duty, phase);
    
    while(1)
    {
        Key_Scan(&freq, &duty, &phase);  // 按键检测与参数调整
        LCD_Show(freq, duty, phase);     // 刷新显示
    }
}

该程序结构简洁,主循环主要负责用户交互和显示更新,而PWM信号生成在中断中完成,互不干扰,系统运行稳定。


3.2 PWM信号控制程序设计

PWM信号由定时器中断实现。定时器溢出周期由频率参数计算得到,占空比通过比较计数器值与阈值关系决定输出高低电平。

PWM程序示例如下:

c 复制代码
#include <reg52.h>

sbit PWM1 = P1^0;
sbit PWM2 = P1^1;

unsigned int pwm_period = 1000;
unsigned int pwm_high1 = 500;
unsigned int pwm_high2 = 500;
unsigned int phase_delay = 0;

void PWM_Init()
{
    TMOD = 0x11;  // 定时器0、1均为模式1(16位)
    TH0 = (65536 - pwm_period) / 256;
    TL0 = (65536 - pwm_period) % 256;
    ET0 = 1;
    TR0 = 1;

    TH1 = (65536 - pwm_period) / 256;
    TL1 = (65536 - pwm_period) % 256;
    ET1 = 1;
    TR1 = 1;

    EA = 1;
}

void Timer0_ISR(void) interrupt 1
{
    static unsigned int cnt1 = 0;
    cnt1++;
    if(cnt1 < pwm_high1)
        PWM1 = 1;
    else
        PWM1 = 0;
    if(cnt1 >= pwm_period) cnt1 = 0;
}

void Timer1_ISR(void) interrupt 3
{
    static unsigned int cnt2 = 0;
    cnt2++;
    if(cnt2 < pwm_high2)
        PWM2 = 1;
    else
        PWM2 = 0;
    if(cnt2 >= pwm_period) cnt2 = 0;
}

通过修改 pwm_periodpwm_high1pwm_high2,即可实时调整PWM频率与占空比;而相位差则通过控制 Timer1 启动延时来实现。


3.3 相位差调节模块

两路PWM信号之间的相位差由时间延迟决定。假设周期为T,相位差φ(度)对应时间延迟为:

t_{delay} = \\frac{T \\times \\phi}{360}

通过软件延时控制 Timer1 的启动时刻,可实现任意相位差输出。

示例代码:

c 复制代码
void Set_Phase(unsigned char phase)
{
    unsigned int delay_time;
    delay_time = (pwm_period * phase) / 360;
    Delay_us(delay_time);  // 精确延时启动
    TR1 = 1;  // 启动第二路PWM定时器
}

3.4 按键扫描与参数调节程序设计

按键扫描模块检测用户输入,根据按键动作改变PWM参数,并进行上下限保护。

c 复制代码
void Key_Scan(unsigned int *freq, unsigned char *duty, unsigned char *phase)
{
    if(K1 == 0) { *freq += 100; Delay_ms(200); }
    if(K2 == 0 && *freq > 100) { *freq -= 100; Delay_ms(200); }
    if(K3 == 0 && *duty < 100) { *duty += 5; Delay_ms(200); }
    if(K4 == 0 && *phase < 180) { *phase += 10; Delay_ms(200); }
}

3.5 LCD显示程序设计

LCD模块通过简单函数调用实时刷新显示内容:

c 复制代码
void LCD_Show(unsigned int freq, unsigned char duty, unsigned char phase)
{
    char buf[16];
    LCD_SetCursor(0,0);
    sprintf(buf,"FREQ:%4dHz",freq);
    LCD_WriteString(buf);

    LCD_SetCursor(1,0);
    sprintf(buf,"D:%3d%% P:%3d",duty,phase);
    LCD_WriteString(buf);
}

4. 系统总结

本设计实现了一个基于51单片机的两路PWM信号输出与参数调节系统,具有如下优点:

  • 结构简单,控制灵活:采用双定时器独立控制,信号互不干扰;
  • 参数可视化调节:通过LCD实时显示频率、占空比与相位差;
  • 稳定性强,易于扩展:系统可拓展至多路PWM输出或加入通信接口;
  • 应用广泛:可用于PWM教学实验、电机控制、电源逆变及信号仿真等领域。

通过该系统,用户可直观地理解PWM波形的调制原理,掌握定时器中断、相位差控制与信号合成技术,为进一步学习数字控制与信号处理奠定坚实基础。

相关推荐
普中科技3 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍
stm32·单片机·嵌入式硬件·arm·普中科技·固件库
天天爱吃肉82183 小时前
我回来了,依然关注新能源汽车研发测试,
嵌入式硬件·汽车
D.....l4 小时前
STM32学习(MCU控制)(DMA and ADC)
stm32·单片机·学习
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机自动售货机系统
c语言·单片机·嵌入式硬件·物联网·51单片机
柒月玖.11 小时前
基于AT89C52单片机的温度检测报警设计
单片机·嵌入式硬件
m0_5557629011 小时前
GPIO配置详细解析
单片机·嵌入式硬件
盈创力和200711 小时前
构建未来工业感知层:以太网多参量传感器的融合架构与技术实践
嵌入式硬件·架构·以太网温湿度传感器·多参数传感器
兆龙电子单片机设计12 小时前
【STM32项目开源】STM32单片机多功能饮水机系统
stm32·单片机·物联网·开源·毕业设计
ShiMetaPi13 小时前
基于M4-R1开发板的OpenHarmony开发实战丨创建第一个应用工程
嵌入式硬件·开放原子·鸿蒙系统·openharmony·开源鸿蒙·北向开发