基于单片机的两路PWM信号输出及频率占空比相位差调节系统设计
点击下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081465
1. 系统功能概述
本系统基于 51 系列单片机 设计,实现 两路 PWM 信号输出,并支持对 频率、占空比以及两路信号相位差 的实时调节。通过按键进行参数设置,并将当前参数在 LCD1602 液晶屏 上实时显示,方便用户进行监控和操作。该系统广泛适用于电机控制、功率调节、信号调制以及实验室模拟测试等场景。
系统主要功能包括:
- 两路独立 PWM 输出
支持两路独立信号输出,可设置不同频率、占空比以及相位差,满足多样化控制需求。 - 频率调节
用户通过按键设定 PWM 信号的输出频率,实现高精度调速或信号匹配。 - 占空比调节
系统支持占空比动态调整,可实现 0~100% 范围内连续可调,便于控制负载功率。 - 相位差调节
两路 PWM 信号可设置任意相位差,实现多种同步或异步控制效果。 - 实时显示功能
LCD1602 显示当前频率、占空比及两路信号相位差,便于用户直观监控与调整。
2. 系统电路设计
系统电路采用模块化设计,包括 主控单元、PWM 输出模块、按键输入模块、LCD 显示模块、相位调整模块及电源模块,各模块协同实现系统功能。
2.1 主控单元设计
核心采用 STC89C52 单片机,负责对按键输入进行扫描、参数计算、PWM 信号输出控制及液晶显示驱动。
- I/O 接口分配
- 任务分配
- 扫描按键,检测频率、占空比、相位差设置命令;
- 根据设置参数计算计数器值,生成对应 PWM 信号;
- 更新 LCD 显示内容,实现实时参数反馈。
2.2 PWM 输出模块
PWM 输出模块通过 单片机定时器(Timer0、Timer1) 生成占空比可调、频率可调的脉冲信号。
- Timer0:控制 PWM1 输出
- Timer1:控制 PWM2 输出
- 频率调节方法:通过修改定时器初值改变 PWM 周期,实现频率调节
- 占空比调节方法:通过定时器溢出中断改变高电平时间长度
- 相位差调节方法:对第二路 PWM 设置延时启动,形成任意相位差
2.3 按键输入模块
系统设有若干按键,用于参数调节:
- 频率增加/减少键:实现 PWM 频率精确调节
- 占空比增加/减少键:调整 PWM 高电平占比
- 相位差调整键:调节两路 PWM 信号的相位关系
设计特点:
- 按键采用消抖电路,避免抖动误操作
- 单片机通过轮询方式或中断方式读取按键状态
- 支持连续按压自动增减功能,提高操作便捷性
2.4 LCD 显示模块
采用 LCD1602 液晶屏 实时显示两路 PWM 的参数信息:
- 显示内容:PWM1 频率、占空比,PWM2 频率、占空比,信号相位差
- 显示刷新:定时更新 LCD 内容,保证实时性
- 接口设计:数据口 P2,控制端口 RS、RW、E 单独占用,便于高速数据传输
2.5 相位调整模块
相位差通过软件延时或计数器偏移实现:
- PWM2 输出延时启动:在 PWM1 周期开始时触发延时,形成所需相位差
- 软件控制精度:通过定时器中断精确控制延时,精度可达微秒级
- 可调范围:0~360°,用户可通过按键逐步调节
2.6 电源模块
3. 程序设计
程序采用 C 语言模块化开发,主要包括 主程序、PWM 输出模块、按键扫描模块、LCD 显示模块、相位控制模块及延时控制模块。
3.1 主程序设计
主程序完成系统初始化、按键扫描、PWM 输出调度及 LCD 更新。
#include <reg52.h>
#include "pwm.h"
#include "key.h"
#include "lcd.h"
unsigned int pwm1_freq = 1000; // PWM1 频率
unsigned int pwm2_freq = 1000; // PWM2 频率
unsigned char pwm1_duty = 50; // PWM1 占空比%
unsigned char pwm2_duty = 50; // PWM2 占空比%
unsigned int phase_diff = 0; // 相位差, 0~360度
void main()
{
LCD_Init();
PWM_Init();
Key_Init();
while(1)
{
Key_Scan();
Update_PWM();
Update_LCD();
}
}
3.2 PWM 输出程序
通过定时器控制高低电平,实现频率、占空比及相位调节。
void PWM_Init(void)
{
TMOD = 0x11; // Timer0, Timer1 工作模式1
TH0 = 0; TL0 = 0;
TH1 = 0; TL1 = 0;
ET0 = 1; ET1 = 1;
EA = 1;
TR0 = 1; TR1 = 1;
}
void Update_PWM(void)
{
Set_PWM1(pwm1_freq, pwm1_duty);
Set_PWM2(pwm2_freq, pwm2_duty, phase_diff);
}
3.3 按键扫描程序
检测频率、占空比和相位差按键输入。
void Key_Scan(void)
{
if(Freq1_Up_Pressed()) pwm1_freq += 10;
if(Freq1_Down_Pressed()) pwm1_freq -= 10;
if(Duty1_Up_Pressed()) pwm1_duty += 1;
if(Duty1_Down_Pressed()) pwm1_duty -= 1;
if(Freq2_Up_Pressed()) pwm2_freq += 10;
if(Freq2_Down_Pressed()) pwm2_freq -= 10;
if(Duty2_Up_Pressed()) pwm2_duty += 1;
if(Duty2_Down_Pressed()) pwm2_duty -= 1;
if(Phase_Up_Pressed()) phase_diff += 5;
if(Phase_Down_Pressed()) phase_diff -= 5;
}
3.4 LCD 显示程序
实时显示两路 PWM 参数及相位差信息。
void Update_LCD(void)
{
LCD_ShowString(0,0,"PWM1 F:");
LCD_ShowNum(0,7,pwm1_freq,4);
LCD_ShowString(0,12,"D:");
LCD_ShowNum(0,14,pwm1_duty,2);
LCD_ShowString(1,0,"PWM2 F:");
LCD_ShowNum(1,7,pwm2_freq,4);
LCD_ShowString(1,12,"D:");
LCD_ShowNum(1,14,pwm2_duty,2);
LCD_ShowString(1,10,"P:");
LCD_ShowNum(1,12,phase_diff,3);
}
3.5 相位控制程序
控制第二路 PWM 输出延时启动,实现相位差。
void Set_PWM2(unsigned int freq, unsigned char duty, unsigned int phase)
{
unsigned int delay_counts = phase * freq / 360;
Delay_us(delay_counts);
Set_PWM_Output(freq, duty, 2); // 输出 PWM2
}
4. 系统运行与功能总结
该两路 PWM 信号输出系统充分利用 51 单片机的定时器与 I/O 控制能力,实现了高精度频率、占空比及相位差调节功能。系统特点如下:
- 两路独立 PWM 输出:可同时输出不同频率、占空比信号,实现复杂控制需求
- 可调频率与占空比:通过按键动态调整,方便实验和应用
- 相位差调节功能:支持 0~360° 范围内任意相位差设置
- 实时显示参数:LCD1602 显示系统状态及参数,操作直观
- 模块化设计:主控、PWM 输出、按键输入、LCD 显示及相位控制分工明确,便于扩展和维护
该系统适用于实验室教学、PWM 信号仿真、驱动控制及智能电路开发,为用户提供了一套灵活、可调、可靠的双路 PWM 信号输出方案。
2203