作者:卓晴博士,清华大学自动化系
更新时间:2020-07-26 Sunday

■ 设计背景


用永磁铁的磁场可以给目标位增加可识别标记。需要设计一款基于 线性HALL器件 来识别被检测物品磁标的极性和强度。在 磁铁周围的磁场 对磁铁周围的磁场进行了检测。

被检测的磁铁是一款长方形:它的尺寸为:

  • 长:20mm
  • 宽:9.5mm
  • 厚:1.67mm

▲ 长方形的永磁铁

根据 磁铁周围的磁场 中的结果,如果HALL距离磁铁的距离小于10mm,磁铁之间相距10mm,使用HALL可以 比较准确获得对应的磁铁的极性。

01电路设计


1.硬件设计1

设计一个可以检测三个磁铁的电路板,通过单片机STC8G1K来读取HALL的输出值,判断磁铁是否存在以及相应的极性。

通过单片机的AD口直接读取HALL3505的输出电压。从而判断是否存在磁铁。

▲ 实验电路板设计

2.单片机软件2

  • OSC:35M, UART:460800bps

(1) 测试LED

将LED限流电阻减少到100欧姆,除了绿色LED之外,红色和黄色的LED闪烁比较明显。

测量绿色和黄色LED对应MCU管脚的波形,可以看到上面的电压波形基本相似。在相同的限流电阻的作用下流经LED的电流相同。这说明不同颜色的LED发光效率不同。

▲ 测量绿色和黄色单片机管脚波形

(1) 测试ADC

测量三个HALL的输出以及ADC的输出为:

ADC1 ADC2 ADC3
0.110 0.111 0.110
539 519 396

(2) 测量磁铁与HALL之间距离影响ADC

▲ 测量磁铁与HALL之间的距离影响HALL输出

▲ 磁铁距离HALL距离与HALL之间的关系

将磁铁从上往下靠近HALL,重新测量距离对HALL输出的 影响。

▲ 从上往下改变磁铁与HALL之间的距离

▲ 磁铁距离HALL距离与HALL之间的关系

val=[271.00,274.00,274.00,276.00,275.00,276.00,277.00,277.00,280.00,280.00,284.00,289.00,297.00,305.00,312.00,319.00,327.00,334.00,341.00,348.00,353.00,359.00,366.00,370.00,376.00,383.00,389.00,396.00,399.00,407.00,412.00,417.00,423.00,428.00,432.00,436.00,440.00,445.00,449.00,452.00,455.00,458.00,462.00,463.00,467.00,470.00,472.00,475.00,477.00,480.00,481.00,482.00,484.00,487.00,488.00,490.00,492.00,493.00,496.00,496.00,497.00,498.00,500.00,501.00,503.00,504.00,504.00,506.00,506.00,507.00,508.00,509.00,510.00,510.00,511.00,511.00,511.00,513.00,515.00,514.00,515.00,515.00,516.00,517.00,518.00,519.00,519.00,519.00,519.00,519.00,521.00,521.00,521.00,522.00,522.00,523.00,523.00,524.00,524.00,524.00]
val=[524.00,524.00,524.00,524.00,524.00,523.00,522.00,521.00,521.00,521.00,521.00,519.00,519.00,519.00,519.00,518.00,517.00,517.00,516.00,516.00,515.00,515.00,514.00,513.00,513.00,511.00,511.00,511.00,510.00,509.00,508.00,507.00,506.00,505.00,505.00,504.00,502.00,501.00,500.00,498.00,497.00,496.00,494.00,493.00,492.00,490.00,487.00,486.00,484.00,483.00,480.00,479.00,477.00,474.00,472.00,470.00,467.00,463.00,461.00,459.00,455.00,451.00,448.00,444.00,440.00,435.00,432.00,427.00,422.00,417.00,412.00,406.00,399.00,394.00,388.00,382.00,376.00,370.00,364.00,359.00,352.00,348.00,341.00,334.00,327.00,319.00,312.00,304.00,295.00,287.00,284.00,280.00,280.00,278.00,275.00,276.00,275.00,275.00,274.00,275.00]

