1/*!2 \file hall_line.h3 \brief 三颗等间距霍尔组成的直线位置45 物理顺序沿直线为 U1、U2、U4,间距 10 mm。U2 是 0,正方向指向 U4,6 所以 U1 在 -10 mm,U4 在 +10 mm。顺序和板子不一致时,只改下面三个下标。78 先减掉零磁场基线,再把绝对值最大的那一路翻成正峰。位置用峰和9 更强的相邻一路做对数高斯比值,敏感宽度要和磁铁高度一起调。10 结果写进 hall_sample_t.angle_cdeg,单位是 0.01 mm,不是角度。11*/1213#ifndef HALL_LINE_H14#define HALL_LINE_H1516#include "hall_encoder.h"1718#define HALL_LINE_PITCH_UM 1000019#define HALL_LINE_SPAN_UM 1500020#define HALL_LINE_SIGMA_DEFAULT 8000U21#define HALL_LINE_SIGMA_MIN 2000U22#define HALL_LINE_SIGMA_MAX 30000U2324/*! 原码下标:左、中、右。默认就是 U1、U2、U4 */25#define HALL_LINE_LEFT 026#define HALL_LINE_MID 127#define HALL_LINE_RIGHT 22829/*!30 \brief 装入基线、敏感宽度和机械零点31 valid 为 0 时基线用 2048,并清掉“已校准”标志。32 \param[in] baseline: 三路零磁场原码33 \param[in] valid: 非 0 表示基线可用34 \param[in] sigma_um: 高斯宽度,单位 µm,超出范围时用默认 8 mm35 \param[in] zero_cmm: 要从位置里减掉的零点,单位 0.01 mm36 \retval none37*/38void hall_line_apply(const int16_t baseline[3], uint8_t valid,39 uint16_t sigma_um, int16_t zero_cmm);4041/*!42 \brief 读出当前基线、宽度和零点43 基线还没采过时,baseline 写成 0,valid 为 0。实际解算仍按 2048 去零。44 \param[out] baseline: 三路基线45 \param[out] valid: 基线是否有效46 \param[out] sigma_um: 敏感宽度,µm47 \param[out] zero_cmm: 机械零点,0.01 mm48 \retval none49*/50void hall_line_get(int16_t baseline[3], uint8_t *valid,51 uint16_t *sigma_um, int16_t *zero_cmm);5253/*!54 \brief 修改敏感宽度,不改基线和零点55 \param[in] sigma_um: 2000..30000 µm56 \retval none57*/58void hall_line_sigma_set(uint16_t sigma_um);5960/*!61 \brief 开始对零磁场取平均。磁铁要先拿开62 \retval none63*/64void hall_line_cal_begin(void);6566/*!67 \brief 用已经采到的平均值作为基线68 \retval HALL_CAL_OK、HALL_CAL_IDLE 或 HALL_CAL_WEAK69*/70uint8_t hall_line_cal_finish(void);7172/*!73 \brief 丢掉基线,回到 2048。零点和敏感宽度保留74 \retval none75*/76void hall_line_cal_clear(void);7778/*!79 \brief 设置要减掉的机械零点80 \param[in] zero_cmm: 0.01 mm81 \retval none82*/83void hall_line_zero_set(int16_t zero_cmm);8485/*!86 \brief 当前机械零点87 \retval 0.01 mm88*/89int16_t hall_line_zero_get(void);9091/*!92 \brief 把此刻的位置记成 093 \retval none94*/95void hall_line_zero_capture(void);9697/*!98 \brief 读原码并解算位置99 angle_cdeg 在这里是有符号的 0.01 mm,amplitude 是正峰的 ADC 计数。100 \param[out] sample: 原码、位置和峰值101 \retval none102*/103void hall_line_read(hall_sample_t *sample);104105/*!106 \brief 弱磁、基线有效、正在采基线、超出阵列107 \param[in] sample: 最近一次解算108 \retval HALL_FLAG_* 的组合109*/110uint8_t hall_line_flags(const hall_sample_t *sample);111112#endif /* HALL_LINE_H */