编写单片机串口收发数据
如何搭建一个音频电路,然后将模拟量传输给单片机采集?
如何搭建一个音频电路,然后将模拟量传输给单片机采集?
针对题主的问题一,本人特意设计了一个电路,进行详细分析,并说明了软件设计的一些要点,希望对题主有所帮助。
P1是麦克风的接线端子,用于外接麦克风;
R1上拉到电源电压VCC,用于给MIC提供偏置电压,其电阻值需要根据MIC的规格书选定。
R3,R4串联接到VCC,其分压连接到运放的同相输入端,作为运放的直流偏置,我们选择VCC/2作为运放的直流偏置,有两个目的,一个是运放可以用单电源供电,另一个目的将交流的音频信号做电平抬升至正电压,以输入到MCU的ADC口。
由于电容C1的存在,运放A的直流通路是一个电压跟随器,也是是同相、反相和输出端的直流电平都是VCC/2.
人耳可以听到的声音范围是20Hz-20KHz,一般人说话的声音在几百到2KHz范围内,高音部分可能最高到8KHz左右。考虑到MCU的资源和性能,我们把ADC转换率做到8KHz ,根据奈奎斯特采样定理, 8KHz的ADC可以还原4KHz的信号。
C1和R2,R5构成高通滤波器,可以选择合适的C1,R2,使得该高通滤波器的截止频率在几十Hz左右。
R5,C2构成低通滤波器,选择合适的C2,R5,使得截止频率做到10KHz左右。
运算放大器的放大倍数为R5/R2,可以根据MIC输出的信号幅度,选择合适的放大倍数;
R6,R7进一步分压,使得运放输入的信号最大和最小值在MCU的ADC输入范围内。
R6,R7和C3的截止频率应该小于2倍的ADC采样率,否则会发生频谱混迭,导入高频干扰。
R6,R7应该在5K以内取值,太大会导致ADC的采样电容无法正确采样到电压进行转换;
接下来讲一下软件设计:
刚才说到,ADC的转换频率需要做到8KHz,也就是125uS需要做完一个转换。
如果我们采用16位的AD,至少需要16个ADC的时钟完成一次转换,再加上采样时间。因此ADC的时钟需要设置在5us左右。
另外ADC的转换的启动触发,最好采用定时器自动触发ADC转换,MCU如果没有这个功能,需要用定时器软件中断去触发转换。
设置定时器每125us中断一次,在中断程序里,在读取上一次转换值之后,再启动下一次的转换;
ADC转换数据的存储及处理:
根据MCU任务调度的分配,ADC的数据处理宜在每隔几百ms处理一次。
这个处理可能是存在flash,或者是通过串口/网络发送给其它设备;
存储的速度或者数据发送速度必须要大于转换速度。
8kHz的转换率,如果是16位AD,需要flash以大于16Kbyte/s的速度进行存储。
串口的波特率以及网络发送速度至于大于128Kbps。
这样需要一个先进先出的环形数组,数组大于必须要能保存几百ms的数据,需要大概几k的RAM空间。
最好是通过DMA进行数据存储和发送。
综上,MCU需要有8K转换率的ADC,几K的RAM空间,要有高速的串口或网络发送模块,或者是大于16Kbyte/s的存储媒介,最好有DMA功能,定时器能自动触发AD启动转换。
单片机怎样把采集的数据上传到网站的数据库中?
答:1、直接:单片机配以太网接口,移植个tcp/ip协议站,单片机直接登陆服务器上传数据;
2、间接:单片机通过串口、USB等其他接口把数据传给有以太网的模块或设备(如电脑),在传到服务器。
方式找一块nb模块,譬如M5310a,利用物联网协议MQTT,发送个中移物联网平台.然后服务器后台也就是java程序去从云平台主动获取后存入数据库.