使用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、软件工作流程图:
5、硬件功能图:
6、systconfig配置PWM0
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、实际显示效果
开机显示界面:
显示通道1:
显示通道2:
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上显示相关信息。