您现在的位置:首页 > >

基于 labview的光照度检测

发布时间:

基于 labview 的光照度检测
光在生活中无处不在,因此对人类的生活以及生产活动都产生了各种各样的影响。如实验室中有的实验对 光的强度有严格的要求,在某些工业化生产中也需要严格控制光的强度,因此光强的检测在生活中有着非常广 泛的应用。我们由此设计了一套可以检测并显示光强的模型,可以实时感知光的强度,并记录数据,实现人机 交互,方便实现光的自动化控制。
一、系统方案 (一) 设计流程
通过传感器实时测量所处环境的光强度,然后将信号转换成电*信号输入单片机,单片机读取电压的变化 将信号输入电脑,电脑通过 labview 读取信号并将信号显示的记录。 (二) 模块选择 1、 光照测量模块 我们采用光敏电阻作为检测光强的传感器,基本特性及其主要参数其电阻会随着光强度的变化而变化,在光敏 电阻两端的金属电极之间加上固定电压,其中便有电流通过,受到适当波长的光线照射时,电流就会随光强的 增加而变大,从而实现光电转换。 2、 信号转换 采用 mega16 单片机片内的 AD 读取电压值,然后单片机将电压信号通过 USB 线传给电脑 3、 信号显示与记录 电脑上通过 labview 读取单片机传来的信号值,将其转换成光的强度大小并且实时显示出来,记录相应时间的 光强度的变化。 (三) 电路设计 电路设计十分简单,给光敏电阻加上 5V 电压,然后直接与单片机相连,然后利用 RS-232 转接 USB 与电脑相 连
二、LabView 程序设计 1)数据的获得:
采用 VISA 接口程序库,程序编写见图 Figure 1。因为在 LabView 中没有将二进制字符串转化为数值的 express 控件,便编写了一个将二进制字符串调整为十六进制的子 Vi。这样通过 USB 口边可以接收我们需要的 数据。
Figure 2

2)数据显示部分: 采用了两种显示方式:一、直接用数值显示控件;二、用仪表显示数值。
3)数据提取部分: 并不是所有的情况下,都是有人盯着数据的,于是我们编写了一段数据记录的程序段,将数据存储到了
excel 表格中,程序如图 Figure 3。这一部分花费的时间最长,本来只想将这一部分放入原先的 vi 程序中,结果 有时间刷新的冲突,最后采用全局变量的方法,将数据用另一个程序来存储。
Figure 4 4)报警部分:将报警部分编成了一个子 Vi 的形式:
5)整体的程序框图: 用于仪表显示的数据是经过采样八次求取*均值的方法。

6)整体界面的设计: 采用了最常规的设计方法,只是将颜色给修改了一下,调节的相对匀称一点。采用了双界面的形式:选项
卡 1 用来设置参数;选项卡二用来显示工作状态,以及我们所观察的对象。
三、总结

最终的测试结果我们都基本满意,可以较准确感知当前光强度的变化,而且可生成 excel 文件记录数据, 方便查询利用。本模型虽然精度没有那么高,只能给出光照强度的相对变化,但是总体结构十分简单,采用的 元器件也都很普通,因此成本十分低廉,便于推广利用,为节约生产成本提供了一个简单的选择。

附录:单片机程序的设计: 因为项目主要用的是 LabView,所以单片机用到的知识并不是很多。主要是 Usart 总线和 AD 转化两个部
分。程序内容如下:

/*****************************************************

File name

: 实时测量

Chip type

: ATmega16L

Program type

: Application

Clock frequency : 4.000000 MHz

Memory model

: Small

External SRAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega16.h> #include <delay.h>

#define BAUD 9600 #define CRYSTAL 4000000

//波特率采用 9600bps //系统时钟 4MHz

//计算和定义波特率设置参数 #define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) #define BAUD_H (unsigned char)(BAUD_SETTING>>8) #define BAUD_L (unsigned char)(BAUD_SETTING)

// USART 控制和状态寄存器的标志位定义

#define RXC 7

// UCSRA 位定义

#define TXC 6

#define UDRE 5

#define FE 4

#define DOR 3

#define PE 2

#define U2X 1

#define MPCM 0 #define RXCIE 7

// UCSRB 位定义

#define TXCIE 6

#define UDRIE 5

#define RXEN 4

#define TXEN 3

#define UCSZ2 2

#define RXB8 1

#define TXB8 0 #define URSEL 7

// UCSRC 位定义

#define UMSEL 6

#define UPM1 5

#define UPM0 4

#define USBS 3

#define UCSZ1 2

#define UCSZ0 1

#define UCPOL 0

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<PE)

#define DATA_OVERRUN (1<<DOR)

#define DATA_REGISTER_EMPTY (1<<UDRE)

float data_average[100]; // Timer 0 比较匹配中断服务

interrupt [TIM0_COMP] void timer0_comp_isr(void)

{

}

void USART_Transmit(char data)

{

while (!(UCSRA & DATA_REGISTER_EMPTY));

UDR = data;

// 发送数据

} // ADC 转换完成中断服务

interrupt [ADC_INT] void adc_isr(void)

{

static float v_value=0;

unsigned char temp;

static int i;

v_value+= ADCW/1024.0*5.0;

i++;

if(i==500)

{

v_value/=500;

temp=(unsigned char)(v_value*50);

USART_Transmit(temp);

temp=0;

i=0;

v_value=0 ;

}

}

// 等待发送寄存器空

void main( void )

{

PORTD = 0x03;

// TXD(PD1)输出

DDRD = 0x02;

// RXD(PD0)输入,上拉有效

DDRA=0x00;

PORTA=0x00;

UCSRA = 0x00;

// USART 初始化

UCSRB = (1<<TXEN); //发送允许

//UCSRB = 0x98;

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Data, 1 Stop, No Parity

//UCSRC = 0x86;

UBRRH = BAUD_H; // 设置波特率

UBRRL = BAUD_L;

// T/C0 初始化

TCCR0=0x0B; // 内部时钟,64 分频(4M/64=62.5KHz),CTC 模式

TCNT0=0x00;

OCR0=0x7C;

// OCR0 = 0x7C(124),(124+1)/62.5=2ms

TIMSK=0x02; // 允许 T/C0 比较中断

// ADC 初始化

ADMUX=0x40; // 参考电源 AVcc、ADC0 单端输入

SFIOR&=0x1F;

SFIOR|=0x60; // 选择 T/C0 比较匹配中断为 ADC 触发源

ADCSRA=0xAD; // ADC 允许、自动触发转换、ADC 转换中断允许、ADCclk=125Kz

#asm("sei") // 开放全局中断

while (1) {

} }



热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报