本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

DIY电子分频器

发布时间:2022-07-17
分享到:

DIY电子分频器

发布时间:2022-07-17
分享到:

在这个项目中我会做一个小工具。一对电子分频器,展示霍尔效应传感器的基本原理。

我将使用我的 3D 打印机打印所需的零件。你也可以使用其他材料,但精度是组装中的关键因素。

  • 49E 传感器*2——49E 是一款小型多功能线性霍尔效应器件。
  • Arduino NANO 进行计算。AtMega328p 只有一个 10 位 DAC,计算使用 Sine,所以会有限制。
  • 使用 1602 显示器来显示结果——1602 显示器是每行 2 行 16 个字符的显示器。
  • UV树脂胶水
  • 需要3D 打印机来打印分隔器的两个臂。

点击下方可以下载分隔臂的 STL 文件。

第 1 步:49E 线性霍尔效应传感器

霍尔效应传感器的制造商有很多,我附上了我从霍尼韦尔找到的数据表。

它们并没有太大的不同。我用了能找到的最便宜的。
我已经制作了适合 49E 类型的塑料部件。
49E 只有 3 个连接。

  • 引脚 1 = 电源(+2.7 至 +6.5 伏)。
  • 引脚 2 = 接地 (GND)。
  • 引脚 3 = 输出模拟(通常在 1 到输入之间 - 1 伏)

输出是线性的,mV/Gauss。

数据表显示了它检测磁通量强度的方向。[NS]

  • 如果我们将磁铁移近和远离传感器,则输出将与所示方向上的磁铁强度有关。

第 2 步:磁铁

我正在使用两个钕磁铁来改变传感器周围的磁场强度。

  • 磁铁的尺寸为:宽度 = 5 毫米,深度 = 5 毫米,高度 = 2 毫米。
  • 北/南方向是从下到上。(在 2 毫米方向)

让我们看看一块磁铁会产生的磁场。

  • 磁场集中在磁铁的中心。
  • 在磁铁的中心,磁场从南向北移动,几乎平行。
  • 当磁场离开磁体的末端时,磁场会自行返回,返回相反的磁极。
  • 如果我们将传感器放置在一个磁极的末端并将其移动到一侧,则强度会急剧下降,因为磁场会自行返回。

这些传感器非常敏感,任何未对准都会导致传感器读数不佳。

  • 我们需要减少可能产生的错误。
  • 如果我们能把传感器放在磁铁里面就再理想不过了。

我减少风险的方法是使用两个磁铁。

  • 如果我们使用两个稍微分开的磁铁,它们之间的区域应该会产生一个接近磁铁内部的磁场。
  • 如果我们将传感器放置在磁铁之间,则该区域的磁场应该是均匀的,并且希望当磁铁围绕传感器转动时,磁场将与磁铁处于相同的角度。

第 3 步:计算角度

我们将围绕传感器旋转磁铁。

  • 围绕传感器旋转磁铁与将它们从传感器上移开不同,围绕传感器旋转不会产生线性输出。
  • 输出将给出其旋转角度的正弦值。

我已经做了一个草图来尝试解释输出。

  • 紫色圆圈是磁铁围绕传感器所在中心的路径。
  • 蓝线代表磁铁围绕传感器旋转时的角度/位置。
  • 黄线代表传感器从南到北看到的线性强度。
  • 绿线显示正弦计算。
  • 红色是准确区域。

因为传感器的输出是模拟值,所以您会认为精度仅限于我们可以将模拟读数转换为的小数位数。

  • Arduino NANO DAC 是 10 位的。
  • Arduino NANO double 与 float 相同,float 数据类型只有 6-7 个十进制数字的精度。

因为我们正在旋转而不是远离传感器,所以输出是输出的正弦计算。

  • 我们将拥有仅使用 10 位数模转换器 (DAC) 无法很好计算的区域
  • 末端带有蓝色圆圈的蓝色线条表示可以准确计算的角度。
  • 末端带有蓝色十字的蓝线表示无法准确计算的角度。

可以看到,在极端旋转时,磁力的偏差有更多的度数划分。

我已经过分强调了准确性的领域,以试图更好地展示它。

  • 我正在使用最简单的哈尔效应传感器。
  • 为了获得准确性,可以使用另一个传感器。一个内置另一个传感器,与第一个传感器成 90 度角,因此每个传感器仅使用精度良好的区域。

数学是基本的学科,当我们谈到代码时,我会证明这一点。

第4步:让我们做一对分隔线

我已经提到传感器非常敏感,组件的放置需要准确。幸运的是我有一台 3D 打印机,它可以准确地打印东西。
一些小的错位是可以接受的,但一旦到位,除非它应该这样做,否则它不应该移动。

可以在代码中补偿一些错位。

第 5 步:安装传感器

