近期需要进行基于声音传播测距的实验,需要临时制作一款可以发送Chirp音频信号和接收信号的电路板。要求其中的内部RAM足够大,可以采集到音频信号进行后期处理。
电路硬件设计1
1.电路原理2
原理图设计-MCU及其接口
原理图设计-电源部分
2. 电路PCB版图
PCB版图
底部的两个接口的定义:
- 左4PIN接口:电源接口,PIN1,2:VCC(+5V), PIN3,4:GND
- 右8PIN接口:ADDA接口,见下面表格:
序号 | 符号 | 功能定义 |
---|---|---|
1 | AD0 | AD输入0 |
2 | AD0 | AD输入0 |
3 | AD0 | AD输入0 |
4 | AD0 | AD输入0 |
5 | GND | 电源地 |
6 | 3.3VA | 内部稳压模拟3.3V |
7 | DAC1 | DA输出1 |
8 | DAC2 | DA输出2 |
- 顶部4PIN接口:SPI接口,从左到右分别是:MOSI,MISO,SCK,NSS
- 左侧4PIN接口:IO口,从上到下:IO1,2,3,4
调试错误:
(1)在第一版本中没有将UART3的管脚引出来。
- 顶部的4PIN另外功能定义:根据STM32F103cb管脚复用,顶部的4PIN还可以定义为TIME3,TIME2的PWM输出。
PSPI管脚重新定义为TIME3,TIME2的PWM输出
在PIO中的IO从上到下分别是PB15,PB14,PB13,PB12。在CONTROL.H中分别定义为:IO1,IO2,IO3,IO4。
它们的输入,输出功能请在Control.C的初始化程序中进行设置。
PIO中定义的输入输出口
3. 电路软件3调试以及调用命令
安装完毕元器件之后,下载初步的开发软件,便可以设置读取AD采集的信号波形了。
安装完毕后,下载程序进行调试
![](https://i-blog.csdnimg.cn/blog_migrate/e2827248180d0398cc476966cb929779.gif#pic_center)
采集到的信号源典型波形
对F103内部的DA、AD模块初始化的语句。
HAL_ADC_Start(&hadc1);
HAL_ADC_Start(&hadc3);
HAL_ADC_Start(&hadc2);
//--------------------------------------------------------------------------
HAL_TIM_Base_Start_IT(&htim1);
g_nTime1InterruptCount = 0;
g_nADC1BufferPoint = 0;
extern DAC_HandleTypeDef hdac;
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
每个10ms通过如下语句赋值DAC1,DAC2相应的输出波形:
//--------------------------------------------------------------------------
if(++nShowCount >= 10) {
nShowCount = 0;
// printf("%d\r\n", g_nTime1InterruptCount);
DACOutput1(GetADC1());
DACOutput2(0xfff - GetADC1());
}
产生Chirp声音
1. 使用Python产生仿真Chirp波形
具体产生Chirp信号的参数和方法见下面的代码。
#------------------------------------------------------------
startf = 50
endf = 1500
data_length = 2048
samplefrequency = 5e3
deltat = 1/samplefrequency
#------------------------------------------------------------
angle = 0
data_buffer = []
#------------------------------------------------------------
for i in range(data_length):
data = int((sin(angle) + 1) * 0xfff)
data_buffer.append(data)
frequency = (endf - startf) * (i + 1) / data_length + startf
angle = angle + frequency * deltat
t = linspace(0, data_length * deltat, data_length, endpoint=True)
plt.plot(t, data_buffer)
plt.xlabel('Time (s)')
plt.ylabel('Sample Value')
plt.show()```
数学产生的Chirp信号
2. F103 产生相同的Chirp信号并输出
使用单片机产生的Chirp信号在示波器上显示的波形