The whole chip is controlled with a negSleep signal - like a +chipSelect. Each bridge is controlled with two (2) leads: one is for direction and mode, the other is for PWM - very simple. The breakout board was very cheap. It has only minimal pins... the current control is disabled / tied to ground. A negFault is provided as output indicating signal faults, over current, over temperature, and under voltage.
// DRV3388test.js
var ms = // motors
[ {} // motor 0 does not exist
, { id: 1 // motor 1
, dr: 0 // direction 2/1/0/-1-2 f/s-forw/stop/rev-s/f
, sp: 0 // speed / duty 0..1
, ps: // pins
[ B8 // DRV3388 AIN1 (BRD7)
, B9 // DRV3388 AIN2 (BRD8)
]
}
, { id: 2 // motor 2
, dr: 0 // direction 2/1/0/-1-2 f/s-forw/stop/rev-s/f
, sp: 0 // speed / duty 0..1
, ps: // pins
[ B6 // DRV3388 BIN1 (BRD11)
, B7 // DRV3388 BIN2 (BRD12)
]
}
]
, slp=B10 // DRV3388 nSleep (BRD1)
, flt=B1 // DRV3388 nFault (BRD6)
, fltInd=LED1 // fault indicator
, fltWId=null // fault watch id
, onInd=LED2 // on indicator (not sleep)
, on=false // false not active
, frq=1200 //
, ddf=1.20 // duty delta faster as fraction
, dds=0.84 // duty delta slower as fraction
// , ddf=1.11 // duty delta faster as fraction
// , dds=0.90 // duty delta slower as fraction
, dmn=0.24 // duty min as fraction
, dmx=1.00 // duty max as fraction
, sbt=A10 // slower button (blue)
, sbtWId=null // slower button watch id
, fbt=A0 // faster button (red)
, fbtWId=null // faster button watch id
, rpt=150 // repeate check interval
, cmi=1 // current motor id
;
function doFlt(e) {
digitalWrite(fltInd, ! e.state);
}
function setup() {
if (fltWId) fltWId=clearWatch(fltWId);
if (sbtWId) sbtWId=clearWatch(sbtWId);
if (fbtWId) fbtWId=clearWatch(fbtWId);
pinMode(slp,"output");
pinMode(flt,"input");
ms.forEach(function(m,x){ if (x>0) {
m.dr=0;
m.sp=0;
pinMode(m.ps[0],"output");
pinMode(m.ps[1],"output");
stp(x); }}); // stop
on(0);
fltInd.reset();
fltWId=setWatch(doFlt,flt
,{edge:"both",repeat:true});
pinMode(sbt,"input_pullup");
pinMode(fbt,"input_pullup");
sbtWId=setWatch(slower,sbt
,{edge:"falling",repeat:true,debounce:10});
fbtWId=setWatch(faster,fbt
,{edge:"falling",repeat:true,debounce:10});
}
function ffd(mid,dty) { // forward fast decay w/ duty
var m=ms[mid], ps=m.ps;
if (m.dr!=2) { m.dr=2;
digitalWrite(ps,0); }
console.log("f:",Math.round(dty*100));
analogWrite(ps[0],m.sp=dty,{freq:frq});
}
function fsd(mid,dty) { // forward slow decay w/ duty
var m=ms[mid], ps=m.ps;
if (m.dr!=1) { m.dr=1;
digitalWrite(ps,0); }
digitalWrite(ps[0],1);
console.log("f:",Math.round(dty*100));
analogWrite(ps[1],m.sp=dty,{freq:frq});
}
function rfd(mid,dty) { // reverse fast decay w/ duty
var m=ms[mid], ps=m.ps;
if (m.dr!=-2) { m.dr=-2;
digitalWrite(ps,0); }
console.log("r:",Math.round(dty*100));
analogWrite(ps[1],m.sp=dty,{freq:frq});
}
function rsd(mid,dty) { // forward slow decay w/ duty
var m=ms[mid], ps=m.ps;
if (m.dr!=-1) { m.dr=-1;
digitalWrite(ps,0);
digitalWrite(ps[1],1); }
console.log("r:",Math.round(dty*100));
analogWrite(ps[0],m.sp=dty,{freq:frq});
}
function stp(mid) {
global["rfdrsdnopfsdffd".substr(6+ms[mid].dr*3,3)](mid,0);
}
function slower(e,mid) {
var d=ms[mid=mid||cmi].sp*=dds;
if (d<dmn) {
stp(mid);
} else {
global["rfdrsdnopfsdffd".substr(6+ms[mid].dr*3,3)](mid,d);
} setTimeout(more,rpt,sbt,slower);
}
function faster(e,mid) {
var s=ms[mid=mid||cmi].sp,d=(s<dmn)?dmn:((d=s*=(ddf))>dmx)?dmx:d;
global["rfdrsdnopfsdffd".substr(6+ms[mid].dr*3,3)](mid,d);
setTimeout(more,rpt,fbt,faster);
}
function more(btn,sorf) {
if ( ! digitalRead(btn)) sorf();
}
function on(on) {
on=on||on===undefined;
digitalWrite(slp,on);
digitalWrite(onInd,on);
}
function nop(){}
function hlt(){ onInit(); }
function onInit() {
setup();
on();
ms[1].dr=2;
ms[2].dr=2;
}
setTimeout(onInit,999); // while dev'g, remove before upload for save()
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
The whole chip is controlled with a negSleep signal - like a +chipSelect. Each bridge is controlled with two (2) leads: one is for direction and mode, the other is for PWM - very simple. The breakout board was very cheap. It has only minimal pins... the current control is disabled / tied to ground. A negFault is provided as output indicating signal faults, over current, over temperature, and under voltage.