65.9K
CodeProject 正在变化。 阅读更多。
Home

LED 示例与 Measurement Studio

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (9投票s)

2010年9月28日

CPOL

3分钟阅读

viewsIcon

69493

downloadIcon

2060

描述软件和硬件设置的指南文章

form.PNG

图 1. 用户界面

hardware_setup_photo_small.PNG

图 2. 硬件设置照片

(点击查看大图)。

引言

为了启动一小块硬件,我不得不快速编写一个实用程序来控制 LED 光源。我选择的工具是 C#、National Instrument Measurement Studio 和 USB-6008 输入/输出卡。在某个时候,我意识到像这样的文章可能对那些刚开始接触 Measurement Studio 的人有用。

硬件

该设置围绕 National Instruments USB-6008 多功能 I/O 设备构建。 我通过 USB 连接到笔记本电脑。 恒流 LED 驱动器和 LED 本身位于一个单独的板上(更详细的原理图)。

LED 输出与电流成正比。驱动电路的设计使 LED 电流与控制电压 V_SET_I 成正比,V_SET_I 由 USB-6008 上的一个模拟输出生成。 另一个数字控制信号用于打开和关闭 LED。

hardware_setup_block_diagram.PNG

图 3. 硬件设置的框图。

(我还上传了 恒流 LED 驱动器的原理图。)

软件

该软件的目的是提供一个简单的 GUI,允许用户使用滑块控制 LED 强度,并使用切换按钮打开/关闭 LED。

类图

DAQmx.Task 的子类负责访问硬件通道。 它们公开 public 方法和属性,同时隐藏通道涉及的物理指定的详细信息。 对于我们的任务,还创建了额外的写入器对象(AnalogSingleChannelWriterDigitalSingleChannelWriter)。

class_diagram__correct.PNG

legend.PNG

4.

一个诱人的错误是尝试创建一个包含多种通道类型的任务。 例如,它可以是模拟输出通道 (AO) 和数字输出通道 (DO)。

this.AOChannels.CreateVoltageChannel
	("Dev2/ao1", "LED brightness", 0, 5, AOVoltageUnits.Volts);
this.DOChannels.CreateChannel("Dev2/port0/line0", "LED on", 
	ChannelLineGrouping.OneChannelForEachLine);  // an attempt to create the 
				// 2nd type of a channel will cause an exception

class_diagram__incorrect.PNG

图5。

通过为要使用的每种通道类型创建一个单独的 DAQmx.Task 子类,可以很容易地解决这个问题(参见图 4)。

关于源代码

这个项目的代码是手写的。 同时,MStudio 有一个可以为任务生成代码的向导。 如果您想了解更多关于向导的信息,请查看 [4]。 项目的代码以最简单的风格编写:具有硬编码参数、没有健全性检查、没有错误处理。 这使得更容易看到对 MStudio 的调用。

关注点

让我们来看看 DAQmx.Task 的一个子类 - LEDOn。 它的目的是切换一个数字输出。 简单的代码很小

class LEDOn : NationalInstruments.DAQmx.Task
{
    private DigitalSingleChannelWriter  m_dscwLEDon;

    public void Init()
    {
        this.DOChannels.CreateChannel("Dev2/port0/line0", "LED on", 
	ChannelLineGrouping.OneChannelForEachLine); 	// create the channel, 
						// specify hardware
        this.Control(TaskAction.Verify);    	// transition task to the verified state
        m_dscwLEDon = new DigitalSingleChannelWriter(this.Stream);  // create the 
							// stream writer
    }

    public bool On
    {
        set { m_dscwLEDon.WriteSingleSampleSingleLine(true, value); }
    }
} 

表单类实例化 LEDOn 类(和其他任务类),然后调用初始化,然后可以写入通道。

初始化

在使用通道之前,需要进行一个小初始化

  1. 在任务中创建一个通道。
  2. 任务经过验证。
  3. 创建适当的写入器并将其连接到任务的流。

所有这些都在 LEDOn.Init(): 中完成:

task_state_machine.PNG

图 6. DAQmx.Task 对象的状态转换图

写入通道

通过调用通道写入器对象的 WriteSingleSampleSingleLine() 方法来完成向通道的写入。 其他类型的通道有类似的 WriteX() 方法。 请注意,autoStart 设置为 true。 任务短暂地进入 Running 状态,写入样本,然后返回到 Committed 状态。 MStudio 在线帮助中有一篇有用的文章“使用 Start Task function/VI”,其中详细说明了何时调用 Start()Stop(),以及 autoStart 的工作原理。

闭幕词

我计划添加一个更精细的这个项目版本,它具有健全性检查和错误处理。

一如既往,欢迎提出错误记录、建议、见解、评论、请求等!

参考文献

[1] National Instruments Measurement Studio 的官方主页

[2] Measurement Studio 论坛的 .NET 部分

[3] USB-6008 多功能 I/O 设备

[4] 演练:创建 MeasurementStudio NI-DAQmx 应用程序

[5] Measurement Studio .NET 类层次结构图

缩略语和简称

NI 美国国家仪器
MStudio NI 制造的 Measurement Studio
DAQ 数据采集

历史

  • 初始草稿。 2010 年 9 月 26 日
© . All rights reserved.