DSHOT150 algorithm using digital IO pins on the LPC-1768

Dependents:   DSHOT

Revision:
0:230008e7b5c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DSHOT150.cpp	Sat Apr 27 21:51:38 2019 +0000
@@ -0,0 +1,87 @@
+#include "DSHOT150.h"
+#include "mbed.h"
+DSHOT150::DSHOT150(PinName pin) : _pin(pin)
+{
+    _pin = 0;
+    tel = 0;
+}
+void DSHOT150::write_zero()
+{
+    int i = 0;
+    while (i<19) {
+        _pin.write(1);
+        i++;
+    }
+    while (i<51) {
+        _pin.write(0);
+        i++;
+    }
+}
+void DSHOT150::write_one()
+{
+    int i = 0;
+    while (i<40) {
+        _pin.write(1);
+        i++;
+    }
+    while (i<51) {
+        _pin.write(0);
+        i++;
+    }
+}
+void DSHOT150::check_sum(unsigned int v)
+{
+    v = v<<1;
+    v = v|tel;
+    uint8_t cs;
+    for( int i = 0; i < 3; ++i){
+        cs ^= v;
+        v>>=4;
+    }
+    cs&=0xF;
+    packet[15] = cs&0x1;
+    packet[14] = cs&0x2;
+    packet[13] = cs&0x4;
+    packet[12] = cs&0x8;
+}
+void DSHOT150::get_tel(bool v)
+{
+    tel = v == true? 1 : 0;
+}
+void DSHOT150::send_packet()
+{
+    for(int j = 0; j < 1000; ++j) {
+        for(int i = 0; i < 16; ++i) {
+            if(packet[i])
+                write_one();
+            else
+                write_zero();
+        }
+        wait_us(500);
+    }
+}
+void DSHOT150::arm(){
+    throttle(0.25);
+    throttle(0);
+}
+void DSHOT150::throttle(float speed)
+{
+    unsigned int val;
+    speed = speed > 1 ? 1 : speed; //Bound checking and restricitng of the input
+    speed = speed < 0 ? 0 : speed; //Anything below 0 is converted to zero
+                                   //Anything above 1 is converted to one 
+                                   
+    val = (unsigned int)(speed * 2000); //Scale the throttle value. 0 - 48 are reserved for the motor
+    val +=48;                           //Throttle of zero starts at 48
+    
+    check_sum(val); //Calculate the checksum and insert it into the packet
+    
+    for(int i = 10; i >= 0; --i) {  //Insert the throttle bits into the packet
+        packet[i] = val&0x1;
+        val = val>>1;
+    }
+    
+    packet[11] = tel;   //Set the telemetry bit in the packet
+    
+    send_packet();
+}
\ No newline at end of file