该板是否有 API 函数调用,允许我在板上运行其他代码时在输出上生成 500 kHz 的时钟信号?预先感谢您的建议。
最佳答案
根据Supported Hardware documentation ,Data Acquisition Toolbox 的 2.8 或更高版本需要支持测量计算 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 信号并从向量或数据文件中提取每个定时器周期的值,或者您可以使用 event data structure传递给 update_outputs 以获取计时器事件的时间(我相信相对于 DIO 计时器启动)。
最后,您必须启动 DIO:
start(dio);
...并且,一旦您使用完它,请将其删除并从内存中清除:
delete(dio);
clear dio;
一个潜在的绊脚石...
生成 500 kHz 信号可能很困难。它的频率如此之高,您可能会遇到问题,特别是使用“TimerFcn”时,它每个计时器周期都会调用一次。如果“TimerFcn”运行时间超过 0.000002 秒,some timer events may not be processed ,导致输出实际上频率较低。我有一种感觉,你可能必须使用较低的信号频率才能正常工作,但我可能是错的。 =)
关于matlab - 从 USB-1024HLS DAQ 板生成 PWM/时钟信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/924808/