有没有针对这个线路板的API函数调用,允许我在线路板上运行其他代码的同时,在500 kHz的输出上产生时钟信号?提前感谢您的建议。
发布于 2009-06-19 21:03:49
根据Supported Hardware documentation的说法,需要2.8或更高版本的Data Acquisition Toolbox来支持测量计算USB-1024HLS设备。假设您有2.8或更高版本,下面的内容应该可以为您提供解决方案……
第一步是获取设备的硬件ID。函数DAQHWINFO应该对此有所帮助:
deviceInfo = daqhwinfo('mcc');从structure deviceInfo获得的硬件ID可用于使用DIGITALIO函数创建数字I/O对象:
dio = digitalio('mcc',hardwareID);接下来,必须使用ADDLINE添加两条输出线(用于时钟信号和脉宽调制信号
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这只是一种可能的解决方案。您可以预先计算脉宽调制信号,并从矢量或数据文件中提取每个定时器周期的值,或者您也可以使用传递给update_outputs的 data structure来获取定时器事件的时间(我相信是相对于DIO定时器启动)。
最后,您必须启动DIO:
start(dio);...and,一旦您使用完它,删除它并从内存中清除它:
delete(dio);
clear dio;一个潜在的绊脚石。
产生一个500 kHz的信号可能很困难。它的频率如此之高,以至于您可能会遇到问题,特别是“TimerFcn”,它每个计时器周期都会调用一次。如果'TimerFcn‘的运行时间超过0.000002秒,则返回some timer events may not be processed,导致输出的频率实际上较低。我有一种感觉,你可能必须使用较低的信号频率才能正常工作,但我可能错了。=)
发布于 2009-06-19 05:21:35
我在数据采集工具箱文档中找到了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 diohttps://stackoverflow.com/questions/924808
复制相似问题