目录
一、实现效果概述
使用麦克风拾音模块,采样到的模拟信号通过ADC外设转换,接着通过液晶屏显示ADC值的变化波形。
硬件环境(F103ZET6精英开发板+4.3寸液晶屏+拾音模块)
效果如图:
二、实现流程图
三、代码实现(HAL库)
(1)手敲版本
MIC_ADC.c
ADC_HandleTypeDef hadc1; //句柄
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO配置结构体*/
ADC_ChannelConfTypeDef sConfig = {0}; /*ADC工作参数配置结构体*/
RCC_PeriphCLKInitTypeDef ADC_CLK_Init={0}; /* ADC时钟配置结构体*/
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* GPIO配置*/
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
/* ADC时钟配置*/
ADC_CLK_Init.AdcClockSelection=RCC_ADCPCLK2_DIV6;//采样频率12M
ADC_CLK_Init.PeriphClockSelection=RCC_PERIPHCLK_ADC;
HAL_RCCEx_PeriphCLKConfig(&ADC_CLK_Init);
/*ADC工作参数配置*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //失能扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; //开启连续转换
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //数据右对齐
hadc1.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发
hadc1.Init.NbrOfConversion = 1; //转换通道数量
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_1; // 18个通道之一
sConfig.Rank = ADC_REGULAR_RANK_1; // 规则组系列1
/*转换28.5个周期 即转换时间:12.5+28.5=41个周期 所需时间:41* 1/12M 约为 3.41微秒 */
sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADCEx_Calibration_Start(&hadc1);/* 校准:数据手册有具体描述*/
}
uint16_t ADC1_GetValue(void)
{
HAL_ADC_Start(&hadc1); //软件触发
/* 函数名:HAL_ADC_PollForConversion(参数1,参数2)
参数2:等待超时完成时间 单位毫秒,这里根据具体情况进行调参,
我们这里只需要3.41微秒,具体参考程序源码介绍*/
HAL_ADC_PollForConversion(&hadc1,5); //等待转换完成,等待时间5毫秒
return (uint16_t)HAL_ADC_GetValue(&hadc1); //返回AD值
}
main函数
int main()
{
HAL_Init();
SystemClock_Config(); //时钟配置
ADC1_Init(); // ADC参数配置
LCD_4_3_Init(1); //横屏显示
while(1)
{
NEW_LCD_4_3_Draw_DynamicalWave(1); //显示波形
LCD_Update(RED);
}
}
(2)CubeMX配置版本
选择具体MCU型号
配置晶振
配置ADC时钟
配置系统时钟树
配置程序下载仿真接口
ADC外设配置
工程存放路径配置
生成代码配置
最后一步:点击生成工程
最后在工程中自己写一些逻辑代码
PS. 以上文章内容,如有错误,请大家不吝指正!