学习如何使用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。