基于EVM_MSPM0L1306开发套件实现音乐键盘
该项目使用了EVM_MSPM0L1306开发套件,实现了音乐键盘的设计,它的主要功能为:可以让不同按键发出不同音调,用电位计控制声音大小,用流水灯显示声音档位。
标签
嵌入式系统
taotie
更新2024-07-19
70

一、项目介绍

本项目旨在设计一个基于EVM_MSPM0L1306开发套件的系统,该系统通过矩阵键盘输入和ADC模块读取的模拟信号来控制PWM信号的频率和占空比,然后控制蜂鸣器发出的声音。

二、硬件介绍

MSPM0L1306 是一款 具有 64KB 闪存、4KB SRAM、12 位 ADC、比较器和 OPA 的 32MHz Arm® Cortex®-M0+ MCU。

三、设计思路

系统设计分为三个主要部分:矩阵键盘扫描、ADC信号读取和PWM信号生成。矩阵键盘用于接收用户输入,ADC模块用于采集模拟信号,PWM模块用于生成相应的脉冲信号。

设计思路图如下:

d7a1506cdcd16f4d93c74c7a6580187b.png

四、代码分析

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
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号