View previous topic :: View next topic |
Author |
Message |
canero
Joined: 22 Apr 2018 Posts: 13
|
Synchronising 2 dsPICs (or multiple PICs) |
Posted: Wed Oct 03, 2018 12:42 am |
|
|
Hello;
I have a test bench concerning 2 dc motors. I need to run these motors in sync since they need to lift some weight from 2 opposite ends. In order to move them in sync, I suspect that the PIC controllers should be in Sync. I run these motors with dsPIC30F4011 microcontrollers since I use encoder readings.
I need to sync these 2 motors so that they both start at time= 0 Seconds and finish at Time=3.73 seconds(i.e). I use 2 dsPIC30F4011 with both internal 16x PLL.
(clocked at 117920000mhz) And the 2 PICs have exactly the same program. (only some reference position targets are different).
How can I sync the programs in these 2 PICs so that they both start at the same time and finish at the same time?
Thanks. _________________ Regards;
Caner. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Oct 03, 2018 3:51 am |
|
|
You're using encoders, I assume they are giving rotational data on the motors.
Don't you only need to sync the encoder outputs?
Mike |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Oct 03, 2018 4:17 am |
|
|
There is sync, and sync....
A difference of (say) 1mSec between two motor controllers wouldn't matter at all. However a difference of (say) 0.5 seconds, would.
So just change your code a fraction, and have one controller assume the role of 'master', and the other 'slave, and when idle between the tasks, have the master do something like pulse an I/O line. Have the slave look for this, and set it's internal counter to zero when it sees this. If all tasks are then synchronised to this counter, the two systems will be basically synchronised.
However comment applies. What are the PIC's using for their master clock?. If they are relying on the internal RC oscillator, there can be significant drift between these. Better to have an external crystal oscillator, and clock both PIC's from the same source. Then once the counters are synchronised, the units should remain in sync. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Wed Oct 03, 2018 4:51 am |
|
|
Ok, I'll be the 'bay guy' and say while you can 'sync' them it will NOT be easy.
given :2 DC motors. What type BLDC, servo,stepper, old school? Identical motors? IE from the same batch? Same stall current,run current??
unknown : motor controller / interface. Simple FET or module make a difference !
unknown : weights. are they identical? both exactly 2.134Kg NOT 2.133 and 2.135Kg.
unknown: control loop. open (just 'go for xx seconds') or closed (with feedback) preferably with encoder ?
Every aspect and part of the two 'lifts' MUST be identical or known, so that you can 'trim' the control for them to be in sync.
As an example, friend built his own wall mounted CNC, 4' by 8'. Users 2 steppers for lift (X axis),good to .0001 position BUT one motor may rest 'low' the other 'high' by the notch of the pole of the armature. Take a stepper and 'feel' the 'notch' when you lightly rotate the shaft without power. That very small amount of distance is enough to offset the motors when in use!
Provided you use encoders for positional feedback and run a calibration routine before each use, yes you can 'sync' the two PICs.
Jay |
|
|
canero
Joined: 22 Apr 2018 Posts: 13
|
|
Posted: Wed Oct 03, 2018 5:24 am |
|
|
Hello;
Thank you for your quick responses. My 2 dsPICs have PID loops in cascade, both controlling speed and position in closed loop. The motors are small dc motors with optical encoders.
Ttelmah, thanks a lot for your suggestion seems very workable, but, these motors should start and stop at the same time making a synchronous motion while running. The delay should be max 1-2ms.
How will I make sure that, this synchronous motion keeps running while pulsing an IO? I could not generate the logic in my mind. So should I pulse an IO from master and make the slave wait for it and when it arrives, move the slave to the next reference point and so on?
Also, What is the point of counters while doing synchronization? Can you please expand that part a little?
Caner. _________________ Regards;
Caner. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Oct 03, 2018 6:36 am |
|
|
You don't. You synchronise before you start.
Assuming you run the two chips off the same oscillator, all their timings will be the same. So all you do is start the main 'timing loop' of your PID system, in sync between the chips. You can even get sneaky/complex:
Have a single I/O output line on one chip. Held high after boot.
Have this connect to an interrupt input on _both_ PIC's.
Have the interrupt handler reset the timer(s) you use for the PID loop.
Then one chip drops this line.
Both chips interrupt at the same time.
Both timer(s) are then reset at exactly the same point.
It is even possible to do this with no master/slave, by having the line resistor pulled up. Then both chips when they reach a certain point use output_drive to pull the line low. It doesn't matter which one actually operates the line, since both chips respond the same to this. |
|
|
canero
Joined: 22 Apr 2018 Posts: 13
|
|
Posted: Wed Oct 03, 2018 8:46 am |
|
|
OK got your point Thelmah but this only solves the problem "starting the operation at the same time".
How do you continue to be in sync mode after that until the end of operation, that was what I was asking. There should be somekind of a clockline where both of the pics should follow after start, isnt it? (like a 10ms heartbeat or sort)
Or do we rely on having the same main clock crystals? (Thinking that their PID timers are all the same and no need to be clocked again while driving the motors).
Caner. _________________ Regards;
Caner. |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1909
|
|
Posted: Wed Oct 03, 2018 8:54 am |
|
|
You're worrying too much. Sync, move the object (run your motors), stop. Synchronize again just prior to moving again. Or synchronize every 10s. Or every 500ms. Doesn't really matter as your separate clocks, even if running from the PIC's internal RC oscillator, aren't going to drift much in the timeframes you're concerned about. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Oct 03, 2018 9:09 am |
|
|
Quote: |
OK got your point Thelmah but this only solves the problem "starting the operation at the same time".
How do you continue to be in sync mode after that until the end of operation, that was what I was asking. There should be somekind of a clockline where both of the pics should follow after start, isnt it? (like a 10ms heartbeat or sort)
Or do we rely on having the same main clock crystals? (Thinking that their PID timers are all the same and no need to be clocked again while driving the motors).
Caner.
|
If you clock the chips from one master oscillator, then they will remain in sync.
I must admit I assumed you had a timer 'tick' operating the PID. Typically you would have a tick that actually operates the cycle of the PID, so it remains at a constant rate. Hence if this is synchronised, and everything times from this, the whole system will remain inherently synchronised. |
|
|
canero
Joined: 22 Apr 2018 Posts: 13
|
|
Posted: Wed Oct 03, 2018 2:25 pm |
|
|
Hello again.
I successfully made the synch with IO as Thelmah suggested. Thanks a lot. The difference is noticable in a slow motion cam.
Now I am trying to make 3 PIC synchronization since I will need it for other projects. I believe a daisy chain kind of connection would work with syncing multiple pics.
Caner. _________________ Regards;
Caner. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Wed Oct 03, 2018 4:27 pm |
|
|
Actually 'daisy chaining' will be slower than a 'broadcast'.
Daisy chaining, to me, means a signa l(or token) gets passed from a master PIC to slave,which then passes it to another slave,which then passes it 'down the line'.... So, depending on the speed of transmission and how long the PIC takes to receive and retransmit the 'token', will affect the overall system. Say you had 5 PICs in the chain and a 10us 'process' time. PIC #5 will be 40us 'behind' the master.
Broadcsting, to me, means that ALL PICs receive the 'token' at the same time. Various ways to achieve this. I2C specs a 'special' adrs(00 ?) that all devices have so that all can be updated at the same time. In this method the only difference is the 'propagation delay' based upon length of wiring. Probably not a problem within the same house, but use 15 miles of cable and it add up !
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Oct 03, 2018 11:05 pm |
|
|
The 'wire or' pull down only sync, will work with multiple chips.
Generate the pulse with something like:
Code: |
output_low(SYNC_PIN);
delay_us(10);
output_float(SYNC_PIN);
|
So long as interrupts are enabled on all chips well in advance of this point, all the chips will interrupt on the falling edge. |
|
|
|