Završni rad NXP Cup
Dependencies: HBridgeDCMotor mbed FastPWM AutomationElements
main.cpp
- Committer:
- btomic
- Date:
- 2016-07-22
- Revision:
- 7:b881681f7ff6
- Parent:
- 6:e1e317fe8f7f
File content as of revision 7:b881681f7ff6:
#include "mbed.h" #include "FastPWM.h" #include "AutomationElements.h" DigitalIn fault(PTE20); DigitalIn sw1(PTC13); DigitalIn sw2(PTC17); AnalogIn pte23(PTE23); //bugirani analogini ulaz, zamjena PTE30 AnalogIn a_feedback(PTE30); AnalogIn b_feedback(PTE22); AnalogIn pot1(PTB3); AnalogIn pot2(PTB2); AnalogIn camera(PTD5); AnalogIn naponBaterije(PTE29); Serial pc(PTA2, PTA1); DigitalOut enable(PTE21); DigitalOut d1(PTB8); DigitalOut d2(PTB9); DigitalOut d3(PTB10); DigitalOut d4(PTB11); //DigitalOut red(PTB18); //DigitalOut green(PTB19); //DigitalOut blue(PTD1); /** DigiralOut SI(PTD7); // camera SI PwmOut cameraCLK(PTE1); **/ PwmOut servo(PTB0); FastPWM motorA(PTC3); DigitalOut motorA_grana2(PTC4); FastPWM motorB(PTC1); DigitalOut motorB_grana2(PTC2); FastPWM test_w(PTA12); Ticker ticker; Ticker tikref; //Ticker cameraSI; float u_Ri_a = 0, u_Ri_b = 0, n_ref=0, Ubat = 0, R_au = 1.067, L_au = 218e-6, K = 2.54e-3, pot2_skalirani = 0; float u_i_a2 = 0, u_i_b2 = 0, w_a = 0, w_b = 0, N = 7.46, n_a = 0, n_b = 0, delay = 0.13, u_Rw_a = 0, u_Rw_b =0; double u_i_a = 0, u_i_b = 0, e_a = 0, e_b = 0; double T_d = 1e-3; PI PI_a (0.04, 0.001, T_d); PI PI_b (0.04, 0.001, T_d); PI RegulatorBrzine_a( 0.01, 0.01, T_d); PI RegulatorBrzine_b( 0.01, 0.01, T_d); Timer timer; void tick(){ timer.start(); Ubat = naponBaterije * 3.3 * (57.0/10.0); timer.stop(); test_w.pulsewidth_us(timer.read_us()); timer.reset(); if ((u_Ri_a - delay) <= 0) u_i_a = 0; else u_i_a = 375.0/220.0*(3.3 * a_feedback)/(u_Ri_a - delay); if ((u_Ri_b - delay) <= 0) u_i_b = 0; else u_i_b = 375.0/220.0*(3.3 * b_feedback)/(u_Ri_b - delay); //pot2_skalirani = 100 + 1900* pot2; //x = pot2_skalirani; //x = 3000 * pot2; n_ref = 1000; e_a = Ubat*(u_Ri_a - delay) - R_au*u_i_a - L_au * ((u_i_a - u_i_a2)/T_d); w_a = e_a / K; n_a = w_a * (30/3.14159) / N; u_i_a2 = u_i_a; e_b = Ubat*(u_Ri_b - delay) - R_au*u_i_b - L_au * ((u_i_b - u_i_b2)/T_d); w_b = e_b / K; n_b = w_b * (30/3.14159) / N; u_i_b2 = u_i_b; RegulatorBrzine_a.in(n_ref - n_a); RegulatorBrzine_b.in(n_ref - n_b); u_Rw_a = RegulatorBrzine_a.out(); u_Rw_b = RegulatorBrzine_b.out(); PI_a.in(u_Rw_a - u_i_a); PI_b.in(u_Rw_b - u_i_b); u_Ri_a = PI_a.out(); u_Ri_b = PI_b.out(); motorA.pulsewidth(100e-6*u_Ri_a); motorB.pulsewidth(100e-6*u_Ri_b); } /** void camSI(){ cameraCLK.pulsewidth(1.0/100e3 * 0.5); if (cameraCLK = 1) SI = 1 } **/ void steerServo(float angleDegrees){ float minPw = 0.0005, maxPw = 0.0025, minAng = -90, maxAng = 90, pulse = 0; if (angleDegrees < -29 ) angleDegrees = -29; if (angleDegrees > 30 ) angleDegrees = 30; pulse = minPw + ((maxPw - minPw)/(maxAng - minAng))*(angleDegrees - minAng); servo.pulsewidth(pulse); } int main() { float PWmin=-90, PWmax=90, angleDegrees = 0; // cameraCLK.period(1.0/100e3); // frekvencija 100 kHz //servo.period(1.0/50); //steerServo(angleDegrees); PI_a.setOutputLimits (0, 1); PI_b.setOutputLimits (0, 1); RegulatorBrzine_a.setOutputLimits (0,3); RegulatorBrzine_b.setOutputLimits(0,3); motorA.period_us(100); motorB.period_us(100); test_w.period_us(10000); wait(3); enable = 1; motorB_grana2 = 0; motorA_grana2 = 0; ticker.attach(&tick, T_d); //tikref.attach(&changeRef,1); // cameraSI.attach(&camSI, 0.00258); float analogprint, analogprintb; while(1){ if(sw1 == 1) enable = 0; if(sw2 == 1) enable = 1; if(fault == 1) { d1=1; d3=0; } else { d3=1; d1=0; } /** angleDegrees = PWmin + (PWmax - PWmin) * pot1; steerServo(angleDegrees); **/ wait(1); analogprint = a_feedback; analogprintb = b_feedback; pc.printf("a_feedback: %f b_feedback: %f \n\r",analogprint, analogprintb); } }