首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于USB-1024HLS数据采集卡的PWM/时钟信号产生

基于USB-1024HLS数据采集卡的PWM/时钟信号产生
EN

Stack Overflow用户
提问于 2009-05-29 07:25:57
回答 2查看 2.1K关注 0票数 2

有没有针对这个线路板的API函数调用,允许我在线路板上运行其他代码的同时,在500 kHz的输出上产生时钟信号?提前感谢您的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-19 21:03:49

根据Supported Hardware documentation的说法,需要2.8或更高版本的Data Acquisition Toolbox来支持测量计算USB-1024HLS设备。假设您有2.8或更高版本,下面的内容应该可以为您提供解决方案……

第一步是获取设备的硬件ID。函数DAQHWINFO应该对此有所帮助:

代码语言:javascript
复制
deviceInfo = daqhwinfo('mcc');

从structure deviceInfo获得的硬件ID可用于使用DIGITALIO函数创建数字I/O对象:

代码语言:javascript
复制
dio = digitalio('mcc',hardwareID);

接下来,必须使用ADDLINE添加两条输出线(用于时钟信号和脉宽调制信号

代码语言:javascript
复制
addline(dio,0:1,'out');

然后,您必须设置一些DIO属性。

代码语言:javascript
复制
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函数可能最终的样子:

代码语言:javascript
复制
function update_outputs(obj,event)
  currentValues = getvalue(obj);
  clockValue = ~currentValues(1);
  pwmValue = pwm_compute();
  putvalue(obj,[clockValue pwmValue]);
end

请注意,这使用PUTVALUEGETVALUE来设置/获取输出引脚的值。您必须编写函数pwm_compute,以便为每个时间周期计算一个新的PWM值。由于pwm_compute可能必须知道已经输出了多少值(即,它已经被调用了多少次),因此可以使用persistent variable跟踪该值

代码语言:javascript
复制
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:

代码语言:javascript
复制
start(dio);

...and,一旦您使用完它,删除它并从内存中清除它:

代码语言:javascript
复制
delete(dio);
clear dio;

一个潜在的绊脚石。

产生一个500 kHz的信号可能很困难。它的频率如此之高,以至于您可能会遇到问题,特别是“TimerFcn”,它每个计时器周期都会调用一次。如果'TimerFcn‘的运行时间超过0.000002秒,则返回some timer events may not be processed,导致输出的频率实际上较低。我有一种感觉,你可能必须使用较低的信号频率才能正常工作,但我可能错了。=)

票数 2
EN

Stack Overflow用户

发布于 2009-06-19 05:21:35

我在数据采集工具箱文档中找到了Example: Generating Timer Events

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/924808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档