Firmware for MC33926 evaluation on KL25Z-based EVMB

Dependencies:   USBDevice mbed

Fork of Brushed_DC_Motor_Control_MC34931_MC33931 by NXP

Committer:
nxf42866
Date:
Mon Jul 09 17:53:48 2018 +0000
Revision:
2:d98eb31a4b69
Parent:
0:f2f48fcea638
New firmware for evaluation of MC33926  on KL25Z-based EVB

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pnandy 0:f2f48fcea638 1 #include "mbed.h"
pnandy 0:f2f48fcea638 2 #include "USBHID.h"
pnandy 0:f2f48fcea638 3
pnandy 0:f2f48fcea638 4 // We declare a USBHID device.
pnandy 0:f2f48fcea638 5 // HID In/Out Reports are 64 Bytes long
pnandy 0:f2f48fcea638 6 // Vendor ID (VID): 0x15A2
pnandy 0:f2f48fcea638 7 // Product ID (PID): 0x0138
pnandy 0:f2f48fcea638 8 // Serial Number: 0x0001
pnandy 0:f2f48fcea638 9 USBHID hid(64, 64, 0x15A2, 0x0138, 0x0001, true);
pnandy 0:f2f48fcea638 10
pnandy 0:f2f48fcea638 11 //Setup Digital Outputs for the LEDs on the FRDM
pnandy 0:f2f48fcea638 12 //PwmOut red_led(LED1);
pnandy 0:f2f48fcea638 13 //DigitalOut green_led(LED2);
pnandy 0:f2f48fcea638 14 //DigitalOut blue_led(LED3);
pnandy 0:f2f48fcea638 15
pnandy 0:f2f48fcea638 16 //Setup PWM and Digital Outputs from FRDM-KL25Z to FRDM-17510
nxf42866 2:d98eb31a4b69 17 PwmOut IN1(PTA5); // Pin IN1 input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 18 PwmOut IN2(PTC8); // Pin IN2 input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 19 DigitalOut EN(PTE0); // Pin EN input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 20 DigitalOut DIS1(PTA2); // Pin D1 input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 21 DigitalOut D2B(PTD5); // Pin D2B input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 22 DigitalOut SLEW(PTA13); // Pin Slew input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 23 DigitalOut INV(PTD0); // Pin INV input to MC33926 (FRDM PIN Name)
nxf42866 2:d98eb31a4b69 24 DigitalIn SFB(PTB3); // Pin SF_B output from MC33926 to FRDM-KL25Z
nxf42866 2:d98eb31a4b69 25 AnalogIn CFB(PTB0); // Pin FB output from MC33926 to FRDM-KL25Z
pnandy 0:f2f48fcea638 26 //DigitalOut READY(PTC7); // Pin READY input to Motor Control Board (FRDM PIN Name)
pnandy 0:f2f48fcea638 27
pnandy 0:f2f48fcea638 28 //Variables
pnandy 0:f2f48fcea638 29 int pwm_freq_lo;
pnandy 0:f2f48fcea638 30 int pwm_freq_hi;
pnandy 0:f2f48fcea638 31 int frequencyHz = 500;
pnandy 0:f2f48fcea638 32 int runstop = 0;
pnandy 0:f2f48fcea638 33 int direction = 1;
nxf42866 2:d98eb31a4b69 34 int braking; // needs to be initialized?
pnandy 0:f2f48fcea638 35 int dutycycle = 75;
pnandy 0:f2f48fcea638 36 int newDataFlag = 0;
pnandy 0:f2f48fcea638 37 int status = 0;
pnandy 0:f2f48fcea638 38 uint16_t CurrFB;
pnandy 0:f2f48fcea638 39 uint16_t CFBArray[101];
pnandy 0:f2f48fcea638 40 uint32_t CFBTotal;
pnandy 0:f2f48fcea638 41 uint16_t CFBAvg;
pnandy 0:f2f48fcea638 42 uint16_t CFBtemp;
pnandy 0:f2f48fcea638 43
pnandy 0:f2f48fcea638 44 //storage for send and receive data
pnandy 0:f2f48fcea638 45 HID_REPORT send_report;
pnandy 0:f2f48fcea638 46 HID_REPORT recv_report;
pnandy 0:f2f48fcea638 47
pnandy 0:f2f48fcea638 48 bool initflag = true;
pnandy 0:f2f48fcea638 49
pnandy 0:f2f48fcea638 50 // USB COMMANDS
pnandy 0:f2f48fcea638 51 // These are sent from the PC
nxf42866 2:d98eb31a4b69 52 #define WRITE_LED 0x20
nxf42866 2:d98eb31a4b69 53 #define WRITE_GEN_EN 0x40 // what is this? What should the GUI kickoff here?
pnandy 0:f2f48fcea638 54 #define WRITE_DUTY_CYCLE 0x50
pnandy 0:f2f48fcea638 55 #define WRITE_PWM_FREQ 0x60
pnandy 0:f2f48fcea638 56 #define WRITE_RUN_STOP 0x70
pnandy 0:f2f48fcea638 57 #define WRITE_DIRECTION 0x71
pnandy 0:f2f48fcea638 58 #define WRITE_BRAKING 0x90
nxf42866 2:d98eb31a4b69 59 #define WRITE_RESET 0xA0 // what is this? What should the GUI kickoff here?
pnandy 0:f2f48fcea638 60 #define WRITE_D1 0xB1
nxf42866 2:d98eb31a4b69 61 #define WRITE_EN 0xC1
nxf42866 2:d98eb31a4b69 62 #define WRITE_D2B 0xD5
nxf42866 2:d98eb31a4b69 63 #define WRITE_SLEW 0xE5
nxf42866 2:d98eb31a4b69 64 #define WRITE_INV 0xF5
pnandy 0:f2f48fcea638 65
pnandy 0:f2f48fcea638 66 #define scaleFactor 0.11868
pnandy 0:f2f48fcea638 67
pnandy 0:f2f48fcea638 68 // LOGICAL CONSTANTS
pnandy 0:f2f48fcea638 69 #define OFF 0x00
pnandy 0:f2f48fcea638 70 #define ON 0x01
pnandy 0:f2f48fcea638 71
pnandy 0:f2f48fcea638 72
pnandy 0:f2f48fcea638 73 int main()
pnandy 0:f2f48fcea638 74 {
pnandy 0:f2f48fcea638 75 send_report.length = 64;
pnandy 0:f2f48fcea638 76 recv_report.length = 64;
pnandy 0:f2f48fcea638 77
pnandy 0:f2f48fcea638 78
pnandy 0:f2f48fcea638 79 while(1)
pnandy 0:f2f48fcea638 80 {
pnandy 0:f2f48fcea638 81 //try to read a msg
pnandy 0:f2f48fcea638 82 if(hid.readNB(&recv_report))
pnandy 0:f2f48fcea638 83 {
pnandy 0:f2f48fcea638 84 switch(recv_report.data[0]) //byte 0 of recv_report.data is command
pnandy 0:f2f48fcea638 85 {
pnandy 0:f2f48fcea638 86 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:f2f48fcea638 87 // COMMAND PARSER
pnandy 0:f2f48fcea638 88 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:f2f48fcea638 89 ////////
pnandy 0:f2f48fcea638 90 case WRITE_LED:
pnandy 0:f2f48fcea638 91 break;
pnandy 0:f2f48fcea638 92 ////////
pnandy 0:f2f48fcea638 93
pnandy 0:f2f48fcea638 94 ////////
pnandy 0:f2f48fcea638 95 case WRITE_DUTY_CYCLE:
pnandy 0:f2f48fcea638 96 dutycycle = recv_report.data[1];
pnandy 0:f2f48fcea638 97 newDataFlag = 1;
pnandy 0:f2f48fcea638 98 break;
pnandy 0:f2f48fcea638 99 ////////
pnandy 0:f2f48fcea638 100 case WRITE_PWM_FREQ: //PWM frequency can be larger than 1 byte
pnandy 0:f2f48fcea638 101 pwm_freq_lo = recv_report.data[1]; //so we have to re-assemble the number
pnandy 0:f2f48fcea638 102 pwm_freq_hi = recv_report.data[2] * 100;
pnandy 0:f2f48fcea638 103 frequencyHz = pwm_freq_lo + pwm_freq_hi;
pnandy 0:f2f48fcea638 104 newDataFlag = 1;
pnandy 0:f2f48fcea638 105 break;
pnandy 0:f2f48fcea638 106 ////////
pnandy 0:f2f48fcea638 107 case WRITE_RUN_STOP:
pnandy 0:f2f48fcea638 108 newDataFlag = 1;
pnandy 0:f2f48fcea638 109 if(recv_report.data[1] != 0)
pnandy 0:f2f48fcea638 110 {
pnandy 0:f2f48fcea638 111 runstop = 1;
pnandy 0:f2f48fcea638 112 }
pnandy 0:f2f48fcea638 113 else
pnandy 0:f2f48fcea638 114 {
pnandy 0:f2f48fcea638 115 runstop = 0;
pnandy 0:f2f48fcea638 116 }
pnandy 0:f2f48fcea638 117 break;
pnandy 0:f2f48fcea638 118
pnandy 0:f2f48fcea638 119 ////////
pnandy 0:f2f48fcea638 120 case WRITE_DIRECTION:
pnandy 0:f2f48fcea638 121 newDataFlag = 1;
nxf42866 2:d98eb31a4b69 122 if(recv_report.data[1] == 1) // used to be != 0
pnandy 0:f2f48fcea638 123 {
nxf42866 2:d98eb31a4b69 124 direction = 1; // corrected allocation for FWD
nxf42866 2:d98eb31a4b69 125 //direction = 0; // corrected allocation for REV
pnandy 0:f2f48fcea638 126 }
pnandy 0:f2f48fcea638 127 else
pnandy 0:f2f48fcea638 128 {
nxf42866 2:d98eb31a4b69 129 direction = 0; // corrected allocation for REV
nxf42866 2:d98eb31a4b69 130 //direction = 1; // corrected allocation for FWD
pnandy 0:f2f48fcea638 131 }
pnandy 0:f2f48fcea638 132 break;
pnandy 0:f2f48fcea638 133 ////////
pnandy 0:f2f48fcea638 134 case WRITE_BRAKING:
pnandy 0:f2f48fcea638 135 newDataFlag = 1;
nxf42866 2:d98eb31a4b69 136 if(recv_report.data[1] != 0) // used to be == 1
pnandy 0:f2f48fcea638 137 {
nxf42866 2:d98eb31a4b69 138 braking = 1; // this is HS recirc
pnandy 0:f2f48fcea638 139 }
pnandy 0:f2f48fcea638 140 else
pnandy 0:f2f48fcea638 141 {
nxf42866 2:d98eb31a4b69 142 braking = 0; // this is LS recirc
pnandy 0:f2f48fcea638 143 }
pnandy 0:f2f48fcea638 144 break;
pnandy 0:f2f48fcea638 145 ////////
pnandy 0:f2f48fcea638 146 case WRITE_D1:
pnandy 0:f2f48fcea638 147 newDataFlag = 1;
pnandy 0:f2f48fcea638 148 if(recv_report.data[1] == 1)
pnandy 0:f2f48fcea638 149 {
nxf42866 2:d98eb31a4b69 150 DIS1 = 1; // logic hi will disable the part
pnandy 0:f2f48fcea638 151 }
pnandy 0:f2f48fcea638 152 else
pnandy 0:f2f48fcea638 153 {
nxf42866 2:d98eb31a4b69 154 DIS1 = 0; // logic lo will enable the part
nxf42866 2:d98eb31a4b69 155 }
nxf42866 2:d98eb31a4b69 156 break;
nxf42866 2:d98eb31a4b69 157 ////////
nxf42866 2:d98eb31a4b69 158 case WRITE_EN:
nxf42866 2:d98eb31a4b69 159 newDataFlag = 1;
nxf42866 2:d98eb31a4b69 160 if(recv_report.data[1] == 1)
nxf42866 2:d98eb31a4b69 161 {
nxf42866 2:d98eb31a4b69 162 //EN = 0; // this is enable case
nxf42866 2:d98eb31a4b69 163 EN = 1; // align with the signal being sent from GUI
nxf42866 2:d98eb31a4b69 164 }
nxf42866 2:d98eb31a4b69 165 else
nxf42866 2:d98eb31a4b69 166 {
nxf42866 2:d98eb31a4b69 167 //EN = 1; // this is disable case
nxf42866 2:d98eb31a4b69 168 EN = 0; // align with signal being sent from GUI
pnandy 0:f2f48fcea638 169 }
pnandy 0:f2f48fcea638 170 break;
pnandy 0:f2f48fcea638 171 ////////
nxf42866 2:d98eb31a4b69 172 case WRITE_D2B:
nxf42866 2:d98eb31a4b69 173 newDataFlag = 1;
pnandy 0:f2f48fcea638 174 if(recv_report.data[1] == 1)
pnandy 0:f2f48fcea638 175 {
nxf42866 2:d98eb31a4b69 176 D2B = 1;
pnandy 0:f2f48fcea638 177 }
pnandy 0:f2f48fcea638 178 else
pnandy 0:f2f48fcea638 179 {
nxf42866 2:d98eb31a4b69 180 D2B = 0;
nxf42866 2:d98eb31a4b69 181 }
nxf42866 2:d98eb31a4b69 182 break;
nxf42866 2:d98eb31a4b69 183
nxf42866 2:d98eb31a4b69 184 ////////
nxf42866 2:d98eb31a4b69 185 case WRITE_SLEW:
nxf42866 2:d98eb31a4b69 186 newDataFlag = 1;
nxf42866 2:d98eb31a4b69 187 if(recv_report.data[1] == 1)
nxf42866 2:d98eb31a4b69 188 {
nxf42866 2:d98eb31a4b69 189 SLEW = 1;
nxf42866 2:d98eb31a4b69 190 }
nxf42866 2:d98eb31a4b69 191 else
nxf42866 2:d98eb31a4b69 192 {
nxf42866 2:d98eb31a4b69 193 SLEW = 0;
pnandy 0:f2f48fcea638 194 }
nxf42866 2:d98eb31a4b69 195 break;
nxf42866 2:d98eb31a4b69 196
nxf42866 2:d98eb31a4b69 197 ////////
nxf42866 2:d98eb31a4b69 198 case WRITE_INV:
nxf42866 2:d98eb31a4b69 199 newDataFlag = 1;
nxf42866 2:d98eb31a4b69 200 if(recv_report.data[1] == 1)
nxf42866 2:d98eb31a4b69 201 {
nxf42866 2:d98eb31a4b69 202 INV = 1;
nxf42866 2:d98eb31a4b69 203 //INV = 0;
nxf42866 2:d98eb31a4b69 204 }
nxf42866 2:d98eb31a4b69 205 else
nxf42866 2:d98eb31a4b69 206 {
nxf42866 2:d98eb31a4b69 207 INV = 0;
nxf42866 2:d98eb31a4b69 208 //INV = 1;
nxf42866 2:d98eb31a4b69 209 }
nxf42866 2:d98eb31a4b69 210 break;
nxf42866 2:d98eb31a4b69 211
pnandy 0:f2f48fcea638 212
pnandy 0:f2f48fcea638 213 ////////
pnandy 0:f2f48fcea638 214 default:
pnandy 0:f2f48fcea638 215 break;
pnandy 0:f2f48fcea638 216 }// End Switch recv report data[0]
pnandy 0:f2f48fcea638 217
pnandy 0:f2f48fcea638 218 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:f2f48fcea638 219 // end command parser
pnandy 0:f2f48fcea638 220 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:f2f48fcea638 221
nxf42866 2:d98eb31a4b69 222 status = SFB;
pnandy 0:f2f48fcea638 223 send_report.data[0] = status; // Echo Command
pnandy 0:f2f48fcea638 224 send_report.data[1] = recv_report.data[1]; // Echo Subcommand 1
pnandy 0:f2f48fcea638 225 send_report.data[2] = recv_report.data[2]; // Echo Subcommand 2
pnandy 0:f2f48fcea638 226 send_report.data[3] = 0x00;
pnandy 0:f2f48fcea638 227 send_report.data[4] = 0x00;
pnandy 0:f2f48fcea638 228 send_report.data[5] = 0x00;
pnandy 0:f2f48fcea638 229 send_report.data[6] = (CFBAvg << 8) >> 8;
pnandy 0:f2f48fcea638 230 send_report.data[7] = CFBAvg >> 8;
pnandy 0:f2f48fcea638 231
pnandy 0:f2f48fcea638 232 //Send the report
pnandy 0:f2f48fcea638 233 hid.send(&send_report);
pnandy 0:f2f48fcea638 234 }// End If(hid.readNB(&recv_report))
pnandy 0:f2f48fcea638 235 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pnandy 0:f2f48fcea638 236 //End of USB message handling
pnandy 0:f2f48fcea638 237 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pnandy 0:f2f48fcea638 238
pnandy 0:f2f48fcea638 239 CurrFB = CFB.read_u16();
pnandy 0:f2f48fcea638 240 CFBArray[0] = CurrFB;
pnandy 0:f2f48fcea638 241 CFBTotal = 0;
pnandy 0:f2f48fcea638 242 int i = 0;
pnandy 0:f2f48fcea638 243 for(i=0; i<100; i++)
pnandy 0:f2f48fcea638 244 {
pnandy 0:f2f48fcea638 245 CFBTotal = CFBTotal + CFBArray[i];
pnandy 0:f2f48fcea638 246 }
pnandy 0:f2f48fcea638 247 CFBAvg = CFBTotal / 100;
pnandy 0:f2f48fcea638 248
pnandy 0:f2f48fcea638 249 for(i=100; i>=0; i--)
pnandy 0:f2f48fcea638 250 {
pnandy 0:f2f48fcea638 251
pnandy 0:f2f48fcea638 252 CFBArray[i+1] = CFBArray[i];
pnandy 0:f2f48fcea638 253 }
pnandy 0:f2f48fcea638 254
pnandy 0:f2f48fcea638 255 if(newDataFlag != 0) //GUI setting changed
pnandy 0:f2f48fcea638 256 {
pnandy 0:f2f48fcea638 257 newDataFlag = 0;
pnandy 0:f2f48fcea638 258 if(runstop != 0) //Running
pnandy 0:f2f48fcea638 259 {
pnandy 0:f2f48fcea638 260 if(direction == 0) //reverse
pnandy 0:f2f48fcea638 261 {
pnandy 0:f2f48fcea638 262 if(braking == 1) //dynamic
pnandy 0:f2f48fcea638 263 {
pnandy 0:f2f48fcea638 264 IN1.period(1/(float)frequencyHz);
nxf42866 2:d98eb31a4b69 265 //IN1 = (float)dutycycle/100.0; // this is REV + HS, inverted d
nxf42866 2:d98eb31a4b69 266 IN1 = 1.0-((float)dutycycle/100.0); // this is REV + HS
pnandy 0:f2f48fcea638 267 IN2 = 1;
pnandy 0:f2f48fcea638 268 }
pnandy 0:f2f48fcea638 269 else //coast
pnandy 0:f2f48fcea638 270 {
nxf42866 2:d98eb31a4b69 271 IN1 = 0; // this is REV + LS
pnandy 0:f2f48fcea638 272 IN2.period(1/(float)frequencyHz);
pnandy 0:f2f48fcea638 273 IN2 = (float)dutycycle/100.0;
pnandy 0:f2f48fcea638 274 }
pnandy 0:f2f48fcea638 275 }
pnandy 0:f2f48fcea638 276 else //forward
pnandy 0:f2f48fcea638 277 {
pnandy 0:f2f48fcea638 278 if(braking == 1) //dynamic
pnandy 0:f2f48fcea638 279 {
nxf42866 2:d98eb31a4b69 280 IN1 = 1;
pnandy 0:f2f48fcea638 281 IN2.period(1/(float)frequencyHz);
nxf42866 2:d98eb31a4b69 282 //IN2 = (float)dutycycle/100.0; // this is FWD + HS, inverted d
nxf42866 2:d98eb31a4b69 283 IN2 = 1.0-((float)dutycycle/100.0); // this is FWD + HS
pnandy 0:f2f48fcea638 284 }
pnandy 0:f2f48fcea638 285 else //coast
pnandy 0:f2f48fcea638 286 {
pnandy 0:f2f48fcea638 287 IN1.period(1/(float)frequencyHz);
pnandy 0:f2f48fcea638 288 IN1 = (float)dutycycle/100.0;
nxf42866 2:d98eb31a4b69 289 IN2 = 0; // FWD + LS
pnandy 0:f2f48fcea638 290 }
pnandy 0:f2f48fcea638 291 }
pnandy 0:f2f48fcea638 292 }
pnandy 0:f2f48fcea638 293 else //Stopped
pnandy 0:f2f48fcea638 294 {
pnandy 0:f2f48fcea638 295 if(braking == 1) //braking
pnandy 0:f2f48fcea638 296 {
pnandy 0:f2f48fcea638 297 IN1.period(1);
pnandy 0:f2f48fcea638 298 IN2.period(1);
pnandy 0:f2f48fcea638 299 IN1.write(1);
pnandy 0:f2f48fcea638 300 IN2.write(1);
pnandy 0:f2f48fcea638 301 }
pnandy 0:f2f48fcea638 302 else //coasting
pnandy 0:f2f48fcea638 303 {
pnandy 0:f2f48fcea638 304 IN1.period(1);
pnandy 0:f2f48fcea638 305 IN2.period(1);
pnandy 0:f2f48fcea638 306 IN1.write(0);
pnandy 0:f2f48fcea638 307 IN2.write(0);
pnandy 0:f2f48fcea638 308
pnandy 0:f2f48fcea638 309 }
pnandy 0:f2f48fcea638 310 }
pnandy 0:f2f48fcea638 311 }
pnandy 0:f2f48fcea638 312 }
pnandy 0:f2f48fcea638 313 }
nxf42866 2:d98eb31a4b69 314