当前位置: 首页 > news >正文

【stm32简单外设篇】- 高灵敏麦克风传感器模块 KY-037

一、适用场景
适用场景:环境声检测(噪声报警、声音触发)、语音唤醒前端(检测能量阈值唤醒 MCU/采样)、敲击/拍手检测、简单声级指示、课堂声音信号采集与 ADC/滤波练习、触发式录音/拍照等。

二、器材清单

KY-037 麦克风传感器模块×1

stm32f103(或其它 STM32)开发板 ×1

若干杜邦线(母对母/公对母)×1组

5V稳定电源×1

三、工作原理(要点)

KY-037 通常包含电容/驻极体麦克风 + 前置放大电路 + LM393(或类似)比较器。

四、接线示意
VCC → 5V

GND → GND

标准库-数字信号

PA0→DO

标准库-模拟信号

PC1→AO

HAL库-数字信号

PA0-DO

五、示例代码

标准库-数字信号

#include "stm32f10x.h" #include "stdio.h" #include "bsp_SysTick.h" #include "bsp_usart.h" void gpio_init() { GPIO_InitTypeDef PA; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); PA.GPIO_Pin = GPIO_Pin_0; PA.GPIO_Mode = GPIO_Mode_IPU; PA.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&PA); } int main() { USART_Config(); SysTick_Init(); gpio_init(); while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET) { Usart_SendString(USART1,"nothing\n"); }else { Usart_SendString(USART1,"noise\n"); } Delay_us(1000000); } // return 0; }

标准库-模拟信号

#include "breathing.h" #include "stm32f10x.h" #include "stdio.h" #include "bsp_usart.h" char showlight[20]; extern volatile uint16_t adc_light; uint16_t num_final=10; uint16_t adc_indexlight[] = { 1024,901,792,697,613, 539,474,417,367,323, 284,250,219,193,170, 149,131,116,102,89, 79,69,61,53,47, 41,36,32,28,25, 22,19,17,15,13, 11,10,9,8,7, 6,5,5,4,4, 3,3,2,2,2, 2,1,1,1,1, 0,0,0,0 }; void GPIO_twoInit() { GPIO_InitTypeDef PD; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); PD.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; PD.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD,&PD); } void TIM_GPIO_Init() { GPIO_InitTypeDef PB; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); PB.GPIO_Pin = GPIO_Pin_5; PB.GPIO_Speed = GPIO_Speed_50MHz; PB.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&PB); } void TIM_PWM_Init() { TIM_TimeBaseInitTypeDef TIM; TIM_OCInitTypeDef TIM_OC; NVIC_InitTypeDef nvic; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM.TIM_Prescaler = (1024-1); //配置预装载值 TIM.TIM_Period = (200-1); //配置预分频值 TIM.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数为不分频 TIM.TIM_CounterMode = TIM_CounterMode_Up; //设置向上计数 TIM_TimeBaseInit(TIM3,&TIM); TIM_OC.TIM_OCMode = TIM_OCMode_PWM1; //选择工作模式为PWM TIM_OC.TIM_OutputState = TIM_OutputState_Enable; //使能PWM的输出 TIM_OC.TIM_Pulse = 0; //配置脉冲宽度为0 TIM_OC.TIM_OCPolarity = TIM_OCPolarity_Low; //小于脉冲宽度时为低电平 TIM_OC2Init(TIM3,&TIM_OC); TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能定时器通道2预装载 TIM_ARRPreloadConfig(TIM3,ENABLE); //使能重装载寄存器 TIM_Cmd(TIM3,ENABLE); //使能定时器3 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); nvic.NVIC_IRQChannel = TIM3_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 4; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); } void TIM3_Init() { TIM_GPIO_Init(); TIM_PWM_Init(); } void TIM3_IRQHandler(void) { uint16_t value; static uint16_t num_cnt = 0; value = (adc_light)/74; if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) { num_cnt++; if(num_cnt > num_final) { TIM_SetCompare2(TIM3,adc_indexlight[value]); sprintf(showlight,"light:%d,value:%d\n",adc_light,value); Usart_SendString(USART1,showlight); num_cnt=0; } } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); } #include "adc_time.h" #include "stm32f10x.h" volatile uint16_t adc_light; void adcgpio_init() { GPIO_InitTypeDef PC; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); PC.GPIO_Pin = GPIO_Pin_5; PC.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC,&PC); } void adcmode_init() { ADC_InitTypeDef adc; NVIC_InitTypeDef nvic; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); adc.ADC_Mode=ADC_Mode_Independent; adc.ADC_ScanConvMode = DISABLE; adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 1; ADC_Init(ADC2,&adc); RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5); ADC_ITConfig(ADC2,ADC_IT_EOC,ENABLE); ADC_Cmd(ADC2,ENABLE); ADC_ResetCalibration(ADC2); while(ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2); while(ADC_GetCalibrationStatus(ADC2)); ADC_SoftwareStartConvCmd(ADC2,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); nvic.NVIC_IRQChannel = ADC1_2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 3; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); } void adctime_Init() { adcgpio_init(); adcmode_init(); } void ADC1_2_IRQHandler(void) { if(ADC_GetITStatus(ADC2,ADC_IT_EOC) == SET) { adc_light = ADC_GetConversionValue(ADC2); } ADC_ClearITPendingBit(ADC2,ADC_IT_EOC); } #include "stm32f10x.h" #include "stdio.h" #include "bsp_SysTick.h" #include "adc_time.h" #include "breathing.h" #include "bsp_usart.h" //char showlight[20]; //extern volatile uint16_t adc_light; int main() { SysTick_Init(); TIM3_Init(); USART_Config(); adctime_Init(); while(1) { // sprintf(showlight,"light:%d\n",adc_light); // Usart_SendString(USART1,showlight); // Delay_us(1000000); } // return 0; }