▲ 磁铁距离HALL距离与HALL输出之间的关系

val=[878.00,877.00,876.00,876.00,873.00,870.00,867.00,856.00,833.00,812.00,793.00,774.00,759.00,743.00,731.00,718.00,707.00,696.00,688.00,679.00,671.00,664.00,657.00,651.00,646.00,639.00,635.00,631.00,626.00,622.00,619.00,615.00,611.00,609.00,607.00,604.00,600.00,598.00,596.00,593.00,591.00,590.00,588.00,586.00,585.00,583.00,582.00,580.00,579.00,577.00,575.00,575.00,574.00,572.00,572.00,571.00,570.00,569.00,568.00,568.00,566.00,566.00,565.00,564.00,563.00,562.00,563.00,562.00,561.00,560.00,560.00,560.00,559.00,558.00,558.00,558.00,558.00,557.00,557.00,556.00,556.00,556.00,556.00,554.00,553.00,553.00,553.00,553.00,552.00,552.00,551.00,551.00,551.00,551.00,551.00,550.00,550.00,550.00,551.00,550.00]
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST4.PY                     -- by Dr. ZhuoQing 2020-07-26
#
# Note:
#============================================================from headm import *
import lscm8
from tsmodule.tsstm32       import *
gifid = 9valdim = []distdim = linspace(0, 20, 100)tspgiffirst(gifid)
for i in range(100):lscm8.lscm8mb(200)stm32cmd('adc')time.sleep(.1)val = stm32memo(1)tspgifappend(gifid)valdim.append(val[0])printf(val[0])tspsavenew('Measure', val=valdim)
plt.plot(distdim, valdim)
plt.xlabel("Distance(mm)")
plt.ylabel("Value")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
#        END OF FILE : TEST4.PY
#============================================================

(3) 在不同距离下水平移动对应的HALL输出

▲ 距离6毫米不同偏移量读出的数值

▲ 距离10毫米不同偏移量读出的数值

▲ 距离15毫米不同偏移量读出的数值

※ 结论


通过测量HALL距离磁铁在垂直和水平方向的距离与HALL输出之间的关系,可以确定设置磁铁与HALL传感器之间的几何距离。

  • HALL与磁铁之间距离需要小于10mm;
  • 三个HALL在静态时出现不同的零点读数;需要能够在出厂时对其定标。

