Skip to content

Instantly share code, notes, and snippets.

@neuroprod
Created May 27, 2017 10:34
Show Gist options
  • Save neuroprod/f0dae827451fd74da729476f4b0e72df to your computer and use it in GitHub Desktop.
Save neuroprod/f0dae827451fd74da729476f4b0e72df to your computer and use it in GitHub Desktop.
Arduino brushless motor driver
//
// BCMotor.h
// RollingCube
//
// Created by Kris Temmerman on 03/10/15.
//
//
#ifndef BCMotorCube_h
#define BCMotorCube_h
#include <Arduino.h>
class BCMotorCube
{
int An;
int Ap;
int Bn;
int Bp;
int Cn;
int Cp;
int Ha;
int Hb;
int Hc;
int currentHallState;
public:
BCMotorCube(){}
int power;
bool reverse;
int speedCount;
void setPins(int _Ap,int _An,int _Bp,int _Bn,int _Cp, int _Cn ,int _Ha, int _Hb, int _Hc )
{
Ap = _Ap;
An = _An;
Bp = _Bp;
Bn = _Bn;
Cp = _Cp;
Cn = _Cn;
pinMode (Ap,OUTPUT);
pinMode (Bp,OUTPUT);
pinMode (Cp,OUTPUT);
pinMode (An,OUTPUT);
pinMode (Bn,OUTPUT);
pinMode (Cn,OUTPUT);
Ha=_Ha;
Hb=_Hb;
Hc=_Hc;
pinMode(Ha, INPUT);
pinMode(Hb, INPUT);
pinMode(Hc, INPUT);
reverse =false;
currentHallState = -1;
speedCount =0;
power =0;
}
int getSpeed()
{
int s =speedCount;
speedCount =0;
return s;
}
void setPower(int _power)
{
power = _power;
currentHallState = -1;
if(power==0)
{
analogWrite (Bn ,0);
analogWrite (An ,0);
analogWrite (Cn ,0);
digitalWrite (Ap ,HIGH);
digitalWrite (Cp ,HIGH);
digitalWrite (Bp ,HIGH);
}
}
void testHall(String motor)
{
int hallState =getHallState();
if( hallState!= currentHallState )
{
Serial.print(motor+ ": ");
Serial.println(hallState);
currentHallState =hallState;
}
}
void update()
{
if(power==0)return;
int hallState =getHallState();
if( hallState!= currentHallState )
{
if(reverse)
{
if(hallState<currentHallState) speedCount--;
int s = hallState-3;
if(s<0)s+=6;
setloopState(s);
}
else
{
if(hallState>currentHallState) speedCount++;
setloopState(hallState);
}
currentHallState =hallState;
}
}
int getHallState( )
{
bool vHa =digitalRead(Ha);
bool vHb =digitalRead(Hb);
bool vHc =digitalRead(Hc);
int hallState;
if(vHa && vHb ){hallState=1;}
else if(vHa && vHc ){hallState=5;}
else if(vHb && vHc ){hallState=3;}
else if(vHa ){hallState=0;}
else if(vHb ){hallState=2;}
else if(vHc ){hallState=4;}
return hallState;
}
void setloopState(int loopState)
{
switch (loopState)
{
case 0:
analogWrite (Bn ,0);
analogWrite (An ,0);
digitalWrite (Cp ,HIGH);
digitalWrite (Bp ,HIGH);
//Ap && Cn open
digitalWrite (Ap ,LOW);
analogWrite (Cn ,power);
break;
case 1:
digitalWrite (Bp ,HIGH);
digitalWrite (Cp ,HIGH);
analogWrite (An ,0);
analogWrite (Cn ,0);
//Ap && Bn open
digitalWrite (Ap ,LOW);
analogWrite (Bn ,power);
break;
case 2:
analogWrite (Cn ,0);
analogWrite (An ,0);
digitalWrite (Bp ,HIGH);
digitalWrite (Ap ,HIGH);
//Cp && Bn open
digitalWrite (Cp ,LOW);
analogWrite (Bn ,power);
break;
case 3:
digitalWrite (Bp ,HIGH);
digitalWrite (Ap ,HIGH);
analogWrite (Cn ,0);
analogWrite (Bn ,0);
//Cp && An open
digitalWrite (Cp ,LOW);
analogWrite (An ,power);
break;
case 4:
analogWrite (Cn ,0);
analogWrite (Bn ,0);
digitalWrite (Ap ,HIGH);
digitalWrite (Cp ,HIGH);
//Bp && An open
digitalWrite (Bp ,LOW);
analogWrite (An ,power);
break;
case 5:
digitalWrite (Ap ,HIGH);
digitalWrite (Cp ,HIGH);
analogWrite (Bn ,0);
analogWrite (An ,0);
//Bp && Cn open
digitalWrite (Bp ,LOW);
analogWrite (Cn ,power);
break;
default:
break;
}
}
};
#endif /* BCMotorCube_h */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment