Write on DAC with desired Frequency of a Sine Wave

7 次查看(过去 30 天)
Hi,
I am trying to write a sine wave for a DAC by using the MATLAB support package of Arduino. The code that I used is as below:
------------------------------
clear all
a = arduino('COM3', 'Uno');
dev = spidev(a,'D10','Mode',2,'BitOrder','msbfirst','Bitrate',1000000);
fs = 1024; % Sampling frequency
dt = 1/fs; % seconds per sample
StopTime = 1; % Total time
F1 = 100; % Sine wave frequency (hertz)
for t=0:dt:StopTime-dt
data1 = 32767+24576*sin(2*pi*F1*t); % 32767 and 24576 are the bias and amplitude setting of Sine wave for 16 bit DAC
writeRead(dev,[24,flip(typecast(uint16(data1),'uint8'))],'uint8'); % Command/Address bits and 16 bit Data
end
-----------------------------------
The DAC output shows a sine wave with frequency reduced to 10 Hz instead of 100 Hz....I checked with other sample rate and different frequency setting but the output frequency is always lower than the desired frequency. Could you please suggest how to avoid such delay or match the output frequency with the desired one. Thanks.

回答(1 个)

Walter Roberson
Walter Roberson 2018-6-12
You need a sampling frequency that is at least twice the frequency of the sine wave you want to create.
By the way, for efficiency you should probably create the entire output matrix first.
t=0:dt:StopTime-dt;
data1 = swapbytes(uint16(32767+24576*sin(2*pi*F1*t)));
for K = 1 : length(data1)
writeRead(dev, [uint8(24), typecast(data1(K),'uint8')], 'uint8');
end
  5 个评论
Walter Roberson
Walter Roberson 2018-6-16
The single-channel Arduino code you show, appears to me to output only one point per millisecond, with you outputting two points each with a delay(1) which is one millisecond. That is within the same overall loop as the multi-channel code, so the multi-channel code is having to wait 2 millisecond (to do the single-ended things) every cycle. I see no evidence that you are outputting 10 samples in 2 millisecond for single channel in your code.
Walter Roberson
Walter Roberson 2018-6-16
The part of the Arduino code where you output 1024 samples to each of four channels has no built-in delays: it will output as quickly as the hardware permits the cycles to be run.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 MATLAB Support Package for Arduino Hardware 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by