MATLAB Answers

PWM signal Simulink on serial port

14 views (last 30 days)
Jan De Vries
Jan De Vries on 30 Jul 2011
I need to connect my controller designed in Simulink to a brushless motor controller, which needs a PWM signal. This controller has a PWM connection cable (3 wires)
Is it possible to connect this controller to my PC (using serial port) and let Simulink send control signals to this motor controller?

  3 Comments

Arnaud Miege
Arnaud Miege on 1 Aug 2011
I doubt a serial connection will provide you with the bandwidth required for a PWM signal. I suspect you need a real-time operation. What frequency is your controller running at?
Jan De Vries
Jan De Vries on 2 Aug 2011
It runs at 2400BPS, as far as I know
Arnaud Miege
Arnaud Miege on 2 Aug 2011
Normally a PWM signal would be in the region of 100's of kHz, if not MHz.

Sign in to comment.

Answers (5)

Walter Roberson
Walter Roberson on 2 Aug 2011
Simulink is not supported on any system that is old enough to allow direct pin-level control of a system serial port. Unless, that is, you are talking about generating code for a controller: some of those might be able to handle it.

  0 Comments

Sign in to comment.


Arnaud Miege
Arnaud Miege on 2 Aug 2011
The Instrument Control Toolbox allows you to send data on the serial port with the Serial Send block. As I said in my comments, I am not sure this will be nearly fast enough for a PWM signal.
Arnaud

  3 Comments

Walter Roberson
Walter Roberson on 2 Aug 2011
PWM is not binary data: the width of each pulse needs to be individually controlled. That isn't going to happen with a standard serial port, which is going to want to send out pulses at a particular baud rate and is going to want to add a start bit and to impose the stop bit semantics.
Arnaud Miege
Arnaud Miege on 2 Aug 2011
Agreed. Jan, you need a proper PWM output signal, which means you need something like Real-Time Windows Target or xPC Target, which the appropriate I/O card.
Jan De Vries
Jan De Vries on 2 Aug 2011
Ok, so it's not possible to create a PWM signal using my serial card.
Below I added some more info, can I generate the signal I described using Matlab and a serial/USB port?

Sign in to comment.


Jan De Vries
Jan De Vries on 2 Aug 2011
Ok thanks for all your replies!
I want to control a brushless thruster. Because this is a brushless device, it has a special brushless controller connected to it, to convert my control signal to a brushless motor signal.
The brushless controller has a PWM input cable, which can be connected (according to the manual) to a "Parallax Servo Controller". This device can either be connected via USB or serial to a PC. It needs a TTL signal; that is some binary code right? Can I use matlab to send code to this device?

  4 Comments

Show 1 older comment
Walter Roberson
Walter Roberson on 2 Aug 2011
RS232 ports such as are normally found on PCs are *not* TTL level. RS232 signals with both positive and negative voltages; TTL uses only positive voltages and is not tolerant of negative voltages.
You can get USB to TTL converter cables, such as at http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm
USB, unless specially programmed, has a lower limit of 40 ms latency and an upper limit of 125 KHz.
TTL is not a binary code: it is a signalling standard for how to represent logic levels. If I recall correctly, TTL _is_ allowed to hold signals for varying times, but it is also not uncommon for it to be used to transmit binary data.
When I reflect about how USB works and reflect on how the USB to TTL converter cables must work, it seems unlikely to me that a USB to TTL cable would be able to represent pulses of varying widths.
Reading the documentation for the Parallax Servo Controller, I see that Yes, TTL level is required for the "RS232" communications to the controller. This is the communications that starts at 2400 bps. It is, however, in the form of commands, with the commands instructing the controller what signals to send and for how long, so the communications to the PC does *not* need to be concerned about individual pulses. Or at least if you are using the BOE (Board of Education) board. Unfortunately there are parts of the documentation that are not clear to me.
Jan De Vries
Jan De Vries on 2 Aug 2011
Thanks, Arnaud! I've been asking around a lot lately - and this is by far the most usefull information I received as it made a few concepts more clear to me!
Jan De Vries
Jan De Vries on 2 Aug 2011
And also thanks Walter ofcourse!

Sign in to comment.


Jan De Vries
Jan De Vries on 3 Aug 2011
I found some more info about the brushless motor controller (ESC);
The ESC generally accepts a nominal 50 Hz PWM servo input signal whose pulse width varies from 1 ms to 2 ms. When supplied with a 1 ms width pulse at 50 Hz, the ESC responds by turning off the DC motor attached to its output. A 1.5 ms pulse-width input signal results in a 50% duty cycle output signal that drives the motor at approximately half-speed. When presented with 2.0 ms input signal, the motor runs at full speed due to the 100% duty cycle (on constantly) output.
Can I produce these signals using matlab's serial communication (like fwrite() etc)?

  1 Comment

Walter Roberson
Walter Roberson on 3 Aug 2011
No; if it can be done directly through MATLAB then it would have to be through analogio(). The serial devices supported by MATLAB's serial() object are intended to be UARTs or emulations thereof, with byte-level output framed with start and stop bits.
The Parallax Servo Controller takes commands about positioning and emits appropriate pulses: that is the way to go in your situation.

Sign in to comment.


Jan De Vries
Jan De Vries on 3 Aug 2011
Ok right now I have the following code to send to my PSC:
ser = serial('COM3')
set(ser,'BaudRate',2400, 'Terminator', 'CR')
fopen(ser)
fwrite(ser,[33 83 67 86 69 82 63 13], 'uint8', 'sync')
out = fscanf(ser)
fclose(ser)
delete(ser)
clear ser
I keep getting a warning with the fscanf(ser) command:
Warning: A timeout occurred before the Terminator was reached.
ans =
1.0
Is there something wrong? I used the fwrite command to send the ascii code for the command "VER?", with $SC (33 83 67) being the preamble and CR (13) being the carriage return (so the command line is $SCVER?CR)

  1 Comment

Walter Roberson
Walter Roberson on 3 Aug 2011
Arnaud mentioned using !SC as the preamble; that is the same preamble that I found documented.
You should, by the way, be able to use
fprintf(ser, '%s', '!SCVER\n')
which would be more readable. Or
fwrite(ser, sprintf('!SCVER\n'), 'uint8', 'sync')

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by