基于单片机的两路PWM信号输出及频率占空比相位差调节系统
基于单片机的两路PWM信号输出及频率占空比相位差调节系统设计
点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081465
1. 系统功能介绍
本系统基于51单片机设计,旨在实现两路PWM信号的独立输出,并可通过按键实时调节其频率、占空比及相位差。PWM(Pulse Width Modulation,脉宽调制)信号广泛应用于电机控制、信号调制、功率控制以及信号仿真等领域,因此本系统不仅具有实验教学价值,还可作为通用信号源模块应用于各类嵌入式开发场景。
系统主要功能如下:
- 双路PWM信号输出:通过定时器实现两路可调PWM波形输出,信号频率和占空比均可独立调节。
- 频率可调:系统支持通过按键切换不同频率档位,输出频率可在数百Hz到数十kHz范围内调节。
- 占空比可调:用户可通过按键调节PWM波形的高电平占比,实现信号强度或功率控制。
- 相位差可调:两路PWM信号之间的相位差可手动设置,适用于相移控制、电机驱动及逆变实验等应用。
- LCD1602实时显示:液晶屏实时显示当前PWM信号的频率、占空比及相位差值,方便用户观察与调整。
- 按键人机交互:设置四个按键,分别用于频率加减、占空比加减和相位差调节,操作简便直观。
- 稳定可靠:系统采用定时器精确计时、软件延时微调、抗抖处理等技术,保证输出波形的稳定性与可重复性。
该系统可广泛应用于信号仿真、电机调速实验、电子教学平台及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与中断的配置,随后进入循环检测用户输入,根据按键更新频率、占空比与相位差。
主程序框架如下:
#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程序示例如下:
#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;elsePWM1 = 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;elsePWM2 = 0;if(cnt2 >= pwm_period) cnt2 = 0;
}
通过修改 pwm_period、pwm_high1、pwm_high2,即可实时调整PWM频率与占空比;而相位差则通过控制 Timer1 启动延时来实现。
3.3 相位差调节模块
两路PWM信号之间的相位差由时间延迟决定。假设周期为T,相位差φ(度)对应时间延迟为:
[
t_{delay} = \frac{T \times \phi}{360}
]
通过软件延时控制 Timer1 的启动时刻,可实现任意相位差输出。
示例代码:
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参数,并进行上下限保护。
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模块通过简单函数调用实时刷新显示内容:
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波形的调制原理,掌握定时器中断、相位差控制与信号合成技术,为进一步学习数字控制与信号处理奠定坚实基础。
