基于EVM_MSPM0L1306开发套件制作简易PWM发生器
使用EVM_MSPM0L1306制作两路可独立调节的PWM信号,并实现与OLED显示、按键输入及串口通信的交互功能。
标签
嵌入式系统
显示
开发板
meiyao
更新2024-07-18
367

使用EVM_MSPM0L1306制作以下实施步骤与方法:

1. 认识硬件

EVM_MSPM0L1306微制器:了解EVM_MSPM0L1306的具体有哪些功能,GPIO输入输出,定时器1,定时器2,iic,以及DAP下载功能。

OLED显示屏:用于显示PWM参数和引脚状态,及电子森林备战电赛训练平台,EVM_MSPM0L1306开发板功能。

按键开关:用于输入频率和占空比设置,输出切换功能。

外部电路:为PWM信号提供输出接口,方便测试功能的实际情况。

串口通信模块:EVM_MSPM0L1306用于与上位机通信,输出实际的实时设定参数与状态。


2. 软件实现步骤

1 初始化

系统时钟:配置系统时钟以支持高频PWM生成。

GPIO:配置用于PWM输出的引脚为PWM模式,配置按键输入引脚。

定时器:选择并配置至少两个定时器用于生成两路独立的PWM信号,启用定时器中断,重置计数频率。

OLED:初始化OLED显示屏,清OLED屏内容,设置显示模式。

UART:初始化串口通信。


2 PWM配置

定时器中断:为PWM通道配置独立的定时器中断。

占空比控制:在中断服务例程中,根据当前占空比设置,控制PWM输出引脚的高低电平时间,设置比较值,用于控制PWM的占空比 ,在这里,比较值设置为50,意味着PWM的占空比大约为50%(如果周期是99)

频率切换:通过按键开关输入,更新定时器中断频率以改变PWM频率。对于1Hz至10KHz的连续调节,可能需要使用软件定时器或更精细的定时器配置。对于100KHz和1MHz,可能需要不同的定时器配置或预分频器设置。


函数配置PWM_0的时钟源、预分频器、PWM模式、周期、比较值等参数,并启用相应的中断和输出控制。设置PWM_0的时钟配置,选择时钟源为BUSCLK,不进行分频(DL_TIMER_CLOCK_DIVIDE_1),预分频值为31 ,这将决定PWM的基准时钟频率 。


3 OLED界面显示

开机显示:电子森林备战电赛训练平台,EVM_MSPM0L1306开发板。进入PWM设置界面,在主循环、中断中检测按键状态,更新PWM参数。

OLED显示:在主循环中定期更新OLED屏幕,显示当前PWM参数(频率、占空比)和引脚状态。

2.4 串口通信

数据发送:在主循环中和PWM任务中,将PWM参数(包括两个通道的频率、占空比及通道状态)通过串口发送到上位机。发送频率约为每秒一次。


3、程序流程图

项目根目录
├── 硬件设计
│ ├── EVM_MSPM0L1306引脚分配
│ │ ├── PWM1 引脚分配
│ │ ├── PWM2 引脚分配
│ │ ├── OLED显示屏引脚分配
│ │ ├── 按键开关引脚分配
├── 软件设计
│ ├── 初始化设置
│ │ ├── 系统时钟配置
│ │ ├── GPIO配置
│ │ ├── 定时器配置
│ │ ├── PWM配置
│ │ ├── OLED显示屏初始化
│ │ ├── UART初始化
│ ├── PWM信号生成
│ │ ├── PWM频率调整
│ │ │ ├── 1Hz~10KHz调整逻辑
│ │ │ ├── 100KHz调整逻辑
│ │ │ ├── 1MHz调整逻辑
│ │ ├── PWM占空比调整
│ │ ├── 按键开关中断处理
│ ├── OLED显示
│ │ ├── 显示PWM参数
│ │ ├── 显示当前引脚状态
│ ├── 串口通信
│ │ ├── 发送PWM参数
│ ├── 主循环
│ │ ├── 按键扫描
│ │ ├── 更新PWM参数
│ │ ├── 更新OLED显示
│ │ ├── 串口数据发送

4、软件工作流程图:

224a7682febc950494064e54b28dadc.png


5、硬件功能图:

1ef6578fb9769847ee9dfb39ae828d9.png

6、systconfig配置PWM0


1721013949238.png


7、代码:

通过按键切换至100KHz和1MHz。

/*切换到1Mhz,占空比50*/		
case 12 : RefreshRate(1000000,50) ;
break ;
/*切换到100k ,占空比50*/
case 16 : RefreshRate(100000,50) ;

OLED显示

void Satrt_Disp(void)
{
DisplayChineseOnOLED(32,0,2);
DisplayChineseOnOLED(48,0,3);
DisplayChineseOnOLED(62,0,4);
DisplayChineseOnOLED(80,0,5);

DisplayChineseOnOLED(2,3,27);
DisplayChineseOnOLED(18,3,28);
DisplayChineseOnOLED(34,3,19);
DisplayChineseOnOLED(50,3,20);
DisplayChineseOnOLED(66,3,29);
DisplayChineseOnOLED(82,3,30);
DisplayChineseOnOLED(98,3,31);//ƽ
DisplayChineseOnOLED(112,3,32);//̨

DISPLAY_ShowChar(2,6,77); //M
DISPLAY_ShowChar(10,6,83); //S
DISPLAY_ShowChar(18,6,80); //P
DISPLAY_ShowChar(26,6,77); //M
DISPLAY_ShowChar(34,6,48); //0
DISPLAY_ShowChar(42,6,76); //L
DISPLAY_ShowChar(50,6,49); //1
DISPLAY_ShowChar(58,6,51); //3
DISPLAY_ShowChar(66,6,48); //0
DISPLAY_ShowChar(74,6,54); //6
DisplayChineseOnOLED(82,6,33);
DisplayChineseOnOLED(98,6,34);
DisplayChineseOnOLED(112,6,25);

}

