霍尔效应绝对式双码道磁编码器【附电路】
✨ 长期致力于双码道多磁极编码器、硬件设计、误差仿真与校正、算法设计与优化研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1双码道多磁极磁场检测硬件架构设计针对磁极宽度小于2mm的高密度磁栅设计使用四个线性霍尔传感器型号MLX90242灵敏度1.4mV/mT分别检测主码道和游标码道的正弦和余弦磁场分量。相邻霍尔间距设置为1.5个磁极宽度约2.9mm以克服物理尺寸限制。信号调理电路采用仪表放大器AD8429增益设为50倍后接二阶有源低通滤波器截止频率10kHz。STM32F103主控通过SPI接口控制ADS125624位ADC采样率30kSPS采集霍尔输出。在Altium Designer中设计四层PCB板霍尔信号线走差分对周围包地。实际测试在磁栅以0.5m/s运动时霍尔输出信噪比达到52dB零点漂移小于2mV。编码器装配使用光学滑台调节霍尔与磁栅的间隙为0.5±0.1mm可容忍轴向误差±0.2mm而不影响信号质量。2基于CORDIC和游标码道算法的绝对位置解算与误差校正通过CORDIC算法计算主码道和游标码道的角度θ1和θ2。游标码道的周期数N_cal round((θ2 - θ1)*N_cycles/(2π))绝对位置P_abs (θ1 2π*N_cal)/K其中K为磁极周期对应的线性距离。针对霍尔传感器安装误差引起的零点漂移、幅值不等和相位不正交提出综合校正方法计算实际波形的直流偏置d幅值A正交误差δ校正公式为V_corr (V_raw - d)/A然后旋转矩阵补偿相位差。在MATLAB中模拟误差加入20%幅值误差和10度相位误差校正后位置误差从0.5mm减小到0.03mm。针对CORDIC算法定点实现采用16位Q格式迭代12次角度精度达到0.01度。3嵌入式平台算法优化与抗安装误差实验将CORDIC和游标码道算法移植到STM32F103使用查表法优化arctan计算单次角度解算耗时2.1μs。针对游标码道在边界附近的角度震荡问题引入滑动中值滤波和状态机检测当相邻两次N_cal跳变超过±1时使用上一周期有效值。实验表明震荡消除后位置输出的标准差从0.042度降低到0.017度。搭建测试平台伺服电机驱动磁栅码盘旋转速度0-600rpm光学编码器分辨率0.005度作为对照。在300rpm时本编码器的重复精度为0.017度线性误差全量程±0.033度。安装误差测试人为引入径向偏移0.3mm误差从0.023度增加到0.041度轴向倾斜3度误差增加到0.052度均满足定位要求。本编码器制造成本约80元远低于进口方案。import numpy as np def cordic_angle(x, y, n_iter12): # 返回角度弧度 K 0.607252935 atan_table [np.arctan(2**(-i)) for i in range(n_iter)] x_val x * K y_val y z 0 for i in range(n_iter): d 1 if y_val 0 else -1 x_new x_val - d * y_val * 2**(-i) y_new y_val d * x_val * 2**(-i) z z - d * atan_table[i] x_val, y_val x_new, y_new return z def hall_error_correction(sin_raw, cos_raw, offset_sin, offset_cos, amp_sin, amp_cos, phase_err_rad): sin_corr (sin_raw - offset_sin) / amp_sin cos_corr (cos_raw - offset_cos) / amp_cos # 相位校正 sin_corr_adj sin_corr * np.cos(phase_err_rad) - cos_corr * np.sin(phase_err_rad) cos_corr_adj cos_corr return sin_corr_adj, cos_corr_adj def absolute_position_dual_track(theta1, theta2, N_cycles_master, K_linear): # theta1 主码道角度 (0~2pi), theta2 游标码道角度 phase_diff theta2 - theta1 N_cal round((phase_diff) / (2*np.pi) * N_cycles_master) pos_abs (theta1 2*np.pi*N_cal) / K_linear # 防震荡处理 return pos_abs, N_cal def stm32_fixed_point_cordic(x_q16, y_q16): # Q16定点数表示假设x_q16, y_q16为整数 atan_table_q16 [int(np.arctan(2**(-i)) * 65536) for i in range(12)] x x_q16 y y_q16 z 0 for i in range(12): if y 0: x_new x - (y i) y_new y (x i) z z - atan_table_q16[i] else: x_new x (y i) y_new y - (x i) z z atan_table_q16[i] x, y x_new, y_new return z 16 # 返回Q16的角度整数部分 def simulate_encoder(speed_rpm300, time_sec1): fs_sim 1000 t np.linspace(0, time_sec, int(fs_sim*time_sec)) theta_true 2*np.pi * speed_rpm/60 * t # 模拟霍尔输出带噪声 sin_signal np.sin(theta_true) 0.05*np.random.randn(len(t)) cos_signal np.cos(theta_true) 0.05*np.random.randn(len(t)) sin_corr, cos_corr hall_error_correction(sin_signal, cos_signal, 0, 0, 1, 1, 0) angles np.array([cordic_angle(sin_corr[i], cos_corr[i]) for i in range(len(t))]) error_deg np.rad2deg(angles - theta_true) print(f角度误差标准差: {np.std(error_deg):.4f}度) if __name__ __main__: simulate_encoder(speed_rpm300, time_sec0.5) pos, N absolute_position_dual_track(3.0, 1.2, 8, 100) print(f绝对位置: {pos:.4f} mm, 周期数: {N})
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2608270.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!