相关工作:

  • 磁铁周围的磁场

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LSCM8.PY          -- by Dr. ZhuoQing 2020-01-14
#
# Note:
#============================================================from head import *
import serial#------------------------------------------------------------
cmdportdef = 'COM2'
cmdport = serial.Serial(cmdportdef, baudrate=115200, timeout=0.1)
cmdport.setDTR(False)
#cmdport.setRTS(False)printf("Open %s for LSCM8."%cmdportdef)#------------------------------------------------------------
COMMAND_FRAME_HEAD        = 0x56
COMMAND_FRAME_TAIL        = 0x65COMMAND_STATUS_WAIT        = 0x0
COMMAND_STATUS_COMMAND            = 0x1
COMMAND_STATUS_LENGTH            = 0x2
COMMAND_STATUS_DATA        = 0x3
COMMAND_STATUS_CHECK            = 0x4
COMMAND_STATUS_TAIL        = 0x5#------------------------------------------------------------
COMMAND_HELLO_ECHO        = 0x20
COMMAND_BEEP_ON            = 0x21
COMMAND_BEEP_OFF        = 0x22
COMMAND_DIR_ON            = 0x23
COMMAND_DIR_OFF            = 0x24
COMMAND_REL_ON            = 0x25
COMMAND_REL_OFF            = 0x26
COMMAND_PUL_SET            = 0x27
COMMAND_PUL_STOP        = 0x28
COMMAND_GOTO_HEAD        = 0x29
COMMAND_GOTO_TAIL        = 0x2A
COMMAND_GET_STATE        = 0x2B
COMMAND_GET_PULSEOUT            = 0x2C
COMMAND_CLEAR_PULSEOUT            = 0x2D#------------------------------------------------------------
def lscm8cmd(cmd, cmddata):checksum = cmd + len(cmddata)for cd in cmddata:checksum = checksum + cdchecksum = (checksum & 0xff) ^ 0xffcmdstr = b'' + byte(COMMAND_FRAME_HEAD) + byte(cmd) + byte(len(cmddata)) +\cmddata + byte(checksum) + byte(COMMAND_FRAME_TAIL)#    printf(cmdstr)cmdport.write(cmdstr)def lscm8hello():lscm8cmd(COMMAND_HELLO_ECHO, b'')def lscm8beepon():lscm8cmd(COMMAND_BEEP_ON, b'')def lscm8beepoff():lscm8cmd(COMMAND_BEEP_OFF, b'')#------------------------------------------------------------
def lscm8relon(bits):cmd = bits.to_bytes(1, byteorder='big')lscm8cmd(COMMAND_REL_ON, cmd)#------------------------------------------------------------
# bits:0:relay0, 1:relay1
def lscm8reloff(bits):cmd = bits.to_bytes(1, byteorder='big')lscm8cmd(COMMAND_REL_OFF, cmd)def lscm8diron(bits):cmd = bits.to_bytes(1, byteorder='big')lscm8cmd(COMMAND_DIR_ON, cmd)def lscm8diroff(bits):cmd = bits.to_bytes(1, byteorder='big')lscm8cmd(COMMAND_DIR_OFF, cmd)#------------------------------------------------------------
def lscm8setpulse(bits, pulse):cmd = bits.to_bytes(1, byteorder='big') +\pulse.to_bytes(4, byteorder='big')lscm8cmd(COMMAND_PUL_SET, cmd)def lscm8stoppulse():lscm8cmd(COMMAND_PUL_STOP, b'')def lscm8gotohead():lscm8cmd(COMMAND_GOTO_HEAD, b'')def lscm8gototail():lscm8cmd(COMMAND_GOTO_TAIL, b'')def lscm8clearpulseout():lscm8cmd(COMMAND_CLEAR_PULSEOUT, b'')def lscm8mf(steps):lscm8diron(3)lscm8reloff(3)lscm8setpulse(3, steps)def lscm8mb(steps):lscm8diroff(3)lscm8reloff(3)lscm8setpulse(3, steps)#------------------------------------------------------------
if __name__ == "__main__":time.sleep(.5)#    lscm8diron(3)
#    lscm8reloff(3)
#    lscm8gotohead()#   lscm8gototail()
#    lscm8setpulse(3, 1000)
#    lscm8diron(3)lscm8mb(100000)#    lscm8mf(1900000)tspbeep(1500, 100)printf('End of the command')#------------------------------------------------------------
#        END OF FILE : LSCM8.PY
#============================================================

  1. AD硬件设计工程文件:AD\XQWF\2020\机械臂\MagMarkSTC8K.SchDoc ↩︎

  2. 单片机C51开发工程文件:C51\STC\Project\XQWF\2020\HALLMark\HALLMarkSTC8G1K08.uvproj ↩︎

