内容介绍
内容介绍
一、项目介绍
本项目旨在设计一个基于EVM_MSPM0L1306开发套件的系统,该系统通过矩阵键盘输入和ADC模块读取的模拟信号来控制PWM信号的频率和占空比,然后控制蜂鸣器发出的声音。
二、硬件介绍
MSPM0L1306 是一款 具有 64KB 闪存、4KB SRAM、12 位 ADC、比较器和 OPA 的 32MHz Arm® Cortex®-M0+ MCU。
三、设计思路
系统设计分为三个主要部分:矩阵键盘扫描、ADC信号读取和PWM信号生成。矩阵键盘用于接收用户输入,ADC模块用于采集模拟信号,PWM模块用于生成相应的脉冲信号。
设计思路图如下:
四、代码分析
1、adc模块
void ADC_get()
{
ADC_Value = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
if(ADC_Value>=3000)
{
DL_GPIO_clearPins(LED_PORT, LED_LED1_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED2_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED3_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED4_PIN);
i = 0.007;
}
else if(ADC_Value>=2500)
{
DL_GPIO_clearPins(LED_PORT, LED_LED1_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED2_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED3_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED4_PIN);
i = 0.0035;
}
else if(ADC_Value>=2000)
{
DL_GPIO_clearPins(LED_PORT, LED_LED1_PIN);
DL_GPIO_clearPins(LED_PORT, LED_LED2_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED3_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED4_PIN);
i = 0.0026;
}
else if(ADC_Value>=1500)
{
DL_GPIO_clearPins(LED_PORT, LED_LED1_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED2_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED3_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED4_PIN);
i = 0.002;
}
else
{
DL_GPIO_setPins(LED_PORT, LED_LED1_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED2_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED3_PIN);
DL_GPIO_setPins(LED_PORT, LED_LED4_PIN);
i = 0.0016;
}
}
在本函数中,通过识别电位计的值,控制了led的输出即音量的显示,同时也设置了占空比i,控制了音量的大小。
2、矩阵键盘模块
本项目中使用的是扫描法识别按键,可以减少模块占用的资源。
首先定义了键值和按键标志的变量
uint8_t key_num = 0; // 按键值1-16,默认为0
uint8_t key_flag = 0; // 按下按键标志
然后是按键消抖,延时30ms
if (key_flag)
{
delay_ms(30); // 30ms延迟,防止按下一次按键却被认为按下了多次按键,导致得到了多个相同的按键值
key_flag = 0; // 按下按键标志清零
}
选择行扫描,首先将第一行拉低,将其他行拉高
DL_GPIO_clearPins(MAT_KEY_PORT, MAT_KEY_ROW0_PIN);
DL_GPIO_setPins(MAT_KEY_PORT, MAT_KEY_ROW1_PIN | MAT_KEY_ROW2_PIN | MAT_KEY_ROW3_PIN);
delay_ms(10);
然后再对每一列进行检测,如果有哪一列是低电平,则代表那一列的按键被按下
if (!DL_GPIO_readPins(MAT_KEY_PORT, MAT_KEY_COL0_PIN))
{
key_num = 1;
key_flag = 1; // 按键已按下
}
else if (!DL_GPIO_readPins(MAT_KEY_PORT, MAT_KEY_COL1_PIN))
{
key_num = 2;
key_flag = 1;
}
else if (!DL_GPIO_readPins(MAT_KEY_PORT, MAT_KEY_COL2_PIN))
{
key_num = 3;
key_flag = 1;
}
else if (!DL_GPIO_readPins(MAT_KEY_PORT, MAT_KEY_COL3_PIN))
{
key_num = 4;
key_flag = 1;
}
其他列的扫描和以上代码类似,最后再返回key_num的值。
3、PWM控制模块
调用adc模块和矩阵键盘模块,根据读取到的值对PWM的频率和占空比进行设置。
DL_ADC12_startConversion(ADC12_0_INST);
ADC_get();
key_num = Key(); // 读取按键值1-16,默认为0
DL_Timer_setCaptureCompareValue(PWM_0_INST,(int)((1-i)*(128000-400*key_num)),GPIO_PWM_0_C0_IDX);
if (key_num != 0)
{
DL_Timer_setLoadValue(PWM_0_INST, 128000-400*key_num);
}
if (key_num == 0)
DL_Timer_setLoadValue(PWM_0_INST, 10000);
五、实物展示
如图是音量为"2挡"时的实物图
六、心得体会
通过这次活动,我学习了使用EVM_MSPM0L1306开发套件制作音乐键盘,希望以后能多参加这样的活动。
附件下载
music.zip
团队介绍
小田
评论
0 / 100
查看更多
猜你喜欢
基于EVM_MSPM0L1306开发套件实现简易音乐键盘该项目使用了EVM_MSPM0L1306开发套件,实现了音乐键盘的设计,它的主要功能为:使用矩阵键盘、蜂鸣器、流水灯和电位计设计音乐键盘,让不同按键发出不同音调,电位计用来控制声音大小,流水灯用来显示声音档位。。
Riccck
94
基于EVM_MSPM0L1306开发套件制作音乐键盘该项目使用了EVM_MSPM0L1306开发套件,实现了音乐键盘的设计,它的主要功能为:按下不同按键使蜂鸣器发出不同音调,调节电位计控制声音大小,LED亮的数量显示声音大小。
EliorFoy
204
基于EVM_MSPM0L1306开发套件设计音乐键盘该项目使用了EVM_MSPM0L1306开发套件,实现了音乐键盘的设计,它的主要功能为:基于MSPM0L1306,键盘按键检测,驱动无源蜂鸣器播放发出不同频率的声音,OLED显示和LED显示音量大小档位和其它信息,电阻ADC检测调整音量大小。
weiwei4
11