雷竞技注册
项目

如何建立一个转速计/速度计与光电传感器,微控制器,和光盘

2017年9月6日通过尼克。戴维斯

学习如何使用C8051单片机、光电传感器和旋转盘制作转速表和速度表。

学习如何使用C8051单片机、光电传感器和旋转盘制作转速表和速度表。

本项目使用C8051单片机开发工具包、光电传感器、变速直流电机、直径5英寸的透明光盘和Simplicity Studio IDE,快速、轻松地构建转速表和速度表。测量数据通过UART发送到终端窗口。

这是一个分两部分的项目的第一部分。第二部分将在LCD屏幕上显示数据,使用键盘循环通过测量数据。你可以跳过去学习如何添加键盘和LCD

C8051F930单片机开发工具包

C8051F930开发套件的目的是作为微控制器的开发平台C8051F92x-C8051F93x单片机的家庭。此工具包附带安装了C8051F930微控制器-见下图1。

图1所示。C8051F930开发工具包。C8051F930单片机(红框)。

C8051F930单片机具有以下特点:

  • 单电源:0.9至3.6V
  • 高速8051µC芯
  • 10位ADC
  • 4352字节的内部数据RAM
  • 64 kb闪存
  • 24端口I / O
  • SMBus, I2C, 2× SPI, UART
  • 片上调试

图2。C8051F930方框图。来自数据表via的图像硅实验室

Silicon Labs IDE被称为Simplicity Studio,可以下载在这里

光电传感器

本项目使用的光电传感器,其制造商在技术上称为a割缝光开关.此光开关的制造商部件号为OPB816Z.我选择这个特殊的装置是因为它的间隙/槽口相当大——0.20”(5.1毫米)宽,0.61”(15.5毫米)深——允许旋转圆盘“漂浮”在槽口。我知道我需要一些空间来漂浮,因为在最初的测试中,我会用我摇晃的手握住电机和旋转的圆盘。

这个光开关使用一个红外发光二极管和一个NPN光电晶体管。当一个不透明的物体通过这个槽时,光电晶体管就会发生开关:当二极管和光电晶体管之间没有势垒时,光电晶体管是导电的,输出是低的(~0.2V)。相比之下,当阻挡二极管的IR照明时,光电晶体管处于截止状态,集电极节点被拉高(3.3V)。

决定使用这个设备的另一个原因是,如下图所示,它是用26AWG线(24英寸长)预布线的。这个预先连接的选项使这个设备连接到我的面包板更加容易。

图3。预有线光开关(槽型)。图片由Digi-Key

直流电机

对于这个项目,我重新使用了一个直流电机,我发现/删除期间打印机拆卸.的电机的特点是作为碳刷电机,额定工作电压高达42VDC。在我的测试以及下面的演示视频中,我使用了从0V到大约12V的可变直流电压为电机供电。

图4。直流电机

旋转圆盘

对于光盘,我想要一些相当硬但相当薄的东西,直径不大于6英寸(为了使用方便),和透明的。我决定用直径5英寸,厚度1/16英寸的,透明丙烯酸有机玻璃盘下图显示的是光盘——蓝色的覆盖物仅仅是一层保护膜。

图5。直径为5英寸的透明圆盘。

零件清单

项目# 描述/来源 成本(每个) 其他信息
1 C8051F930开发工具包 99.00美元 用户指南
快速启动指南
C8051F930数据表
注:原理图在用户手册的第23-25页
指南。
2 电路试验板 8.98美元 或同等
3. 跳线设备 5.28美元 或同等
4 透明丙烯酸树脂玻璃碟 7.99美元
5 光学传感器 3.62美元
6 直流电机 6.55美元 该项目中使用的电机是由
打印机拆卸。然而,这个发动机看起来是
一个等价的马达。
7 电阻:3.3 k-ohms 0.10美元 或同等
8 电阻:75 -欧姆 0.10美元 或同等

将光盘安装到电机上

我遇到的一个挑战(当然,这是一个小挑战)是确定如何安全地将电机连接到光盘上。请记住,这个光盘的旋转速度会相对较快:我预计速度会达到或超过30转/秒(每秒转数)。

如果你仔细看看上面的图4,你会注意到安装在电机轴上的齿轮。因为我不能移除齿轮,短的切断它off-trust我,我尝试了真正的努力,因为我想重新用途的光盘和电机在未来,我的目标是安装光盘的方式,不会永久改变光盘或电机。事实证明,附着在圆盘上的保护膜非常牢固,根本不会移动。因此,我尝试,成功和自豪,环氧电机的齿轮保护膜/附在纸标签(见图6)。

在这个项目的结论,我预期能够去除环氧树脂从电机,使用许多溶剂之一在我的车库,和光盘,通过简单地拆除保护膜从光盘本身。这将允许我在另一个项目中重用这两个部分。

