从USB-1024HLS DAQ板生成PWM /时钟信号

时间:2009-05-29 07:25:57

标签: matlab hardware

是否有一个API函数调用此板可以让我在500 kHz的输出上生成时钟信号,同时在电路板上运行其他代码?提前感谢您的建议。

2 个答案:

答案 0 :(得分:2)

根据Supported Hardware documentation,需要Data Acquisition Toolbox版本2.8或更高版本来支持Measurement Computing USB-1024HLS设备。假设您有2.8或更新版本,以下内容应该为您提供一个解决方案......

第一步是获取设备的硬件ID。函数DAQHWINFO应该有助于此:

deviceInfo = daqhwinfo('mcc');

然后,可以使用结构 deviceInfo 获得的硬件ID使用DIGITALIO函数创建数字I / O对象(DIO):

dio = digitalio('mcc',hardwareID);

接下来,您必须使用ADDLINE添加两条输出线(用于时钟信号和脉冲宽度调制(PWM)信号):

addline(dio,0:1,'out');

然后,您必须设置一些DIO属性。

set(dio,'TimerPeriod',0.000002);  % i.e. 500 kHz
set(dio,'TimerFcn',@update_outputs);

每个定时器周期都会调用 update_outputs 函数,并应将输出引脚设置为适当的值。 clock signal只是在每个定时器周期内在0和1之间来回切换。 PWM signal也可能在0和1之间交替,但它不会改变每个定时器周期,根据您想要的脉冲宽度调制的类型,在每个状态下保持一段设定的时间。以下是您的 update_outputs 功能最终可能如下所示:

function update_outputs(obj,event)
  currentValues = getvalue(obj);
  clockValue = ~currentValues(1);
  pwmValue = pwm_compute();
  putvalue(obj,[clockValue pwmValue]);
end

请注意,这使用PUTVALUEGETVALUE来设置/获取输出引脚的值。您必须编写函数 pwm_compute ,以便为每个时间段计算新的PWM值。由于 pwm_compute 可能必须知道已经输出了多少个值(即已经调用了多少次),因此您可以使用persistent variable跟踪该值:

function newValue = pwm_compute
  persistent nValues;
  if isempty(nValues)
    nValues = 0;
  else
    nValues = nValues+1;
  end
  ...
  % Compute the new value for the (nValues+1) time period
  ...
end

这只是一种可能的解决方案。您可以预先计算PWM信号并从矢量或数据文件中提取每个定时器周期的值,或者您可以使用传递给 update_outputs event data structure来获取计时器的时间事件(相对于DIO计时器开始,我相信)。

最后,你必须启动DIO:

start(dio);

...并且,一旦你完成使用它,删除它并从内存中清除它:

delete(dio);
clear dio;

一个潜在的绊脚石......

生成500 kHz信号可能很困难。这是一个如此高的频率,你可能遇到问题,特别是'TimerFcn',每个定时器周期调用一次。如果'TimerFcn'运行时间超过0.000002秒some timer events may not be processed,则导致实际输出频率较低。我有一种感觉,你可能不得不使用较低的信号频率来使事情正常工作,但我可能是错的。 =)

答案 1 :(得分:1)

我在数据采集工具箱文档中找到了Example: Generating Timer Events

dio = digitalio('nidaq','Dev1');
addline(dio,0:7,'in');
set(dio,'TimerFcn',@daqcallback)
set(dio,'TimerPeriod',5.0)
start(dio)
pause(11)
delete(dio)
clear dio