Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: CURRENT_CONTROL IIR LSM9DS0 MEDIAN_FILTER PID QEI RF24 SENSOR_FUSION mbed
main.cpp
- Committer:
- adam_z
- Date:
- 2016-04-28
- Revision:
- 5:842372be775c
- Parent:
- 4:a2d38818c4e7
- Child:
- 6:5bd08053e95c
File content as of revision 5:842372be775c:
#include "mbed.h" #include "PID.h" #include "LSM9DS0.h" #include "QEI.h" #include "CURRENT_CONTROL.h" #include "SENSOR_FUSION.h" #define Ts 0.001 #define pi 3.14159 LSM9DS0 sensor(SPI_MODE, D9, D6); Serial pc(SERIAL_TX, SERIAL_RX); Ticker WIPVTimer; void WIPVTimerInterrupt(); float saturation(float input, float limit_H, float limit_L); void SensorAcquisition(float * data, float samplingTime); //MOTOR L == MOTOR 1; MOTOR R = MOTOR 2 CURRENT_CONTROL motorCur_L(PC_3, D8, A3,CURRENT_CONTROL::PWM2,400, 900.0,0.0,Ts); CURRENT_CONTROL motorCur_R(PC_2, D7, D11,CURRENT_CONTROL::PWM1,400, 900.0,0.0,Ts); QEI wheel_L(D13, D12, NC, 280, 50, Ts, QEI::X4_ENCODING); QEI wheel_R(A1, A2, NC, 280, 50, Ts, QEI::X4_ENCODING); PID balancingPD(20,0.00,0.0,Ts); LPF sensorFilter(Ts); int tim_counter = 0; float tim = 0.0; float amp = 0.3; float omega = 6.0; float curCmd_L =0.0, curCmd_R =0.0; int main() { pc.baud(250000); if( sensor.begin() != 0 ) { pc.printf("Problem starting the sensor with CS @ Pin D6.\r\n"); } else { pc.printf("Sensor with CS @ Pin D9&D6 started.\r\n"); } sensor.setGyroOffset(38,-24,-106); sensor.setAccelOffset(-793,-511,300); motorCur_L.SetParams(3.3*8/0.6, 1.050*0.163, 0.04348); motorCur_R.SetParams(3.3*8/0.6, 1.187*0.137, 0.04348); WIPVTimer.attach_us(WIPVTimerInterrupt, 1000.0); while(true) { //pc.printf("%5.4f\t", 10*pitch_angle); //pc.printf("%5.3f\n", 10*sensor.pitch*3.14159/180); //pc.printf("%5.3f\r\n", 10*curCmd_L); pc.printf("%5.3f\t", 100*curCmd_R); pc.printf("%5.3f\r\n", wheel_R.getAngularSpeed()); } } void WIPVTimerInterrupt() { if(tim_counter <100)tim_counter++; else if (tim_counter >= 100 && tim_counter <=109) { motorCur_L.currentOffset += motorCur_L.currentAnalogIn.read(); motorCur_R.currentOffset += motorCur_R.currentAnalogIn.read(); tim_counter++; if(tim_counter == 110) { motorCur_L.currentOffset = motorCur_L.currentOffset/10; motorCur_R.currentOffset = motorCur_R.currentOffset/10; } } else { /* int16_t data_array[6]; data_array[0] = sensor.readRawAccelX(); data_array[1] = sensor.readRawAccelY(); data_array[2] = sensor.readRawAccelZ(); data_array[3] = sensor.readRawGyroX(); data_array[4] = sensor.readRawGyroY(); data_array[5] = sensor.readRawGyroZ(); pc.printf("%d, ", data_array[0]); pc.printf("%d, ", data_array[1]); pc.printf("%d, ", data_array[2]); pc.printf("%d, ", data_array[3]); pc.printf("%d, ", data_array[4]); pc.printf("%d;\r\n ", data_array[5]); */ float data_array[6];//Gs and deg/s data_array[0] = sensor.readFloatAccelX(); data_array[1] = sensor.readFloatAccelY(); data_array[2] = sensor.readFloatAccelZ(); data_array[3] = sensor.readFloatGyroX(); data_array[4] = sensor.readFloatGyroY(); data_array[5] = sensor.readFloatGyroZ(); sensor.complementaryFilter(data_array,Ts); //SensorAcquisition(data_array, Ts); //*****wheel speed calculation*****// wheel_L.Calculate(); wheel_R.Calculate(); balancingPD.Compute(0.0, sensor.pitch*3.14159/180); curCmd_R = sensorFilter.filter(saturation(0.5*( -balancingPD.output + 0.002*data_array[5]),1.0, -1.0),10); //*************current control********// tim += Ts; if(tim >= 4*pi/omega)tim = 0.0; //curCmd_R = amp*sin(omega*tim); //current command //curCmd_L = 0.8; //motorCur_R.SetPWMDuty(0.75); motorCur_L.Control(-curCmd_R + 0.002*data_array[4], wheel_L.getAngularSpeed()); motorCur_R.Control(curCmd_R + 0.002*data_array[4], wheel_R.getAngularSpeed()); } } float saturation(float input, float limit_H, float limit_L) { float output; if(input >= limit_H)output = limit_H; else if (input <= limit_L)output = limit_L; else output = input; return output; } void SensorAcquisition(float * data, float samplingTime) { axm = data[0]*(-1)*9.81;//accelerometer dimension from g to m/s^2 aym = data[1]*(-1)*9.81; azm = data[2]*(-1)*9.81; u1 = data[0]*3.14159/180; //gyroscope :deg/s to rad/s u2 = data[1]*3.14159/180; u3 = data[2]*3.14159/180; if(conv_init <= 3) { axm_f_old = axm; aym_f_old = aym; azm_f_old = azm; conv_init++; } else { pitch_fusion(axm, aym,azm,u3,u2,20, samplingTime); roll_fusion(axm, aym,azm,u3,u1,20, samplingTime); x3_hat_estimat(axm,aym,azm,u2,u1,20, samplingTime); } }