HAL库-数字信号

#include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1) HAL_UART_Transmit(&huart1,"无声音\r\n", strlen("无声音\r\n"), HAL_MAX_DELAY); else HAL_UART_Transmit(&huart1,"有声音\r\n", strlen("有声音\r\n"), HAL_MAX_DELAY); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

六、讲解视频

https://www.bilibili.com/video/BV1AwmcBZEGN/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1nNmcBREhL/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1nNmcBREQ8/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

http://www.jsqmd.com/news/85680/

相关文章:

  • 3个方法彻底优化你的Windows 11任务栏体验
  • Obsidian代码美化神器:Better CodeBlock插件终极使用指南
  • PCL社区版:重新定义我的世界启动体验
  • Tsukimi:重新定义你的Emby媒体中心体验
  • Qwen3-VL-8B:80亿参数掀起多模态AI实用化革命
  • 5大实战技巧:用ControlNet让AI精准生成电商商品图
  • 终极指南:5分钟掌握Etcher镜像烧录工具
  • MonitorControl:macOS外接显示器亮度控制终极方案
  • wiliwili跨平台B站客户端:从零开始的完整使用指南
  • Vue组件库性能优化实战:如何让表格渲染快如闪电
  • 如何快速解决大数据表格渲染卡顿:umy-ui终极性能优化实践指南
  • 3大理由告诉你为什么这款独立截图神器值得拥有?
  • 终极免费存档编辑器:全面掌控你的塞尔达传说旷野之息冒险
  • AgileBoot全栈开发框架:从入门到精通的完整指南
  • FastExcel:高效处理Excel数据的.NET解决方案
  • Parsec VDD虚拟显示器完整指南:Windows系统高分辨率虚拟屏幕一键配置教程
  • AWR1843毫米波雷达Python实战:从零搭建实时感知系统
  • ThinkPad黑苹果深度体验:从硬件兼容到系统完美运行
  • macOS连接Android手机USB网络共享的完整配置指南
  • scikit-learn神经网络实战指南:从入门到精通
  • 思源黑体TTF:7个重量级的免费多语言字体解决方案
  • 腾讯混元3D-Part开源:让3D建模像搭乐高一样简单的革命性突破
  • DeepSeek-Coder长序列处理实战指南:从配置优化到性能调优
  • DeepSeek-Prover-V1:用合成数据突破数学推理极限的AI模型
  • Defender Control:终极Windows Defender禁用工具完整指南
  • 终极FF14插件框架:提升游戏体验的完整指南
  • 终极懒人包!5分钟搞定mpv播放器完整配置指南
  • 1.2B参数挑战27B大模型:Liquid AI轻量级多语言数据提取技术颠覆行业
  • Switch控制器PC连接3步完美解决方案:从新手到高手全攻略
  • Windows存储革命:Btrfs文件系统深度体验与性能飞跃