poster
2019-12-10, 16:49
该板是否有API函数调用,该函数可以让我在板上运行其他代码的同时在500 kHz的输出上生成时钟信号?在此先感谢您的建议。
回答:
根据支持的硬件文档 (http://www.mathworks.com/products/daq/supportedio14004.html) ,需要2.8版或更高版本的数据采集工具箱 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daq_product_page.html)来支持Measurement Computing USB-1024HLS设备。假设您使用的是2.8版或更高版本,则以下内容将很接近您的解决方案...
第一步将是获取设备的硬件ID。函数DAQHWINFO (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daqhwinfo.html)应该可以帮助您:
deviceInfo = daqhwinfo('mcc'); 然后,可以使用DIGITALIO (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/digitalio.html)函数从结构deviceInfo获取的硬件ID用于创建数字I / O对象(DIO):
dio = digitalio('mcc',hardwareID); 接下来,您必须使用ADDLINE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/addline.html)添加两条输出线(用于时钟信号和脉宽调制(PWM)信号):
addline(dio,0:1,'out'); 然后,您必须设置一些DIO属性。
set(dio,'TimerPeriod',0.000002); % ie 500 kHz set(dio,'TimerFcn',@update_outputs); 每个定时器周期都会调用一次update_outputs函数,并且应将输出引脚设置为适当的值。 时钟信号 (http://en.wikipedia.org/wiki/Clock_signal)只是在每个定时器周期内在0和1之间来回切换。 PWM信号 (http://en.wikipedia.org/wiki/Pulse-width_modulation)也可能在0和1之间交替变化,但不会在每个定时器周期内改变,根据所需的脉宽调制类型,它会在每种状态下保持一定的时间。这是您的update_outputs函数可能最终看起来像的样子:
function update_outputs(obj,event) currentValues = getvalue(obj); clockValue = ~currentValues(1); pwmValue = pwm_compute(); putvalue(obj,[clockValue pwmValue]); end 请注意,这使用PUTVALUE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/putvalue.html)和GETVALUE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/getvalue.html)设置/获取输出引脚的值。您将必须编写函数pwm_compute ,以便它在每个时间段计算一个新的PWM值。由于pwm_compute可能必须知道已经输出了多少个值(即已经调用了多少次),因此可以使用持久变量 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/persistent.html)来跟踪:
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的事件数据结构 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html)来获取计时器事件的时间(相对于DIO计时器启动,我相信)。
最后,您必须启动DIO:
start(dio); ...,并在完成使用后将其删除并从内存中清除它:
delete(dio); clear dio; 一个潜在的绊脚石...
生成500 kHz信号可能很困难。这种频率很高,您可能会遇到问题,特别是在每个计时器周期调用一次“ TimerFcn”时。如果“ TimerFcn”的运行时间超过0.000002秒,则可能无法处理某些计时器事件 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html) ,从而导致输出实际上是较低频率的。我觉得您可能必须使用较低的信号频率才能正常工作,但是我可能是错的。 =)
更多&回答... (https://stackoverflow.com/questions/924808)
回答:
根据支持的硬件文档 (http://www.mathworks.com/products/daq/supportedio14004.html) ,需要2.8版或更高版本的数据采集工具箱 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daq_product_page.html)来支持Measurement Computing USB-1024HLS设备。假设您使用的是2.8版或更高版本,则以下内容将很接近您的解决方案...
第一步将是获取设备的硬件ID。函数DAQHWINFO (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daqhwinfo.html)应该可以帮助您:
deviceInfo = daqhwinfo('mcc'); 然后,可以使用DIGITALIO (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/digitalio.html)函数从结构deviceInfo获取的硬件ID用于创建数字I / O对象(DIO):
dio = digitalio('mcc',hardwareID); 接下来,您必须使用ADDLINE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/addline.html)添加两条输出线(用于时钟信号和脉宽调制(PWM)信号):
addline(dio,0:1,'out'); 然后,您必须设置一些DIO属性。
set(dio,'TimerPeriod',0.000002); % ie 500 kHz set(dio,'TimerFcn',@update_outputs); 每个定时器周期都会调用一次update_outputs函数,并且应将输出引脚设置为适当的值。 时钟信号 (http://en.wikipedia.org/wiki/Clock_signal)只是在每个定时器周期内在0和1之间来回切换。 PWM信号 (http://en.wikipedia.org/wiki/Pulse-width_modulation)也可能在0和1之间交替变化,但不会在每个定时器周期内改变,根据所需的脉宽调制类型,它会在每种状态下保持一定的时间。这是您的update_outputs函数可能最终看起来像的样子:
function update_outputs(obj,event) currentValues = getvalue(obj); clockValue = ~currentValues(1); pwmValue = pwm_compute(); putvalue(obj,[clockValue pwmValue]); end 请注意,这使用PUTVALUE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/putvalue.html)和GETVALUE (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/getvalue.html)设置/获取输出引脚的值。您将必须编写函数pwm_compute ,以便它在每个时间段计算一个新的PWM值。由于pwm_compute可能必须知道已经输出了多少个值(即已经调用了多少次),因此可以使用持久变量 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/persistent.html)来跟踪:
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的事件数据结构 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html)来获取计时器事件的时间(相对于DIO计时器启动,我相信)。
最后,您必须启动DIO:
start(dio); ...,并在完成使用后将其删除并从内存中清除它:
delete(dio); clear dio; 一个潜在的绊脚石...
生成500 kHz信号可能很困难。这种频率很高,您可能会遇到问题,特别是在每个计时器周期调用一次“ TimerFcn”时。如果“ TimerFcn”的运行时间超过0.000002秒,则可能无法处理某些计时器事件 (http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html) ,从而导致输出实际上是较低频率的。我觉得您可能必须使用较低的信号频率才能正常工作,但是我可能是错的。 =)
更多&回答... (https://stackoverflow.com/questions/924808)