设计磁标读写模块-STC8G1K08-HALL相关推荐

  1. 使用小型变压器的线圈设计实验磁标初步实验

    ➤ 00背景介绍 为了给 全国大学生智能车竞赛 预研磁标导航赛题,根据六自由度电磁磁标定位方案,设计在平面内用于导航的磁标系统.这其中需要对于基本的基于线圈的感应和检测方案进行实验. 为了方便实验,从 ...

  2. 【FPGA】双端口RAM的设计(异步读写)

    上篇写了双端口RAM设计(同步读写):https://blog.csdn.net/Reborn_Lee/article/details/90647784 关于异步读写和同步读写,在单端口RAM设计中也 ...

  3. 蚊子132 主要负责 FreeEIM 的文件读写模块

    原文:蚊子132 主要负责 FreeEIM 的文件读写模块 作为 FreeEIM 开发者之一,蚊子132 主要负责 FreeEIM 的文件读写模块,在VC编程中,操作文件的方法主要有两种:利用API函 ...

  4. 嵌入式RFIDIC卡读写模块|读卡刷卡模块HX880D系列的应用与操作说明

    HX880 系列模块是基于ISO/IEC14443 –1,-2,-3和ISO15693国际标准协议开发的非接触式智能卡读写模块.它采用高集成度读卡专用芯片.先进的看门狗和电压监控电路方案设计而成:集成 ...

  5. PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

    目录 PCB模块化设计24--DCDC电源模块PCB布局布线设计规范 1.DCDC电源概述 2.BUCK DC-DC工作时的电流通路 3.DCDC设计 1.芯片手册的下载 2.原理图分析 3.布局 1 ...

  6. 信标组的磁标安装长度

    作者:卓晴博士,清华大学自动化系 更新时间:2020-07-29 Wednesday ■ 信标组的磁标安装长度 为了降低信标组车模对于信标的冲撞,允许触发信标的磁标伸出车体一定距离.根据同学们实际制作 ...

  7. 板线分离嵌入式RFID读卡模块NFC读写模块HX880系列的应用案例

    HX880系列高频IC卡读写模块是华翔天诚科技一款支持ISO14443A/B,ISO15693双协议.支持S50.S70.Ultralight.FM11RF08.FM1208.MF Pro.MF Fe ...

  8. 超高频UHF RFID读写模块R200开发测试

    超高频UHF RFID读写模块R200开发测试 概述 一.使用模块 二.UHF-R200 模块简述 2.1 模块参数 2.2 模块引脚 三.R200-C50 开发板 四.RFID电子标签 4.1 PV ...

  9. STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计

    1.系列总述 从现在开始将会进入四轴无人机的制作,我是第一次制作四旋翼,从前没有接触过这个方面,手边的参考资料只有一本四轴的设计书和正点原子F405飞控的源码,所以代码逻辑设计方面肯定有所欠缺,大家可 ...

最新文章

  1. 你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发...
  2. NLP之WE之CBOWSkip-Gram:CBOWSkip-Gram算法概念相关论文、原理配图、关键步骤之详细攻略
  3. django jquery ajax 知识点
  4. Jmeter 断言使用
  5. 安装archlinux_archlinux/manjaro 上安装percona-server
  6. 机器学习基础:分类vs回归
  7. 你知道GNU C 对C语言的扩展吗?
  8. sftp api java_使用JSch实现SFTP文件传输
  9. 接手一个APP,如何从0到1去做测试体系的搭建?
  10. Git删除本地/本地远程/远程服务器分支
  11. 【面经】来啦!百度凤巢算法面经
  12. 计算机无线网络无法连接网络,笔记本连无线网显示无法连接此网络 怎么处理...
  13. rapidxml的简单使用
  14. 极乐净土html5代码,天谕手游极乐净土乐谱代码分享
  15. 支持向量机SVM思维导图
  16. 佳能2780打印机老出5100错误
  17. mysql 自己的ip怎么查看_如何查看连接mysql的ip地址
  18. Android 饼形图
  19. Bootstrap导航和导航条
  20. 雷克萨斯品牌舆情监测-危机后,如何重新赢得消费者的认可?

热门文章

  1. Linux与云计算——第二阶段Linux服务器架设 第八章:FTP服务器架设—安装配置FTP服务和客户端配置...
  2. CSS的一些基础知识
  3. Linux磁盘分区管理(转载)
  4. C#如何把List of Object转换成List of T具体类型
  5. getopt函数—分析命令行参数
  6. 修改mysql数据库编码
  7. hibernate的中文问题的解决方案
  8. PAT A1098 堆排序
  9. 详解tomcat的连接数与线程池
  10. mysql查询日期内的所有日期代码