Electric Locomotive control system. Touch screen driver control, includes regenerative braking, drives 4 brushless motors, displays speed MPH, system volts and power
Dependencies: BSP_DISCO_F746NG FastPWM LCD_DISCO_F746NG SD_DISCO_F746NG TS_DISCO_F746NG mbed
dro.h
- Committer:
- JonFreeman
- Date:
- 2017-11-12
- Revision:
- 0:23cc72b18e74
File content as of revision 0:23cc72b18e74:
/* Updated 12 Nov 2017 Jon Freeman 5" and 7.25" gauge Electric Locomotive Controller - ST DISCO-F746NG Uses built in display and touch screen. Display shows 'analogue' moving coil meter movements for : Locomotive speed Miles per Hour System voltage (range 20v - 90v or thereabouts) Power Watts delivered to drive motors. Touch screen has three 'buttons', these are currently unused, and are where the meter movements show. Idea is to use two for two horns, Display has 'slider' touch control. This drives the loco. Control in central position when not driving or drfting. Moving towards bottom of screen applies regenerative braking - move further down applies harder braking. Moving towards top of screen powers drive motors, move further up applies more torque (current controller implemented) Take finger off and control drifts down to central 'neutral' position. */ #define MAX_TOUCHES 6 // Touch screen can decode up to this many simultaneous finger press positions #define NEUTRAL_VAL 150 // Number of pixels #define SLIDERX 418 // slider graphic x position #define SLIDERY 2 // slider graphic y position #define SLIDERW 50 // pixel width of slider #define SLIDERH 268 // pixel height of slider const int BUTTON_RAD = (SLIDERW / 2) - 4, // radius of circular 'knob' in slider control MIN_POS = BUTTON_RAD + 5, // top of screen MAX_POS = SLIDERH - (BUTTON_RAD + 1), // bottom of screen CIRC_CTR = SLIDERX + BUTTON_RAD + 4; static const double PI = 4.0 * atan(1.0); const double LOCO_HANDBRAKE_ESCAPE_SPEED = 0.5; enum {NO_DPS, ONE_DP}; // Assign unique number to every button we may use, and keep count of total number of them enum { ENTER, SLIDER, SPEEDO_BUT, VMETER_BUT, AMETER_BUT, NUMOF_BUTTONS} ; // button names enum { STATES, INACTIVE, RUN, NEUTRAL_DRIFT, REGEN_BRAKE, PARK, HANDBRAKE_SLIPPING}; struct slide { int position; int oldpos; int state; int direction; bool recalc_run; bool handbrake_slipping; double handbrake_effort; double loco_speed; } ; struct point { int x; int y; } ; //struct rect { struct point a, b; } ; struct key { int keynum; int x; int y; bool pressed; } ; struct ky_bd { int count, slider_y; key ky[MAX_TOUCHES + 1]; bool sli; } ;