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: mbed
Fork of RT2_P3_students_G4 by
main.cpp
- Committer:
- altb
- Date:
- 2018-04-24
- Revision:
- 9:67ee46be0403
- Parent:
- 8:72f260c467ad
- Child:
- 10:85840c065e00
File content as of revision 9:67ee46be0403:
#include "mbed.h"
#include "math.h"
//------------------------------------------
#define PI 3.1415927f
//------------------------------------------
#include "EncoderCounter.h"
#include "DiffCounter.h"
#include "IIR_filter.h"
#include "LinearCharacteristics.h"
#include "PI_Cntrl.h"
#include "GPA.h"
/* Cuboid balance on one edge on Nucleo F446RE
**** IMPORTANT: use ..\Labormodelle\RT-MOD054 - Würfel\Escon_Parameter_4nucleo.edc
settings for Maxon ESCON controller (upload via ESCON Studio) ****
hardware Connections:
CN7 CN10
: :
: :
.. ..
.. .. 15.
.. AOUT i_des on (PA_5)o.
.. ..
.. ..
.. ENC CH A o.
o. GND .. 10.
o. ENC CH B ..
.. ..
.. ..
.o AIN acx (PA_0) ..
.o AIN acy (PA_1) .. 5.
.o AIN Gyro(PA_4) .o Analog GND
.. ..
.. ..
.. .. 1.
----------------------------
CN7 CN10
*/
Serial pc(SERIAL_TX, SERIAL_RX); // serial connection via USB - programmer
InterruptIn button(USER_BUTTON); // User Button, short presses: reduce speed, long presses: increase speed
AnalogIn ax(PA_0); // Analog IN (acc x) on PA_0
AnalogIn ay(PA_1); // Analog IN (acc y) on PA_1
AnalogIn gz(PA_4); // Analog IN (gyr z) on PA_4
AnalogOut out(PA_5); // Analog OUT on PA_5 1.6 V -> 0A 3.2A -> 2A (see ESCON)
float out_value = 1.6f; // set voltage on 1.6 V (0 A current)
float w_soll = 10.0f; // desired velocity
float Ts = 0.002f; // sample time of main loops
int k = 0;
//------------------------------------------
// ... here define variables like gains etc.
//------------------------------------------
//LinearCharacteristics i2u(0.8f,-2.0f);
LinearCharacteristics i2u(-2.0f,2.0f,0.0f,3.2f);
//-------------DEFINE FILTERS----------------
float tau = 1.0f;
IIR_filter f_ax(tau,Ts); // filter ax signals
IIR_filter f_ay(tau,Ts); // filter ay signals
IIR_filter f_gz(tau,Ts,tau); // filter gz signals
//------------------------------------------
Ticker ControllerLoopTimer; // interrupt for control loop
EncoderCounter counter1(PB_6, PB_7); // initialize counter on PB_6 and PB_7
DiffCounter diff(0.01,Ts); // discrete differentiate, based on encoder data
//------------------------------------------
// ... here define instantiate classes
//------------------------------------------
PI_Cntrl vel_cntrl(0.5f,.05f,Ts,0.4f);
//GPA gpa1(1.0f, 200.0f, 150, 4, 400, Ts, 10.0f, 0.3f);
// GPA(t fMin, t fMax, NfexcDes, NperMin, NmeasMin, Ts, Aexc0, Aexc1)
// ... define some linear characteristics -----------------------------------------
// ----- User defined functions -----------
void updateControllers(void); // speed controller loop (via interrupt)
// ------ END User defined functions ------
//******************************************************************************
//---------- main loop -------------
//******************************************************************************
int main()
{
//attach controller loop to timer interrupt
pc.baud(2000000); // for serial comm.
counter1.reset(); // encoder reset
diff.reset(0.0f,0.0f);
ControllerLoopTimer.attach(&updateControllers, Ts); //Assume Fs = ...;
}
//******************************************************************************
//---------- control loop (called via interrupt) -------------
//******************************************************************************
void updateControllers(void){
short counts = counter1; // get counts from Encoder
float vel = diff(counts); // motor velocity
/*float torq_des = vel_cntrl(excWobble + w_soll - vel);
excWobble = gpa1(torq_des,vel);
out.write(i2u(torq_des/0.217f)); // the controller! convert torque to Amps km = 0.217 Nm/A
*/
//float phi1 = atan2(-f_ax(ax2ms2(ax.read())),f_ay(ax2ms2(ay.read()))) + PI/4.0f + f_gz(gz2om(gz.read()*3.3f));
if(++k >= 249){
k = 0;
pc.printf("Some Output: %1.5f \r\n",PI);
}
}
//******************************************************************************
//********** User functions like buttens handle etc. **************
//******************************************************************************
// pressed button
//******************************************************************************
//...
