yaboPP电子
项目

如何使用光电传感器,微控制器和光盘构建转速表/速度计

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

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

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

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

这是两个部分项目之一。第二部分将使用键盘显示LCD屏幕上的数据以循环通过测量数据。你可以跳过进取学习如何增加键盘和液晶显示器

C8051F930/单片机开发工具包

C8051F930开发工具包的目的是作为开发平台的微控制器在C8051F92X-C8051F93x.MCU系列。该套件附带C8051F930微控制器安装 - 见下图1。

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

C8051F930微控制器包括以下功能:

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

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

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

光电传感器

用于该项目的光电传感器在技术上被其制造商称为开槽的光学开关。该光学开关的制造商部件号是opb816z.。我选择了这种特定的装置,因为它相当大的间隙/插槽开口-0.20“(5.1mm)宽,0.61”(15.5mm)深 - 这允许旋转盘在槽中“浮动”。我知道我需要一些浮动空间,因为我将在初步测试期间使用我的摇摆手来握住电机和旋转光盘。

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

决定使用此设备的另一个原因是,可以在下图中可以看出,它使用26AWG线(24英寸长度)预先接线)。此预先接线选项使该设备的接线更容易。

图3。预先有线光开关(插槽型)。图片礼貌Digi-key.

直流电机

对于这个项目,我重新推出了一个我在a期间找到/删除的直流电机打印机拆卸。这电机的特点是作为一个碳刷电机,额定运行在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较近,您会注意到电机轴上安装的齿轮。因为我无法删除档位,很短暂地脱离它,我试过真正的艰难,因为我想在将来重新用地,我的目标是将光盘安装在一起一种不会永久改变盘或电机的方式。事实证明,附着在光盘上的保护膜实际上非常安全,并且根本不会移动。因此,我尝试了,成功且自豪地,将电机的齿轮环氧环氧树脂,以防护薄膜/附图标记(见图6)。

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

最后,在环氧树脂固化之后,我修剪了一些保护膜并在盘上放置了薄的胶带(〜2mm宽度)(见图6)。该胶带用作IR发射二极管和光电晶体管之间的屏障,因此它用作光学开关的触发机构,用于测量盘的每秒旋转时的每秒转数。

图6。电机环氧到光盘。

创建连接/示意图

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

选择R1的价值

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

选择R2的价值

上面的计算假设二极管正向电流为20mA,所以我们应该根据I调整电阻的大小F= 20 ma。我们唯一的正向电压是1。8伏F= 20 mA:

$$ r_2 = \ frac {(3.3v-1.8v)} {20ma} = 75 \ omega $$

图7。连接图。点击放大

配置微控制器开发套件

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

跳线:

  • J11: VBAT到WALL_PWR
  • 纺纱,:
    • VDD到VIO
    • P0.5, TXD
  • J17:vbat_pin到vbat

开关:

  • SW4:设置为“2个细胞”
  • 电源开关(SW5)到“关闭”位置 - 我们稍后会更改。

电缆:

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

固件计算

如前所述,当光学开关的槽没有屏障时,光电晶体管将传导,并且具有适当尺寸的电阻器,光电晶体管将饱和。这意味着收集电压为约0.2V,即逻辑低。当防止光电晶体管“看到”IR发射二极管时,它处于截止值,并且收集器节点被R1拉高。固件将根据给定时间数量计数,在光电晶体管和红外发射二极管之间存在屏障。使用此数据,我们将首先以每秒转数为单位计算角速度(ɷ),然后使用角速度,我们将在其半径上计算光盘的线性速度(每小时两秒钟,每小时两小时)以下等式。

$$ c = \ a \ cirction = 2 * \ pi * r \(英寸)$$

$$distance = 2* pi*r (inch /转)$$

$$线性\ speed = \ oomega \(转速/ s)\ * \ c \(英寸/革命)$$

$$linear\ speed = \omega*c\(英寸/秒)$$

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

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

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

转换为每小时英里(MPH):

$$线性\ speed = \ oomega \ frac {1} {(秒)} * c \(teet)* \ frac {1 \(英里)} {5280 \(脚)} * \ frac {3600 \(秒){1 \(小时)} $$

在哪里,

$$ \ Omega = Angular \ Velocity \(Rev / Sec)$$

$$ =半径\ \ disc = 2.5 \(英寸)$$

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

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

线性速度将显示在每秒(ft / s)和每小时英里(mph)的脚部。

// ----------------------------------------------------------------------------------- // StartTimer Routine // ---------------------------------------------------------------------------- if(StartTimer == 1) { TimerPeriod = 0; // Reset TimerT2 = HUNDRED_MICROSECOND_TIMER; // Set TimerT2 to equal HUNDRED_MICROSECOND_TIMER value. TimerPeriod = (TimerT2-TimerT1); // Take the difference between the beginning and the end of the timing cycle. TimerT2 = 0; // Reset HUNDRED_MICROSECOND_TIMER = 0; // Reset StartTimer = 0; // Clear this flag. 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. } }

固件

使用简单的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;//表示TX0 ready while (1) {if((OpticalSensor == 1) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 0)) //如果光学传感器高(阻塞),没有上升边和下降边发生。{OpticalSensorRisingEdge = 1;//由于光传感器信号高(传感器被阻塞),上升边缘应该已经发生,所以设置它为1。} else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 0) && (OpticalSensorRisingEdge == 0)) //如果光学传感器低(clear),没有上升边和下降边。{OpticalSensorFallingEdge = 1;//由于光传感器信号低(传感器是清晰的),下降边缘应该已经发生,所以设置它为1。} /* else if((OpticalSensor == 0) && (OpticalSensorFallingEdge == 1) && (OpticalSensorRisingEdge == 0)) //如果OpticalSensor是低的(clear),且//上升沿低,下降沿高,则信号是低的。{/ /什么都不做。 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. } */

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

光学_switch-tachometer_speedometer.zip.zip.

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

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

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

你现在准备测试系统!打开直流电机时,我始终以低电压(低速)开始,然后缓慢增加电压/速度。这有助于防止光盘从电机上拆卸。

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

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

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

摘要和下一步

如本文所示,使用光学开关确定旋转盘的角速度和线性速度,实际上非常容易。最困难的部分是编写固件,但仍然是,这并不是那么难。

下一步,在这个两部分项目中,是在液晶显示屏上显示测量数据。键盘将用于循环通过各种测量。

自己试试这个项目吧!得到bom。