最后,在环氧树脂固化后,我修剪掉一些保护膜,并在圆盘上放置一薄条胶带(宽度约2mm)(见图6)。这条胶带充当红外发光二极管和光电晶体管之间的屏障。因此,它充当了光开关的触发机制,用来测量圆盘旋转时每秒的转数。

图6。电机环氧化到阀瓣上。

建立连接/原理图

微控制器端口1引脚2 (P1.2)被配置为数字输入,并连接到光电晶体管的集电极。

选择R1的价值

R1的尺寸必须使光电晶体管在没有光势垒时进入饱和状态。
传感器的数据表表示最小通态集电极电流为1ma,最大VCE饱和度为0.4 V。因此,电阻必须下降至少(3.3V - 0.4V),以确保饱和:2.9V / 0.001A = 2900Ω,所以电阻大于~3kΩ是足够的。

选择R2的价值

上面的计算假设二极管正向电流为20mA,所以我们应该将电阻的大小设置为IF= 20 ma。我们拥有的唯一正向电压规格是1.8V at IF马= 20:

$ $ R_2 = \压裂{(3.3 v - 1.8 v)} {20 ma} = 75ω\ $ $

图7。连接图。点击放大

配置微控制器开发工具包

在为微控制器开发套件上电之前,请确保按如下方式配置它:

跳投:

  • J11: VBAT到WALL_PWR
  • 纺纱,:
    • VDD到VIO
    • P0.5, TXD
  • VBAT_PIN到VBAT

开关:

  • SW4:设置为“2 CELL”
  • 电源开关(SW5)到“OFF”的位置-我们稍后会改变这个。

电缆:

  • 将带状电缆调试适配器连接到J9
  • 连接USB调试适配器到您的PC。
  • 连接P3和PC之间的USB串口线。
  • 将供电的交流/直流电源适配器连接到P2。

计算固件

如前所述,当光开关的槽没有阻挡物时,光电晶体管将导电,并且使用适当大小的电阻,光电晶体管将处于饱和状态。这意味着集电极电压约为0.2 V,即逻辑低。当光电晶体管被阻止“看到”红外发光二极管时,它处于截止状态,集电极节点被R1拉高。固件将计算在给定的时间内,在光电晶体管和红外发光二极管之间出现势垒的次数。利用这些数据,我们将首先计算角速度(ɷ),单位为转/秒,然后,利用角速度,我们将计算圆盘在其半径下的线速度(英尺/秒和英里/小时),使用以下公式。

如果$c= 1,则$c= 1,则$c= 1,则$c= 1,则$c= 1,则$c= 1,则$c= 1,则$c= 1,则$c= 1,则$

= 2* pi*r(英寸/转)$$

$$线性\速度= ω \(转/秒)\ *\ c\(英寸/转)$$

