Firmware for MC33926 evaluation on KL25Z-based EVB. This works with a Graphical User Interface (GUI) available on NXP.com to control a brushed DC motor using FRDM-33926ESEVM or FRDM-33926PNBEVM. The code enables control of the PWM frequency, duty cycle, enable/disable controls, invert, slew rate control, real-time current monitoring, and includes status flag pin monitoring for undervoltage, short circuit and over-temperature events.
Fork of Brushed_DC_Motor_Control_MC33926 by
Revision 3:d7fd752817e1, committed 2018-07-09
- Comitter:
- nxf42866
- Date:
- Mon Jul 09 19:23:33 2018 +0000
- Parent:
- 2:d98eb31a4b69
- Commit message:
- Added comments describing command functionality. Removed copy of main.cpp
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
main_copy.cpp | Show diff for this revision Revisions of this file |
diff -r d98eb31a4b69 -r d7fd752817e1 main.cpp --- a/main.cpp Mon Jul 09 17:53:48 2018 +0000 +++ b/main.cpp Mon Jul 09 19:23:33 2018 +0000 @@ -8,7 +8,7 @@ // Serial Number: 0x0001 USBHID hid(64, 64, 0x15A2, 0x0138, 0x0001, true); -//Setup Digital Outputs for the LEDs on the FRDM +// Setup Digital Outputs for the LEDs on the FRDM //PwmOut red_led(LED1); //DigitalOut green_led(LED2); //DigitalOut blue_led(LED3); @@ -25,13 +25,13 @@ AnalogIn CFB(PTB0); // Pin FB output from MC33926 to FRDM-KL25Z //DigitalOut READY(PTC7); // Pin READY input to Motor Control Board (FRDM PIN Name) -//Variables +// Variables int pwm_freq_lo; int pwm_freq_hi; int frequencyHz = 500; int runstop = 0; int direction = 1; -int braking; // needs to be initialized? +int braking; // does not require initialization int dutycycle = 75; int newDataFlag = 0; int status = 0; @@ -41,7 +41,7 @@ uint16_t CFBAvg; uint16_t CFBtemp; -//storage for send and receive data +// Storage for send and receive data HID_REPORT send_report; HID_REPORT recv_report; @@ -50,13 +50,13 @@ // USB COMMANDS // These are sent from the PC #define WRITE_LED 0x20 -#define WRITE_GEN_EN 0x40 // what is this? What should the GUI kickoff here? +#define WRITE_GEN_EN 0x40 #define WRITE_DUTY_CYCLE 0x50 #define WRITE_PWM_FREQ 0x60 #define WRITE_RUN_STOP 0x70 #define WRITE_DIRECTION 0x71 #define WRITE_BRAKING 0x90 -#define WRITE_RESET 0xA0 // what is this? What should the GUI kickoff here? +#define WRITE_RESET 0xA0 #define WRITE_D1 0xB1 #define WRITE_EN 0xC1 #define WRITE_D2B 0xD5 @@ -108,38 +108,38 @@ newDataFlag = 1; if(recv_report.data[1] != 0) { - runstop = 1; + runstop = 1; // outputs on, run motor } else { - runstop = 0; + runstop = 0; // outputs off, brake motor } break; //////// case WRITE_DIRECTION: newDataFlag = 1; - if(recv_report.data[1] == 1) // used to be != 0 + if(recv_report.data[1] == 1) { direction = 1; // corrected allocation for FWD - //direction = 0; // corrected allocation for REV + //direction = 0; } else { direction = 0; // corrected allocation for REV - //direction = 1; // corrected allocation for FWD + //direction = 1; } break; //////// case WRITE_BRAKING: newDataFlag = 1; - if(recv_report.data[1] != 0) // used to be == 1 + if(recv_report.data[1] != 0) { - braking = 1; // this is HS recirc + braking = 1; // this is HS recirc } else { - braking = 0; // this is LS recirc + braking = 0; // this is LS recirc } break; //////// @@ -147,11 +147,11 @@ newDataFlag = 1; if(recv_report.data[1] == 1) { - DIS1 = 1; // logic hi will disable the part + DIS1 = 1; // logic hi disables the part } else { - DIS1 = 0; // logic lo will enable the part + DIS1 = 0; // logic lo enables the part } break; //////// @@ -159,13 +159,13 @@ newDataFlag = 1; if(recv_report.data[1] == 1) { - //EN = 0; // this is enable case - EN = 1; // align with the signal being sent from GUI + //EN = 0; + EN = 1; // logic hi enables the part } else { - //EN = 1; // this is disable case - EN = 0; // align with signal being sent from GUI + //EN = 1; + EN = 0; // logic lo disable the part } break; //////// @@ -173,11 +173,11 @@ newDataFlag = 1; if(recv_report.data[1] == 1) { - D2B = 1; + D2B = 1; // logic hi enables the part } else { - D2B = 0; + D2B = 0; // logic lo disables the part } break; @@ -186,11 +186,11 @@ newDataFlag = 1; if(recv_report.data[1] == 1) { - SLEW = 1; + SLEW = 1; // logic hi prompts FAST slew } else { - SLEW = 0; + SLEW = 0; // logic lo prompts SLOW slew } break; @@ -199,12 +199,12 @@ newDataFlag = 1; if(recv_report.data[1] == 1) { - INV = 1; + INV = 1; // logic hi inverts operation //INV = 0; } else { - INV = 0; + INV = 0; // logic lo does not invert operation //INV = 1; } break; @@ -262,15 +262,15 @@ if(braking == 1) //dynamic { IN1.period(1/(float)frequencyHz); - //IN1 = (float)dutycycle/100.0; // this is REV + HS, inverted d - IN1 = 1.0-((float)dutycycle/100.0); // this is REV + HS + //IN1 = (float)dutycycle/100.0; // REV + HS, inverted d + IN1 = 1.0-((float)dutycycle/100.0); // REV + HS IN2 = 1; } else //coast { - IN1 = 0; // this is REV + LS + IN1 = 0; IN2.period(1/(float)frequencyHz); - IN2 = (float)dutycycle/100.0; + IN2 = (float)dutycycle/100.0; // REV + LS } } else //forward @@ -279,8 +279,8 @@ { IN1 = 1; IN2.period(1/(float)frequencyHz); - //IN2 = (float)dutycycle/100.0; // this is FWD + HS, inverted d - IN2 = 1.0-((float)dutycycle/100.0); // this is FWD + HS + //IN2 = (float)dutycycle/100.0; // FWD + HS, inverted d + IN2 = 1.0-((float)dutycycle/100.0); // FWD + HS } else //coast { @@ -290,16 +290,16 @@ } } } - else //Stopped + else //stopped { - if(braking == 1) //braking + if(braking == 1) // braking, HS recirc { IN1.period(1); IN2.period(1); IN1.write(1); IN2.write(1); } - else //coasting + else // coasting, LS recirc { IN1.period(1); IN2.period(1); @@ -311,4 +311,3 @@ } } } -
diff -r d98eb31a4b69 -r d7fd752817e1 main_copy.cpp --- a/main_copy.cpp Mon Jul 09 17:53:48 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,314 +0,0 @@ -#include "mbed.h" -#include "USBHID.h" - -// We declare a USBHID device. -// HID In/Out Reports are 64 Bytes long -// Vendor ID (VID): 0x15A2 -// Product ID (PID): 0x0138 -// Serial Number: 0x0001 -USBHID hid(64, 64, 0x15A2, 0x0138, 0x0001, true); - -//Setup Digital Outputs for the LEDs on the FRDM -//PwmOut red_led(LED1); -//DigitalOut green_led(LED2); -//DigitalOut blue_led(LED3); - -//Setup PWM and Digital Outputs from FRDM-KL25Z to FRDM-17510 -PwmOut IN1(PTA5); // Pin IN1 input to MC33926 (FRDM PIN Name) -PwmOut IN2(PTC8); // Pin IN2 input to MC33926 (FRDM PIN Name) -DigitalOut EN(PTE0); // Pin EN input to MC33926 (FRDM PIN Name) -DigitalOut DIS1(PTA2); // Pin D1 input to MC33926 (FRDM PIN Name) -DigitalOut D2B(PTD5); // Pin D2B input to MC33926 (FRDM PIN Name) -DigitalOut SLEW(PTA13); // Pin Slew input to MC33926 (FRDM PIN Name) -DigitalOut INV(PTD0); // Pin INV input to MC33926 (FRDM PIN Name) -DigitalIn SFB(PTB3); // Pin SF_B output from MC33926 to FRDM-KL25Z -AnalogIn CFB(PTB0); // Pin FB output from MC33926 to FRDM-KL25Z -//DigitalOut READY(PTC7); // Pin READY input to Motor Control Board (FRDM PIN Name) - -//Variables -int pwm_freq_lo; -int pwm_freq_hi; -int frequencyHz = 500; -int runstop = 0; -int direction = 1; -int braking; // needs to be initialized? -int dutycycle = 75; -int newDataFlag = 0; -int status = 0; -uint16_t CurrFB; -uint16_t CFBArray[101]; -uint32_t CFBTotal; -uint16_t CFBAvg; -uint16_t CFBtemp; - -//storage for send and receive data -HID_REPORT send_report; -HID_REPORT recv_report; - -bool initflag = true; - -// USB COMMANDS -// These are sent from the PC -#define WRITE_LED 0x20 -#define WRITE_GEN_EN 0x40 // what is this? What should the GUI kickoff here? -#define WRITE_DUTY_CYCLE 0x50 -#define WRITE_PWM_FREQ 0x60 -#define WRITE_RUN_STOP 0x70 -#define WRITE_DIRECTION 0x71 -#define WRITE_BRAKING 0x90 -#define WRITE_RESET 0xA0 // what is this? What should the GUI kickoff here? -#define WRITE_D1 0xB1 -#define WRITE_EN 0xC1 -#define WRITE_D2B 0xD5 -#define WRITE_SLEW 0xE5 -#define WRITE_INV 0xF5 - -#define scaleFactor 0.11868 - -// LOGICAL CONSTANTS -#define OFF 0x00 -#define ON 0x01 - - -int main() -{ - send_report.length = 64; - recv_report.length = 64; - - - while(1) - { - //try to read a msg - if(hid.readNB(&recv_report)) - { - switch(recv_report.data[0]) //byte 0 of recv_report.data is command - { -//----------------------------------------------------------------------------------------------------------------- -// COMMAND PARSER -//----------------------------------------------------------------------------------------------------------------- -//////// - case WRITE_LED: - break; -//////// - -//////// - case WRITE_DUTY_CYCLE: - dutycycle = recv_report.data[1]; - newDataFlag = 1; - break; -//////// - case WRITE_PWM_FREQ: //PWM frequency can be larger than 1 byte - pwm_freq_lo = recv_report.data[1]; //so we have to re-assemble the number - pwm_freq_hi = recv_report.data[2] * 100; - frequencyHz = pwm_freq_lo + pwm_freq_hi; - newDataFlag = 1; - break; -//////// - case WRITE_RUN_STOP: - newDataFlag = 1; - if(recv_report.data[1] != 0) - { - runstop = 1; - } - else - { - runstop = 0; - } - break; - -//////// - case WRITE_DIRECTION: - newDataFlag = 1; - if(recv_report.data[1] == 1) // used to be != 0 - { - direction = 1; // corrected allocation for FWD - //direction = 0; // corrected allocation for REV - } - else - { - direction = 0; // corrected allocation for REV - //direction = 1; // corrected allocation for FWD - } - break; -//////// - case WRITE_BRAKING: - newDataFlag = 1; - if(recv_report.data[1] != 0) // used to be == 1 - { - braking = 1; // this is HS recirc - } - else - { - braking = 0; // this is LS recirc - } - break; -//////// - case WRITE_D1: - newDataFlag = 1; - if(recv_report.data[1] == 1) - { - DIS1 = 1; // logic hi will disable the part - } - else - { - DIS1 = 0; // logic lo will enable the part - } - break; -//////// - case WRITE_EN: - newDataFlag = 1; - if(recv_report.data[1] == 1) - { - //EN = 0; // this is enable case - EN = 1; // align with the signal being sent from GUI - } - else - { - //EN = 1; // this is disable case - EN = 0; // align with signal being sent from GUI - } - break; -//////// - case WRITE_D2B: - newDataFlag = 1; - if(recv_report.data[1] == 1) - { - D2B = 1; - } - else - { - D2B = 0; - } - break; - -//////// - case WRITE_SLEW: - newDataFlag = 1; - if(recv_report.data[1] == 1) - { - SLEW = 1; - } - else - { - SLEW = 0; - } - break; - -//////// - case WRITE_INV: - newDataFlag = 1; - if(recv_report.data[1] == 1) - { - INV = 1; - //INV = 0; - } - else - { - INV = 0; - //INV = 1; - } - break; - - -//////// - default: - break; - }// End Switch recv report data[0] - -//----------------------------------------------------------------------------------------------------------------- -// end command parser -//----------------------------------------------------------------------------------------------------------------- - - status = SFB; - send_report.data[0] = status; // Echo Command - send_report.data[1] = recv_report.data[1]; // Echo Subcommand 1 - send_report.data[2] = recv_report.data[2]; // Echo Subcommand 2 - send_report.data[3] = 0x00; - send_report.data[4] = 0x00; - send_report.data[5] = 0x00; - send_report.data[6] = (CFBAvg << 8) >> 8; - send_report.data[7] = CFBAvg >> 8; - - //Send the report - hid.send(&send_report); - }// End If(hid.readNB(&recv_report)) -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//End of USB message handling -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - CurrFB = CFB.read_u16(); - CFBArray[0] = CurrFB; - CFBTotal = 0; - int i = 0; - for(i=0; i<100; i++) - { - CFBTotal = CFBTotal + CFBArray[i]; - } - CFBAvg = CFBTotal / 100; - - for(i=100; i>=0; i--) - { - - CFBArray[i+1] = CFBArray[i]; - } - - if(newDataFlag != 0) //GUI setting changed - { - newDataFlag = 0; - if(runstop != 0) //Running - { - if(direction == 0) //reverse - { - if(braking == 1) //dynamic - { - IN1.period(1/(float)frequencyHz); - //IN1 = (float)dutycycle/100.0; // this is REV + HS, inverted d - IN1 = 1.0-((float)dutycycle/100.0); // this is REV + HS - IN2 = 1; - } - else //coast - { - IN1 = 0; // this is REV + LS - IN2.period(1/(float)frequencyHz); - IN2 = (float)dutycycle/100.0; - } - } - else //forward - { - if(braking == 1) //dynamic - { - IN1 = 1; - IN2.period(1/(float)frequencyHz); - //IN2 = (float)dutycycle/100.0; // this is FWD + HS, inverted d - IN2 = 1.0-((float)dutycycle/100.0); // this is FWD + HS - } - else //coast - { - IN1.period(1/(float)frequencyHz); - IN1 = (float)dutycycle/100.0; - IN2 = 0; // FWD + LS - } - } - } - else //Stopped - { - if(braking == 1) //braking - { - IN1.period(1); - IN2.period(1); - IN1.write(1); - IN2.write(1); - } - else //coasting - { - IN1.period(1); - IN2.period(1); - IN1.write(0); - IN2.write(0); - - } - } - } - } -} -