void WorkPage_Fix_Disp(void)
{
DisplayChineseOnOLED(5,0,21);
DisplayChineseOnOLED(21,0,22);
DisplayChineseOnOLED(44,0,8);
DisplayChineseOnOLED(60,0,9);
DisplayChineseOnOLED(76,0,10);
DisplayChineseOnOLED(100,0,6);
DisplayChineseOnOLED(116,0,7);

}
void WorkPage_Data_Disp(void)

{

DisplayChineseOnOLED(5,0,11);

DisplayChineseOnOLED(21,0,12);

DisplayChineseOnOLED(44,0,8);

DisplayChineseOnOLED(60,0,9);

DisplayChineseOnOLED(76,0,10);

DisplayChineseOnOLED(98,0,6);

DisplayChineseOnOLED(114,0,7);

OLED_ShowNum(0, 3, 1, 1, 16);

DISPLAY_ShowChar(20,3,'2');

DISPLAY_ShowChar(28,3,'6');

OLED_ShowNum(45, 3, CycDuty, 3, 16);

OLED_ShowNum(100, 3, quency_NO1_DT/1000, 3, 16);

OLED_ShowNum(76, 6, 1, 1, 0); //1

DisplayChineseOnOLED(44,6,0);//ͨ

DisplayChineseOnOLED(60,6,1);



}

void SetPage_Data_Disp(void)

{
DisplayChineseOnOLED(5,0,21);
DisplayChineseOnOLED(21,0,22);

DisplayChineseOnOLED(44,0,8);

DisplayChineseOnOLED(60,0,9);

DisplayChineseOnOLED(76,0,10);

DisplayChineseOnOLED(100,0,6);

DisplayChineseOnOLED(116,0,7);

OLED_ShowNum(45, 2, CycDuty, 3, 16);

OLED_ShowNum(100, 2, quency_NO1_DT/1000, 3, 16);

OLED_ShowNum(45, 5, cDutyCycleNO2, 3, 16);

OLED_ShowNum(100, 5, iFrequencyNO2/1000, 3, 16);

}

void WorkPagesecond_Data_Disp(void)

{

DisplayChineseOnOLED(5,0,11);

DisplayChineseOnOLED(21,0,12);

DisplayChineseOnOLED(44,0,8);

DisplayChineseOnOLED(60,0,9);

DisplayChineseOnOLED(76,0,10);

DisplayChineseOnOLED(100,0,6);

DisplayChineseOnOLED(116,0,7);

OLED_ShowNum(0, 3, 2, 1, 16);

DISPLAY_ShowChar(20,3,'8');

OLED_ShowNum(45, 3, cDutyCycleNO2, 3, 16);

OLED_ShowNum(100, 3, iFrequencyNO2/1000, 3, 16);

OLED_ShowNum(76, 6, 2, 2, 2); //2

DisplayChineseOnOLED(44,6,0);

DisplayChineseOnOLED(60,6,1);

}

void DisplayPage(char mode )

{
switch ( mode )
{
case 0:

break ;
case 1: WorkPage_Data_Disp();

break;

case 2: WorkPagesecond_Data_Disp();

break;

default :
break ;
}

}



8、实际显示效果

开机显示界面:

1721281906855.png

显示通道1:

1721281973698.png

显示通道2:

1721282053641.png

9、总结


使用EVM_MSPM0L1306微控制器进行PWM信号生成和显示系统的设计包括硬件和软件两个方面。

硬件部分包含EVM_MSPM0L1306微控制器、OLED显示屏、按键开关、外部电路和串口通信模块;EVM_MSPM0L1306微控制器负责GPIO输入输出、定时器管理和OLED显示通信等功能;OLED显示屏用于显示PWM信息参数和引脚状态;按键开关用于设置频率占空比;外部电路提供PWM信号输出接口;串口通信模块用于与上位机通信。

软件实现步骤包括系统初始化(配置系统时钟、GPIO、定时器、OLED和UART),PWM配置(包括定时器中断、占空比控制、频率切换等),OLED显示(初始化和定期更新显示内容),以及串口通信(发送PWM参数);初始化部分配置系统时钟支持高频PWM生成,设置GPIO引脚用于PWM输出和按键输入,配置定时器生成两路独立的PWM信号,初始化OLED显示屏和串口通信;PWM配置部分通过定时器中断和按键切换调整频率和占空比;OLED显示部分在主循环中更新显示当前PWM参数和引脚状态;串口通信部分将PWM参数通过串口发送到上位机;整个系统的实现流程包括系统初始化、配置时钟、GPIO、定时器、OLED、UART,进入主循环,按键扫描,更新PWM参数,更新OLED显示,和串口数据发送。硬件功能图展示了各模块的功能和连接关系;systconfig配置PWM0部分详细说明了PWM0的时钟源、预分频器、PWM模式、周期和比较值等参数的配置。代码部分展示了如何通过按键切换PWM频率和占空比,并在OLED上显示相关信息。





附件下载
(YAO)WORK20240715.zip
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号