$$线性\速度= ω *c\(英寸/秒

转换为英尺/秒(ft/s):

$ $线性\速度ω= \ \压裂{1}{(sec)} * c \(英寸)* \压裂{1 \(英尺)}{12 \(英寸)}$ $

$ $线性\速度= \压裂{\ω* c}{12} \ $ $(英尺/秒)

换算成英里每小时(MPH):

$ $线性\速度ω= \ \压裂{1}{(sec)} * c \(英尺)* \压裂{1 \(英里)}{5280 \(英尺)}* \压裂\ (sec){3600}{1 \(小时)}$ $

在那里,

$$ * * * * * * * * * * * * * * * * *

$r = radius\ of\ disc = 2.5\(英寸

$$c =周长= 2* π *r = 2* π *2.5 *(英寸)= 15.708\(英寸

角速度将以转速/秒和转速/分钟(RPM)显示。

线性速度将显示在两英尺每秒(ft/s)和英里每小时(MPH)。

//----------------------------------------------------------------------------- // 开始时间程序  // ---------------------------------------------------------------------------- 如果(开始时间= = 1){TimerPeriod = 0;//重置TimerT2 = hund_microsecond_timer;//将TimerT2设置为与hund_microsecond_timer值相等。TimerPeriod = (TimerT2-TimerT1);//取计时周期开始和结束之间的差值。TimerT2 = 0;//重置microsecond_timer = 0;//重置StartTimer = 0;//清除此标志。AverageAccumulator + = TimerPeriod; // Add the current timer period measurement to the accumulator. AverageMeasurements--; // Decrement the measurement counter. if(AverageMeasurements == 0) { TimerPeriodAverage = (AverageAccumulator / 100.0); // Calculate the average value: divide the summed AverageAccumulator by the number of measurements. FrequencyAverage = ((1.0/TimerPeriodAverage) * 1000.0); // Calculate the frequency. FeetPerSecond = (3.14159 * DiscDiameter / 12.0 * FrequencyAverage); // Calculation linear speed (ft/s): Pi*2*r/12*period. The "12" converts inches to feet. DiscDiameter = 5 inches. MPH = (0.681818 * FeetPerSecond); // Calculation linear speed (MPH): convert ft/s to MPH. AverageAccumulator = 0; AverageMeasurements = 10; // Reset DisplayResults = 1; // Set flag to display results. } }

固件

使用Simplicity Studio ide(特别是使用GUI和.hwconf文件)使C8051微控制器的配置对于这个项目来说非常容易。下面的列表显示了我实现的配置:

  • 系统时钟源:采用板载高频振荡器(24.5MHz)
  • P1.2端口(连接光交换机采集器)
    • 是否配置为数字输入
  • Timer0:用于测定旋转圆盘的角速度(每秒转数)。
    • Timer0:定时器溢出时间,100µs
    • 这意味着椎间盘旋转的持续时间是以100µs的分辨率来测量的。
  • Timer1:用于UART通信。
    • Timer1:定时器溢出频率:462.264 kHz
    • 建立UART的波特率为230400(这是标准化值;实际波特率将是Timer1溢出频率除以2)

用于确定何时触发光学传感器的算法(参见下面的代码片段)使用集电极电压的下降沿。当集电极电压转换到逻辑低时,计时器开始,当下一个下降沿发生时计时器终止——这构成了圆盘的一次旋转。当然,频率是一圈所需时间的倒数。

//----------------------------------------------------------------------------- // main()例程  // ---------------------------------------------------------------------------- int主要(空白){/ /输入默认模式enter_DefaultMode_from_RESET ();SCON0_TI = 1;//当(1){if((OpticalSensor == 1) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 0)) //如果光传感器高(阻塞),并且没有上升边或下降边发生。{OpticalSensorRisingEdge = 1;//由于光传感器信号是高的(传感器被阻塞)上升边应该已经发生,所以设置它为1。} else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 0)) //如果光传感器是低(清除),并且//没有上升边或下降边。{OpticalSensorFallingEdge = 1;//由于光传感器信号是低的(传感器是清晰的)下降边应该已经发生,所以设置它为1。} /* else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 1) && (OpticalSensorRisingEdge == 0)) //如果光传感器为低(清除),且上升边为低,下降边为高,则信号为低。{/ /什么都不做。 The optical signal is low. } */ else if((OpticalSensor == 1) && (OpticalSensorFallingEdge == 1) && (OpticalSensorRisingEdge == 0)) // If the Optical Sensor is high (blocked), and the // rising edge is low and the falling edge is high, // then the signal just transitioned from low to high. { OpticalSensorRisingEdge = 1; // Set the rising edge (1). OpticalSensorFallingEdge = 0; // Clear the falling edge (0). } else if((OpticalSensor == 1) && (OpticalSensorFallingEdge == 1) && (OpticalSensorRisingEdge == 1)) // If the Optical Sensor is high (blocked) and both the // rising edge and the falling edge are high. { YELLOW_LED = 1; // This condition shouldn't occur. Therefore, turn on the LED signifying that an error condition has occurred. } else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 1)) // If the Optical Sensor is low (clear), and the // falling edge is low and the rising edge is high, // then the signal just transitioned from high to low. { OpticalSensorRisingEdge = 0; // Clear the rising edge (0). OpticalSensorFallingEdge = 1; // Set the falling edge (1). StartTimer = 1; // Start the optical sensor period timer. } else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 1) && (OpticalSensorRisingEdge == 1)) // If the Optical Sensor is low (clear) and both the // rising edge and the falling edge are high. { YELLOW_LED = 1; // This condition shouldn't occur. Therefore, turn on the LED signifying that an error condition has occurred. } /* else if((OpticalSensor == 1) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 1)) // If the Optical Sensor is high (blocked), and the // rising edge is high and the falling edge is low, // then the signal is high. { // Do nothing. The optical signal is high. } */

这个项目的所有代码都可以从下面的链接下载。

Optical_Switch-Tachometer_Speedometer.zip

构建和加载代码…系统测试

在下载、构建和加载代码之后,确保您的终端窗口配置如下:

  • 波特率设置为230400
  • 数据:8位
  • 奇偶校验:没有
  • 站:1比特。

现在可以测试系统了!当打开直流电机时,我总是以低电压(低速)开始,然后慢慢增加电压/速度。这有助于防止阀瓣从电机上脱落。

为了验证角速度的准确性,我将我信赖的Saleae逻辑分析仪连接到光开关的采集终端。

如下图所示,逻辑分析仪的频率(Hz)与终端窗口显示的角速度(rev/s)几乎相同。华友世纪!

图8。用Saleae逻辑分析仪检查系统的准确性。点击放大

总结和下一步

正如本文所演示的,使用光开关来确定旋转圆盘的角速度和线速度实际上是非常容易的。最困难的部分是编写固件,但它也不是那么难。

在这个分两部分的项目中,下一步是在LCD屏幕上显示测量数据.一个键盘将被用来循环进行各种测量。

你自己试试这个项目吧!BOM。