
potmeter motor ffwd
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL Encoder FastPWM
main.cpp
- Committer:
- linde101
- Date:
- 2019-10-28
- Revision:
- 2:6ca30ccec353
- Parent:
- 1:b862262a9d14
File content as of revision 2:6ca30ccec353:
#include "mbed.h" #include "math.h" #include "encoder.h" #include "QEI.h" //#include "HIDScope.h" // ---- Alles met een 1(of geen getal) gaat over motor 1---- // ---- Alles met een 2 gaat over motor 2---- // ------ Hardware Interfaces ------- const PinName motor1dir = D7; //direction1 (cw,ccw) const PinName motor1PWM = D6; //speed1 const PinName motor2PWM = D5; //speed2 const PinName motor2dir = D4; //direction2 (cw,ccw) DigitalOut motor1direction(motor1dir); PwmOut motor1control(motor1PWM); PwmOut motor2control(motor2PWM); DigitalOut motor2direction(motor2dir); const PinName button1name = D10; const PinName pot1name = A0; const PinName button2name = D11; const PinName pot2name = A1; InterruptIn button1(button1name); //had ook direct gekund maar he AnalogIn potMeterIn1(pot1name); InterruptIn button2(button2name); AnalogIn potMeterIn2(pot2name); QEI Encoder1(D13,D12,NC,64,QEI::X4_ENCODING); //64 = ..., x4 encoding because ... QEI Encoder2(D9,D8,NC,64,QEI::X4_ENCODING); // ------- Objects used ------- // Ticker which controls the mother every 1/100 of a second. Ticker controlTicker; Ticker debugTicker; Serial pc(USBTX, USBRX); //HIDScope scope(2); //fuck you hidscope we're not using you! // ------- Constants const float motorGain = 8f; //just to be sure, niet te veel input geven tegen windup (old motor, suboptimal perfomance) const float maxVelocity = 8f; //radians per second const bool clockwise = true; const float rad_count = 0.0007479; // 2pi/8400; const float pi = 3.1415926; // ------ variables volatile bool direction1 = clockwise; volatile bool direction2 = clockwise; // ------ functions float getReferenceVelocity() { // Returns reference velocity in rad/s. return maxVelocity * potMeterIn1 ; } float getReferenceVelocity2() { // Returns reference velocity in rad/s. return maxVelocity * potMeterIn2; } void setMotor1(float motorValue1) { // Given motorValue1<=1, writes the velocity to the pwm control. // MotorValues outside range are truncated to within range. motor1control.write(fabs(motorValue1) > 1 ? 1 : fabs(motorValue1)); } void setMotor2(float motorValue2) { // Given motorValue2<=1, writes the velocity to the pwm control. // MotorValues outside range are truncated to within range. motor2control.write(fabs(motorValue2) > 1 ? 1 : fabs(motorValue2)); } float feedForwardControl(float referenceVelocity) { // very simple linear feed-forward control // returns motorValue return referenceVelocity / motorGain; } float feedForwardControl2(float referenceVelocity2) { // very simple linear feed-forward control // returns motorValue return referenceVelocity2 / motorGain; } void measureAndControl(void) { // This function measures the potmeter position, extracts a // reference velocity from it, and controls the motor with // a simple FeedForward controller. Call this from a Ticker. float referenceVelocity = getReferenceVelocity(); float motorValue1 = feedForwardControl(referenceVelocity); setMotor1(motorValue1); float referenceVelocity2 = getReferenceVelocity2(); float motorValue2 = feedForwardControl2(referenceVelocity2); setMotor2(motorValue2); } void onButtonPress() { // reverses the direction motor1direction.write(direction1 = !direction1); pc.printf("direction: %s\r\n\n", direction1 ? "clockwise" : "counter clockwise"); } void onButtonPress2() { // reverses the direction motor2direction.write(direction2 = !direction2); pc.printf("direction: %s\r\n\n", direction2 ? "clockwise" : "counter clockwise"); } float Encoding() { // Encoding is necessary for the computations of the joint angles and // velocities of the arm given certain linear velocities. double counts1 = Encoder1.getPulses(); double rad_m1 = (rad_count * (double)counts1) + (1.0f*pi/3.0f); return rad_m1; } float Encoding2() { // Encoding is necessary for the computations of the joint angles and // velocities of the arm given certain linear velocities. double counts2 = Encoder2.getPulses(); double rad_m2 = (rad_count * (double)counts2) + (7.0f*pi/4.0f); return rad_m2; } void onDebugTick() { pc.printf("pot input1: %f\r\n", potMeterIn1.read()); pc.printf("motorValue1: %f\r\n", feedForwardControl(getReferenceVelocity())); pc.printf("radialen motor 1: %f\r\n",Encoding()); pc.printf("\n\n\n"); /* scope.set(0, potMeterIn.read()); scope.set(1, feedForwardControl(getReferenceVelocity())); scope.send(); */ pc.printf("pot input2: %f\r\n", potMeterIn2.read()); pc.printf("motorValue2: %f\r\n", feedForwardControl2(getReferenceVelocity2())); pc.printf("radialen motor 2: %f\r\n",Encoding2()); pc.printf("\n\n\n"); } int main() { pc.baud(115200); button2.fall(&onButtonPress2); controlTicker.attach(&measureAndControl, 1.0f/100.0f); debugTicker.attach(&onDebugTick, 1); button1.fall(&onButtonPress); }