传感器需要粘在隔板的传感器臂上。印刷部件有一个异形孔,用于定位传感器的安装方式。、

第 6 步:磁铁方向

磁体方向至关重要。为了帮助找到磁铁方向,我在手机上使用了一个应用程序。

手机需要内置磁力计,通常如果它有 GPS,它就会有一个磁力计。
有许多使用磁力计的应用程序,我发现最好的应用程序是 3D 应用程序。
该图显示了一个典型的 3d 应用程序。箭头指向北方。
我使用的是:3D 罗盘和磁力计。
手机中的磁力计并不总是位于手机的中心。

最好用磁铁做一些实验来找到它的位置
一旦找到磁力计在手机中的位置,就可以更轻松地找到磁铁的磁极。

我通常将手机支撑在工作台上方,并将磁铁放在工作台上磁力计位置下方。

第 7 步:将磁铁和第二臂安装在一起

安装磁铁和第二个手臂有点麻烦。

  • 在将两个臂装配在一起之前,请确保磁铁可以在第一个臂的凹槽内移动。
  • 需要紧密配合在凹槽中。

您必须将磁铁固定到位,确保磁极方向正确,同时将第二个臂的外部放在第一个臂上。

  • 这是一个紧密配合,第二个手臂必须在第一个手臂上展开。

一旦两个手臂装配在一起,唯一的动作应该是:将手臂移到一起并远离彼此。

  • 不应有横向移动或扭曲,否则会产生错误。

第 8 步:将电缆添加到分频器

下一步是在传感器上添加电缆,以便将其连接到 Arduino NANO。

我的 Arduino NANO 在分线板上,所以我在电缆末端安装了一个杜邦母连接器。
检查步骤 1 以获取正确的连接。

第 9 步:液晶显示器 (LCD)

为了从传感器获得反馈,我使用了每行 2 行 16 字符的 LCD。

  • 我使用的是 PCF8575 适配器,所以我只需要连接到 I2C 引脚。
  • 我有一根装有杜邦母连接器的 4 线电缆,用于将它连接到我的 Arduino NANO。

第 10 步:连接到 Arduino NANO

点击下方下载接线示意图。

Tims 电气分离器.fzz下载
Tims Electrical Deviders_bb.pdf下载
Tims Electrical Deviders_schem.pdf

第 11 步:代码

我假设如果你有一个 Arduino NANO,你已经对它进行了实验,并且已经到 Arduino.cc 网站了解了有关它的信息。

如果这是您第一次使用带有 Arduino 架构的设备,请先访问此处:  Arduino IDE 2 教程

在这里,您可以下载 Arduino IDE,并且有来自创建 Arduino 的人的教程。
本教程展示了如何将草图上传到设备。
下面是代码。

/*
    Tims_Electronic_Deviders.ino
    By Tim Jackson.1960

    Creadits:
        Arduino.
        LiquidCrystal_I2C based on work by DFRobot.

    This is code for: Tim's Electronic Deviders.
    I am using 3D Printed Deviders with a 49E Linear Hall Effect Sensor and two Magnets.
    I am using an Arduino NANO to calculate the postion of the deviders from the values recived from the 49E Linear Hall Effect Sensor.
    The sensor is linear: 3 mV/GS, but to get the angle a Sine of the value is calculated.

    S=O/H C=A/H T=O/A
    Degrees to Radians = degrees * (PI / 180)
    Radians to Degrees = radians * 180.0 / pi

*/
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define Hall_49R_Pin                    A1        //    define Hall Effect Pin
#define CAL_0                            377        //    Value of hall efect sensor at 0 angle
#define CAL_180                            690        //    Value of hall efect sensor at 180 angle
#define CAL_RANGE (CAL_180 - CAL_0)                //    Highest CAL - Lowest CAL
#define CAL_RAD ((double)CAL_RANGE / 2)            //    Used in the sine H value to get angle.
#define LEG_LENGTH 99                            //    Length of Devider Legs.
#define MAG_BIOS                        -3.11    //    Set to zero, then change to a value that will correct the mesurment about 60 Degrees.
double Angle = 0;                                //    Variable to hold Angle value.
double Length = 0;                                //    Variable to hold Length value.
int SensorValue = CAL_0 + 1;                    //    Variable to hold Sensor value.

LiquidCrystal_I2C lcd(0x27, 16, 2);        //20 to    27    //    Set the LCD address to 0x27 for a 16 chars and 2 line display


