stm32 generate PWM signal with multiple channels - stm32

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
TIM3->CCR1 =25000;
I'm trying to set 2 pins to the same PWM signal at the same time.
However, it doesn't work. Only 1 pin (channel 1) has PWM output and the 2nd pin (channe 2) has empty output.

Every channel has its own register CCR
You only set one, the second one has the default value - 0 - and the duty ratio of the generated PWM signal is zero or 100% depending on the other registers settings.
add:
TIM3->CCR2 = /*your value here*/;
and it should work

try with these commands
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, value);

Related

Simulation tool cannot recognize if pulse width smaller than delay cell in verilog

I am using VCS tool to verify for 1 AND logic cell.
I set the 2 inputs = 1 (pulse signal) with pulse width is 25ps.
Delay cell define in verilog model of cell AND is 26ps.
Because pulse width = 25ps < delay cell = 26ps so output is always 0 even that 2 input equal 1 during 25ps.
I want to ask in the real chip, Whether we can detect this pulse or not ?
Anybody can help me.
output should equal 1 for about 25ps.
VCS (and other simulators) have switches to control how they handle these situations.
Look at +pulse_e, +pulse_r, as well as things like +transport_int_delays, +transport_path_delays, +pulse_on_event, +pulse_on_detect, and +delay_mode_*, etc.
You can have the simulator propagate that short pulse (25 < 26). You can have it propagate 1'bx, or you can have it swallow it and propagate nothing.

Simulink/StateFlow error with my Clock

I created this state machine chart in Simulink using the StateFlow :
There are two states (S1,S2), one of which (S1) has 3 nested parallel FSM , each one has 4 states (SS1, SS2, SS2, SS4) , I put a default state in all of the 3 FSMs (SS1), and in the main two states (default S2).
To test the main FSM (S1,S2) , I used signal builder for all my inputs/events. One of the inputs is a square wave which is a clock event for my main FSM (1 Hz) and the duration of the simulation is 50 sec.
The problem i have is that i can see in the signal builder that i have a square wave, however when i put scope to that clock i see one square wave (extending from 0 to 49.5 second then drops to 0) .
Where is my clock ? what isn't it feeding my FSM properly ?
Here is the FSM:
The orthogonal sub-states are :
in details:
in in between S1 and S2
One of the signal builder , which has the Clock signal is:
The other has the following signals:
The problem is that you are using the default step size with ode3. When using a fixed-step solver the auto step size is calculated as (StopTime-StartTime)/50. In your case this gives a step size of 1.
Since at t = 0,1,2,3,...49 the Clock has a value of 2, that's what you see in the scope.
At t =50 the Clock has a value of 0, and that's what you're seeing in the scope.
You need to go to the Solver Panel of the Simulaton->Model Configuration Parameters pull-down menu.
Then open up the Additional Options option and change the step size to something smaller, such as 0.01.
Alternatively (depending on your other requirements) you could use a variable step solver.

Incorrect analog input reading in legacy interface matlab

I tried to use analog input signal for triggering purpose, however I have a problem with analog input reading. For example, when I send 6 V, I can read only 0.5 V, and signal form shown in the link is supposed to be square pulse but obviously, it is not.
My Daq card is NI PCI 6120. I used MAX software to check if it is a hardware issue, but it gives correct value and signal form, and as I try a session based matlab code to read only one analog input channel, I can get correct signal.
There should be a mistake in my matlab triggering code. Any suggestion ?
dig= digitalio('nidaq','Dev1');
line = addline(dio,0:1,'Out');
ai = analoginput('nidaq','Dev1');
channel = addchannel(ai,0:1);
set(ai,'SampleRate',fs);
set(ai,'SamplesPerTrigger',N);
set(ai,'Timeout',10000)
set(ai,'TriggerChannel',channel(1));
set(ai,'TriggerType','Software');
set(ai,'TriggerCondition','Rising');
set(ai,'TriggerConditionValue',0.5);
set(ai,'TriggerDelayUnits','Samples');
set(ai,'TriggerDelay',-3000);
set(ai,'LogFileName','file00.daq')
set(ai,'LoggingMode','Disk&Memory')
putvalue(dig,1)
start (ai)
[data t] = getdata(ai);
putvalue(dio,0)
delete(ai);
delete(dig);
enter image description here

Serial Comunnication between matlab and arduino

