MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   USB-1024HLS DAQ板产生PWM /时钟信号 (https://www.labfans.com/bbs/showthread.php?t=22684)

poster 2019-12-10 16:49

USB-1024HLS DAQ板产生PWM /时钟信号
 
该板是否有API函数调用,该函数可以让我在板上运行其他代码的同时在500 kHz的输出上生成时钟信号?在此先感谢您的建议。


回答:
根据[URL="http://www.mathworks.com/products/daq/supportedio14004.html"]支持的硬件文档[/URL] ,需要2.8版或更高版本的[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daq_product_page.html"]数据采集工具箱[/URL]来支持Measurement Computing USB-1024HLS设备。假设您使用的是2.8版或更高版本,则以下内容将很接近您的解决方案...

第一步将是获取设备的硬件ID。函数[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/daqhwinfo.html"]DAQHWINFO[/URL]应该可以帮助您:

deviceInfo = daqhwinfo('mcc'); 然后,可以使用[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/digitalio.html"]DIGITALIO[/URL]函数从结构[B]deviceInfo获取[/B]的硬件ID用于创建数字I / O对象(DIO):

dio = digitalio('mcc',hardwareID); 接下来,您必须使用[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/addline.html"]ADDLINE[/URL]添加两条输出线(用于时钟信号和脉宽调制(PWM)信号):

addline(dio,0:1,'out'); 然后,您必须设置一些DIO属性。

set(dio,'TimerPeriod',0.000002); % ie 500 kHz set(dio,'TimerFcn',@update_outputs); 每个定时器周期都会调用一次[B]update_outputs[/B]函数,并且应将输出引脚设置为适当的值。 [URL="http://en.wikipedia.org/wiki/Clock_signal"]时钟信号[/URL]只是在每个定时器周期内在0和1之间来回切换。 [URL="http://en.wikipedia.org/wiki/Pulse-width_modulation"]PWM信号[/URL]也可能在0和1之间交替变化,但不会在每个定时器周期内改变,根据所需的脉宽调制类型,它会在每种状态下保持一定的时间。这是您的[B]update_outputs[/B]函数可能最终看起来像的样子:

function update_outputs(obj,event) currentValues = getvalue(obj); clockValue = ~currentValues(1); pwmValue = pwm_compute(); putvalue(obj,[clockValue pwmValue]); end 请注意,这使用[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/putvalue.html"]PUTVALUE[/URL]和[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/getvalue.html"]GETVALUE[/URL]设置/获取输出引脚的值。您将必须编写函数[B]pwm_compute[/B] ,以便它在每个时间段计算一个新的PWM值。由于[B]pwm_compute[/B]可能必须知道已经输出了多少个值(即已经调用了多少次),因此可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/persistent.html"]持久变量[/URL]来跟踪:

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信号并从矢量或数据文件中提取每个计时器周期的值,也可以使用传递到[B]update_outputs[/B]的[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html"][B]事件[/B]数据结构[/URL]来获取计时器事件的时间(相对于DIO计时器启动,我相信)。

最后,您必须启动DIO:

start(dio); ...,并在完成使用后将其删除并从内存中清除它:

delete(dio); clear dio; [B]一个潜在的绊脚石... [/B]

生成500 kHz信号可能很困难。这种频率很高,您[I]可能会[/I]遇到问题,特别是在每个计时器周期调用一次“ TimerFcn”时。如果“ TimerFcn”的运行时间超过0.000002秒,则[URL="http://www.mathworks.com/access/helpdesk/help/toolbox/daq/timerfcn.html"]可能无法处理某些计时器事件[/URL] ,从而导致输出实际上是较低频率的。我觉得您可能必须使用较低的信号频率才能正常工作,但是我可能是错的。 =)



[url=https://stackoverflow.com/questions/924808]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:17

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.