是否有一个API函数调用此板可以让我在500 kHz的输出上生成时钟信号,同时在电路板上运行其他代码?提前感谢您的建议。
答案 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
请注意,这使用PUTVALUE和GETVALUE来设置/获取输出引脚的值。您必须编写函数 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