Modified Motor Driver Firmware to include Flash + Thermal

Dependencies:   FastPWM3 mbed-dev-STM-lean

Revision:
57:0795d2add37e
Parent:
56:fe5056ac6740
Child:
58:32e8927fe39f
--- a/PositionSensor/PositionSensor.cpp	Thu Oct 10 15:03:12 2019 +0000
+++ b/PositionSensor/PositionSensor.cpp	Thu Nov 07 18:14:51 2019 +0000
@@ -139,6 +139,153 @@
     }
     
 
+PositionSensoriCMU::PositionSensoriCMU(int CPR, float offset, int ppairs){
+    //_CPR = CPR;
+    _CPR = CPR;
+    _ppairs = ppairs;
+    ElecOffset = offset;
+    rotations = 0;
+    spi = new SPI(PC_12, PC_11, PC_10);
+    spi->format(8, 0);                                                          // mbed v>127 breaks 16-bit spi, so transaction is broken into 2 8-bit words
+    spi->frequency(10000000);
+    
+    cs = new DigitalOut(PA_15);
+    cs->write(1);
+    readAngleCmd = 0xffff;   
+    MechOffset = offset;
+    modPosition = 0;
+    oldModPosition = 0;
+    oldVel = 0;
+    raw = 0;
+    first_sample = 0;
+    for(int i = 0; i<100; i++)              // Initial measurement is really noisy
+    {
+        cs->write(0);
+        spi->write(0xA6);
+        spi->write(0);
+        spi->write(0);
+        spi->write(0);
+        cs->write(1);
+        wait_us(100);
+    }
+
+    }
+    
+void PositionSensoriCMU::Sample(float dt){
+    //GPIOA->ODR &= ~(1 << 15);
+    //raw = spi->write(readAngleCmd);
+    //raw &= 0x3FFF;   
+    cs->write(0);
+    raw_bytes[0] = spi->write(0xA6);       // Read Register
+    raw_bytes[1] = spi->write(0);
+    raw_bytes[2] = spi->write(0);
+    raw_bytes[3] = spi->write(0);
+    cs->write(1);
+    
+    //for(int i=0; i<8; i++){printf("%d ", raw_bytes[i]);}
+    //printf("\n\r");
+    
+    raw = raw_bytes[1]<<16 | raw_bytes[2]<<8 | raw_bytes[3];
+    //raw = raw>>2;                                                             //Extract last 14 bits
+    //GPIOA->ODR |= (1 << 15);
+    int off_1 = offset_lut[raw>>7];
+    int off_2 = offset_lut[((raw>>7)+1)%128];
+    int off_interp = off_1 + ((off_2 - off_1)*(raw - ((raw>>7)<<7))>>7);        // Interpolate between lookup table entries
+    int angle = raw;// + off_interp;                                               // Correct for nonlinearity with lookup table from calibration
+    
+    if(first_sample){
+        if(angle - old_counts > _CPR/2){
+            rotations -= 1;
+            }
+        else if (angle - old_counts < -_CPR/2){
+            rotations += 1;
+            }
+    }
+    if(!first_sample){first_sample = 1;}
+    
+    old_counts = angle;
+    oldModPosition = modPosition;
+    modPosition = ((2.0f*PI * ((float) angle))/ (float)_CPR);
+    position = (2.0f*PI * ((float) angle+(_CPR*rotations)))/ (float)_CPR;
+    MechPosition = position - MechOffset;
+    float elec = ((2.0f*PI/(float)_CPR) * (float) ((_ppairs*angle)%_CPR)) + ElecOffset;
+    if(elec < 0) elec += 2.0f*PI;
+    else if(elec > 2.0f*PI) elec -= 2.0f*PI ; 
+    ElecPosition = elec;
+    
+    float vel;
+    //if(modPosition<.1f && oldModPosition>6.1f){
+
+    if((modPosition-oldModPosition) < -3.0f){
+        vel = (modPosition - oldModPosition + 2.0f*PI)/dt;
+        }
+    //else if(modPosition>6.1f && oldModPosition<0.1f){
+    else if((modPosition - oldModPosition) > 3.0f){
+        vel = (modPosition - oldModPosition - 2.0f*PI)/dt;
+        }
+    else{
+        vel = (modPosition-oldModPosition)/dt;
+    }    
+    
+    int n = 40;
+    float sum = vel;
+    for (int i = 1; i < (n); i++){
+        velVec[n - i] = velVec[n-i-1];
+        sum += velVec[n-i];
+        }
+    velVec[0] = vel;
+    MechVelocity =  sum/((float)n);
+    ElecVelocity = MechVelocity*_ppairs;
+    ElecVelocityFilt = 0.99f*ElecVelocityFilt + 0.01f*ElecVelocity;
+    }
+
+int PositionSensoriCMU::GetRawPosition(){
+    return raw;
+    }
+
+float PositionSensoriCMU::GetMechPositionFixed(){
+    return MechPosition+MechOffset;
+    }
+    
+float PositionSensoriCMU::GetMechPosition(){
+    return MechPosition;
+    }
+
+float PositionSensoriCMU::GetElecPosition(){
+    return ElecPosition;
+    }
+
+float PositionSensoriCMU::GetElecVelocity(){
+    return ElecVelocity;
+    }
+
+float PositionSensoriCMU::GetMechVelocity(){
+    return MechVelocity;
+    }
+
+void PositionSensoriCMU::ZeroPosition(){
+    rotations = 0;
+    MechOffset = 0;
+    Sample(.00025f);
+    MechOffset = GetMechPosition();
+    }
+    
+void PositionSensoriCMU::SetElecOffset(float offset){
+    ElecOffset = offset;
+    }
+void PositionSensoriCMU::SetMechOffset(float offset){
+    MechOffset = offset;
+    first_sample = 0;
+    }
+
+int PositionSensoriCMU::GetCPR(){
+    return _CPR;
+    }
+
+
+void PositionSensoriCMU::WriteLUT(int new_lut[128]){
+    memcpy(offset_lut, new_lut, sizeof(offset_lut));
+    }
 
 PositionSensorEncoder::PositionSensorEncoder(int CPR, float offset, int ppairs) {
     _ppairs = ppairs;