I am trying to send data from MATLAB to ARDUINO using the following code for arduino and the second one for the matlab. Both code work fine and when i press 1 led lights up and when press 2 led become off. But actually what i am trying to do is when matlab run code it automatically send 1 to arduino and the led become on. i have tried may changes but cant able to do. when iam trying to run the third code (given below) the arduino status led blink that show it receive some thing but my actual led which is connected to pin 13 still off.
int ledPin=13;
int matlabData;
void setup()
{
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>0) // if there is data to read
{
matlabData=Serial.read(); // read data
if(matlabData==1)
digitalWrite(ledPin,HIGH); // turn light on
else if(matlabData==2)
digitalWrite(ledPin,LOW); // turn light off
}
}
(MATLAB)
1.
clear all
2.clc
3.
4.answer=1; % this is where we'll store the user's answer
5.arduino=serial('COM4','BaudRate',9600); % create serial communication object on port COM4
6.
7.fopen(arduino); % initiate arduino communication
8.
9.while answer
10. fprintf(arduino,'%s',char(answer)); % send answer variable content to arduino
11. answer=input('Enter led value 1 or 2 (1=ON, 2=OFF, 0=EXIT PROGRAM): '); % ask user to enter value for variable answer
12.end
13.
14.fclose(arduino); % end communication with arduino
(MY edit code)
1.
clear all
2.clc
3.
4.answer=1; % this is where we'll store the user's answer
5.arduino=serial('COM4','BaudRate',9600); % create serial communication object on port COM4
6.
7.fopen(arduino); % initiate arduino communication
8.
9.%while answer
10. fprintf(arduino,'%s',char(answer)); % send answer variable content to arduino
11. answer='1'%('Enter led value 1 or 2 (1=ON, 2=OFF, 0=EXIT PROGRAM): '); % ask user to enter value for variable answer
12.%end
13.
14.fclose(arduino); % end communication with arduino
The difference is the following:
answer = input('bla')
yields an answer that is a number, i.e. answer is of type double. In your third case, you wrote answer='1' which is a char, so in fact, the variable answer is different in both cases. Try and change the code in the third part to this here:
answer = 1;
or change the fprintf command to
fprintf(arduino, '%s', str2num(answer));

Can you synchronize the data acquisition toolbox and the image acquisition toolbox of Matlab?

I'd like to simultaneously get data from a camera (i.e. an image) and an analog voltage using matlab. For the camera I use the imaq toolbox, for reading the voltage I use the daq toolbox (reading NI-USB device), with a following code:
clear all
% Prepare camera
vid = videoinput('gentl', 1, 'Mono8');
src = getselectedsource(vid);
vid.FramesPerTrigger = 1;
vid.TriggerRepeat = Inf;
triggerconfig(vid, 'hardware', 'DeviceSpecific', 'DeviceSpecific');
src.FrameStartTriggerMode = 'On';
src.FrameStartTriggerActivation = 'RisingEdge';
% prepare DAQ
s=daq.createSession('ni');
s.addAnalogInputChannel('Dev1','ai1','Voltage');
fid = fopen('log.txt','w');
lh = s.addlistener('DataAvailable',#(src,event)SaveData(fid,event));
s.IsContinuous = true;
% Take data
s.startBackground();
start(vid)
N=10;
for ii=1:N
im(:,:,ii)=getsnapshot(vid);
end
% end code
delete(lh );
fclose('all');
stop(vid)
delete(vid)
where the function SaveData is:
function SaveData(fid,event)
time = event.TimeStamps;
data = event.Data;
fprintf(fid, '%f,%f\n ', [time data]);
end
I do get images and a log.txt file with the daq trace (time and data), but how can I use the external triggering (that trigger the camera) or some other clock to synchronize the two?
For this example, the daq reads the camera triggering TTL signal (# 50 Hz), so I want to assign each TTL pulse to an image.
Addendum:
I've been searching and have found a few discussions (like this one) on the subject, and read the examples that are found in the Mathworks website, but haven't found an answer. The documentation shows how to Start a Multi-Trigger Acquisition on an External Event, but the acquisition discussed is only relevant for the DAQ based input, not a camera based input (it is also working in the foreground).
This will not entirely solve your problem, but it might be good enough. Since the synchronization signal you are after in at 50 Hz, you can use clock in order to create time stamps for both types of your data (camera image and analog voltage). Since the function clock takes practically no time (i.e. below 1e-7 sec), you can try edit to your SaveData function accordingly:
fprintf(fid, '%f,%f\n ', [clock time data]);
And in the for loop add:
timestamp(i,:)=clock;
Can you use the sync to trigger the AD board? From the USB-6009 manual...
Using PFI 0 as a Digital Trigger--
When an analog input task is defined, you can configure PFI 0 as a digital trigger input. When the digital trigger is enabled, the AI task waits for a rising or falling edge on PFI 0 before starting the acquisition. To use AI Start Trigger (ai/StartTrigger) with a digital source, specify PFI 0 as the source and select a rising or falling edge.
My experience suggests that delay between trigger and AQ is very short
I'm sorry I use Python or C for this, so I can't give you MatLab code, but you want to look at functions like.
/* Select trigger source */
Select_Signal(deviceNumber, ND_IN_START_TRIGGER, ND_PFI_0, ND_HIGH_TO_LOW);
/* specify that a start trigger is to be used */
DAQ_Config(deviceNumber, startTrig, extConv); // set startTrig = 1
/* start the acquisition */
DAQ_Start(deviceNumber, …)
If you want to take this route you could get more ideas from:
http://www.ni.com/white-paper/4326/en
Hope this helps,
Carl
This is yet no complete solution, but some thoughts that might be useful.
I do get images and a log.txt file with the daq trace (time and data), but how can I use the external triggering (that trigger the camera) or some other clock to synchronize the two?
Can you think of a way to calibrate your setup? I.e. modify your experiment and create a distinct event in both your image stream and voltage measurements, which can be used for synchronization? Just like this ...