void setup()
{
    Serial.begin(115200);            //    Start Serial.
    pinMode(Hall_49R_Pin, INPUT);    //    Define as Input.

    lcd.init();                        //    Start LCD.
    lcd.backlight();                //    Turn on back light.
    lcd.setCursor(0, 0);            //    Set Cursor at the begining of line 0 (Top Line).
    lcd.print(" Angle:");            //    Display Label for Angle on top line.
    lcd.setCursor(0, 1);            //    Set Cursor at the begining of line 1 (Bottom Line).
    lcd.print("Length:");            //    Display Label for Length on bottom line.

}
void loop() {

    SensorValue = analogRead(Hall_49R_Pin);    //    Read the value from sensor.

    Serial.println(SensorValue);            //    Send value to serial.
    CalcAngle();                            //    Do sub routeen for angle.
    CalcLength();                            //    Do sub routeen for length.
    Serial.println();                        //    Send a new line to serial to seperate values.

    delay(200);                                //    Wait a little for things to happen.
}
/*
    Calculate the Angle using Value from Sensor.

        S=O/H
        Radians to Degrees = radians * 180.0 / pi

        O = SensorValue - CAL_0 - CAL_RAD
        H = CAL_RAD
        Angle in radians = asin(O / H)
        Angle in degrees = Angle in radians * 180.0 / pi;

*/
void CalcAngle() {

    double O = (double)SensorValue - CAL_0 - CAL_RAD;
    double H = (double)O / CAL_RAD;
    Angle = 90.0 + (asin(H) * 180.0 / PI);

    Serial.print("Angle ");
    Serial.println(Angle + MAG_BIOS, 4);

    lcd.setCursor(7, 0);
    lcd.print("  ");
    lcd.setCursor(Xpos(Angle + MAG_BIOS), 0);
    lcd.print(Angle + MAG_BIOS, 3);
    lcd.print("  ");

}
/*
    Calculate the Length using degrees calculated from Sensor.

        C=A/H
        A=C*H
        Degrees to Radians = degrees * (PI / 180)

        C = (180 - Angle in degrees) / 2
        H = LEG_LENGTH
        A = C * H
        Length = A * 2

*/
void CalcLength() {

    double _angle = (180.0 - Angle) / 2;
    double _rad = _angle * (PI / 180);
    double C = cos(_rad);
    double H = LEG_LENGTH;
    Length = C * H * 2;

    Serial.print("Length ");
    Serial.println(Length + MAG_BIOS, 4);

    lcd.setCursor(7, 1);
    lcd.print("  ");
    lcd.setCursor(Xpos(Length + MAG_BIOS), 1);
    lcd.print(Length + MAG_BIOS, 3);
    lcd.print("  ");

}
/*
    This a function to calculate the position of value displayed on LCD.

        Check to see if value is hundreds, tens or single.
        To keep numbers alighned.
*/
byte Xpos(byte number) {
    byte val = 8;
    if (number < 100) { val = 9; }
    if (number < 10) { val = 10; }
    return val;
}

我已附上代码“ Tims_Electronic_Deviders.ino ”,您可以点击这里下载它。
当你下载 Sketch 时,你需要把它放在一个没有“ .ino ”的同名文件夹中。

第 12 步:校准

在校准之前,MAG_BIOS 值的#defined 值需要设置为 0(零)。

#define MAG_BIOS                        -3.11    //    Set to zero, then change to a value that will correct the measurement about 60 Degrees.

要校准分频器,您需要运行串行监视器。

  • 关闭分隔线并记下第一个数字,即角度之前/上方的数字。
  • 打开分隔线并记下第一个数字,即角度之前/上方的数字。(我发现最好将分隔板平放在工作台上以获得真正的 180 度角)
  • 分频器打开时记录的数字应大于分频器关闭时记录的数字。
  • 如果数字是错误的,那么磁铁的极性是错误的。

根据标注的值更改 CAL_0 和 CAL_180 的 #defined 值。

#define CAL_0                            377        //    Value of hall efect sensor at 0 angle
#define CAL_180                            690        //    Value of hall efect sen

使用量角器将分频器设置为 60 度,记下显示的角度。

使用规则测量分隔线末端之间的距离,同时它们处于 60 度并记下。

角度(度)和距离(毫米)的误差相似。
更改 MAG_BIOS 的 #defined 值以补偿错误。

#define MAG_BIOS                        0    //    Set to zero, then change to a value that will correct the measurement about 60 Degrees.

校准后它将接近如下角度,除了极端情况。

  • 0到15度。
  • 165到180度。

这是因为这些区域是正弦曲线的地方,变化不大。

第 13 步:如何获得更好的准确性

这是为了展示如何制作简单的测量工具并展示霍尔效应传感器的基础知识。49E 只是一个线性模拟传感器。

还有其他可以使用的传感器,例如:

  • AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。具有 I²C 接口。
  •  MLX90393 传感器提供与沿 X、Y 和 Z 轴感应的磁通密度成比例的 16 位输出。可选 SPI 和 I2 C 总线协议。

使用更昂贵的传感器会带来更高的准确性。

以上就是这个项目的全部内容了,有问题欢迎评论交流

* 以上内容翻译自网络,原作者:Palingenesis,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论