简单的声悬浮装置
引言偶然间在网上刷到视频感觉声悬浮很酷很带感想着应该难度又不大因此参照了网上的别人比赛的博客在最后会放出链接着手做了做硬件准备1.超声波换能器2.FPGA 3.单片机主控板 4驱动降压模块 5.电源 6.电机模块可选用硬件推荐1.换能器TCT40_16尺寸是10mm的一定要只买发射的也就是T的2.FPGAEP4CE6E22C8N开发板主要还是便宜引脚也够fpga好的都要上百/(ㄒoㄒ)/~~3.单片机如果你精通FPGA可以不用单片机也可以作者比较菜用了ESP32来做上位机开发4.驱动FPGAio口肯定是带不动换能器的所以肯定需要功放选择的是EG27324双路驱动5.电源向实验室某个大能夺舍一个可调电源12v稳定供电就行6 其他换能器极板之间最好可控距离最好加一个电机来控制距离有能力可以做成三维打印机差不多的那种我用了一个张大头的步进电机做高度控制硬件设计设计的比较粗糙作者秉持能用就行建议有能力可以自己改一改电路板驱动降压板原理图1.原理图单个驱动原理图降压供电PCB设计换能器板总体硬件搭建代码部分我只实现了悬浮功能就是定点悬浮,照理说实现了定点就基本上可以实现移动但是我一改变悬浮点就掉可能4X4规模太小了你可以尝试5×5或者更大大概理解为控制用距离相位叠加计算出来每个换能器的相位ESP32主要部分// 相位计算 uint8_tcalc_phase(floatxi,floatyi,floatzi){floatdxxi-abs(x-15)*0.001;floatdyyi-abs(y-15)*0.001;floatdzzi-target_z;floatdsqrt(dx*dxdy*dydz*dz);floatphifmod(k*d,2*PI);if(phi0)phi2*PI;return(uint8_t)(phi/(2*PI)*255.0);}// 初始化阵列 voidinit_array(){floatx[4],y[4];for(inti0;i4;i){x[i](-(N-1)/2.0i)*dx;y[i](-(N-1)/2.0i)*dx;}intidx0;for(intj0;j4;j){for(inti0;i4;i){trans_bottom[idx][0]x[i];trans_bottom[idx][1]y[j];trans_bottom[idx][2]z_bottom;trans_top[idx][0]x[i];trans_top[idx][1]y[j];trans_top[idx][2]z_top;idx;}}}// 计算全部相位 voidcalc_all_phases(){for(inti0;i16;i){phases[i]calc_phase(trans_bottom[i][0],trans_bottom[i][1],trans_bottom[i][2]);}for(inti0;i16;i){uint8_tphcalc_phase(trans_top[i][0],trans_top[i][1],trans_top[i][2]);phases[16i](ph128)%256;}}FPGA主要模块用于生成不同相位的40khz波形module phase_out_32ch #( parameter CLK_FREQ 50000000, parameter FREQ 40000 )( input wire clk, input wire rst_n, input wire [255:0] phase_bus, // 32×8bit 相位 output reg [31:0] out ); // DDS参数 localparam PHASE_WIDTH 24; localparam HALF (1 (PHASE_WIDTH-1)); localparam STEP (FREQ * (64d1 PHASE_WIDTH)) / CLK_FREQ; // 相位拆分 wire [7:0] phase [31:0]; genvar i; generate for (i0; i32; ii1) begin : SPLIT assign phase[i] phase_bus[i*8 : 8]; end endgenerate // 相位累加器 reg [PHASE_WIDTH-1:0] phase_acc [31:0]; reg [PHASE_WIDTH-1:0] phase_total [31:0]; // 主逻辑 integer k; always (posedge clk or negedge rst_n) begin if (!rst_n) begin for (k0; k32; kk1) begin phase_acc[k] 0; phase_total[k] 0; out[k] 0; end end else begin for (k0; k32; kk1) begin // DDS累加 phase_acc[k] phase_acc[k] STEP; phase_total[k] phase_acc[k] {phase[k], {(PHASE_WIDTH-8){1b0}}}; if (phase_total[k] HALF) out[k] 1b1; else out[k] 1b0; end end end endmodule结果图参考博客https://blog.csdn.net/xiaoxuesheng2018/article/details/130836736?spm1001.2014.3001.5506

相关新闻