元驭机器人元驭机器人Hall 传感器教学下载原文件
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 */