MCU Code for FRDM-K64F which works with Graphical User Interface available on Freescale website to control a brushed DC motor using X-FRDM-34931SEVM. The code enables controlling the PWM frequency, duty cycle, enabling/disabling while monitoring status flag pin for undervoltge, short circuit and over-temperature events as well as real time load current for implementing advanced diagnostics.

Dependencies:   USBDevice mbed

Fork of Brushed DC Motor Control using X-FRDM-34931SEVM and FRDM-K64F by Freescale

Committer:
pnandy
Date:
Mon Dec 28 17:33:03 2015 +0000
Revision:
0:77e608030314
Rev0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pnandy 0:77e608030314 1 #include "mbed.h"
pnandy 0:77e608030314 2 #include "USBHID.h"
pnandy 0:77e608030314 3
pnandy 0:77e608030314 4 // We declare a USBHID device.
pnandy 0:77e608030314 5 // HID In/Out Reports are 64 Bytes long
pnandy 0:77e608030314 6 // Vendor ID (VID): 0x15A2
pnandy 0:77e608030314 7 // Product ID (PID): 0x0138
pnandy 0:77e608030314 8 // Serial Number: 0x0001
pnandy 0:77e608030314 9 USBHID hid(64, 64, 0x15A2, 0x0138, 0x0001, true);
pnandy 0:77e608030314 10
pnandy 0:77e608030314 11 //Setup Digital Outputs for the LEDs on the FRDM
pnandy 0:77e608030314 12 //PwmOut red_led(LED1);
pnandy 0:77e608030314 13 //DigitalOut green_led(LED2);
pnandy 0:77e608030314 14 //DigitalOut blue_led(LED3);
pnandy 0:77e608030314 15
pnandy 0:77e608030314 16 //Setup PWM and Digital Outputs from FRDM-K64F
pnandy 0:77e608030314 17 PwmOut IN1(PTC2); // Pin IN1 input to MC34931 (FRDM PIN Name)
pnandy 0:77e608030314 18 PwmOut IN2 (PTA2); // Pin IN2 input to MC34931 (FRDM PIN Name)
pnandy 0:77e608030314 19 DigitalOut EN(PTE25); // Pin EN input to MC34931 (FRDM PIN Name)
pnandy 0:77e608030314 20 DigitalOut DIS(PTC17); // Pin D1 input to MC34931 (FRDM PIN Name)
pnandy 0:77e608030314 21 DigitalIn STATUS(PTB11);
pnandy 0:77e608030314 22 AnalogIn CFB(PTB2);
pnandy 0:77e608030314 23 //DigitalOut READY(PTC7); // Pin READY input to Motor Control Board (FRDM PIN Name)
pnandy 0:77e608030314 24
pnandy 0:77e608030314 25 //Variables
pnandy 0:77e608030314 26 int pwm_freq_lo;
pnandy 0:77e608030314 27 int pwm_freq_hi;
pnandy 0:77e608030314 28 int frequencyHz = 500;
pnandy 0:77e608030314 29 int runstop = 0;
pnandy 0:77e608030314 30 int direction = 1;
pnandy 0:77e608030314 31 int braking;
pnandy 0:77e608030314 32 int dutycycle = 75;
pnandy 0:77e608030314 33 int newDataFlag = 0;
pnandy 0:77e608030314 34 int status = 0;
pnandy 0:77e608030314 35 uint16_t CurrFB;
pnandy 0:77e608030314 36 uint16_t CFBArray[101];
pnandy 0:77e608030314 37 uint32_t CFBTotal;
pnandy 0:77e608030314 38 uint16_t CFBAvg;
pnandy 0:77e608030314 39 uint16_t CFBtemp;
pnandy 0:77e608030314 40
pnandy 0:77e608030314 41 //storage for send and receive data
pnandy 0:77e608030314 42 HID_REPORT send_report;
pnandy 0:77e608030314 43 HID_REPORT recv_report;
pnandy 0:77e608030314 44
pnandy 0:77e608030314 45 bool initflag = true;
pnandy 0:77e608030314 46
pnandy 0:77e608030314 47 // USB COMMANDS
pnandy 0:77e608030314 48 // These are sent from the PC
pnandy 0:77e608030314 49 #define WRITE_LED 0x20
pnandy 0:77e608030314 50 #define WRITE_GEN_EN 0x40
pnandy 0:77e608030314 51 #define WRITE_DUTY_CYCLE 0x50
pnandy 0:77e608030314 52 #define WRITE_PWM_FREQ 0x60
pnandy 0:77e608030314 53 #define WRITE_RUN_STOP 0x70
pnandy 0:77e608030314 54 #define WRITE_DIRECTION 0x71
pnandy 0:77e608030314 55 #define WRITE_BRAKING 0x90
pnandy 0:77e608030314 56 #define WRITE_RESET 0xA0
pnandy 0:77e608030314 57 #define WRITE_D1 0xB1
pnandy 0:77e608030314 58 #define WRITE_D2_B 0xC1
pnandy 0:77e608030314 59
pnandy 0:77e608030314 60 #define scaleFactor 0.11868
pnandy 0:77e608030314 61
pnandy 0:77e608030314 62 // LOGICAL CONSTANTS
pnandy 0:77e608030314 63 #define OFF 0x00
pnandy 0:77e608030314 64 #define ON 0x01
pnandy 0:77e608030314 65
pnandy 0:77e608030314 66
pnandy 0:77e608030314 67 int main()
pnandy 0:77e608030314 68 {
pnandy 0:77e608030314 69 send_report.length = 64;
pnandy 0:77e608030314 70 recv_report.length = 64;
pnandy 0:77e608030314 71
pnandy 0:77e608030314 72
pnandy 0:77e608030314 73 while(1)
pnandy 0:77e608030314 74 {
pnandy 0:77e608030314 75 //try to read a msg
pnandy 0:77e608030314 76 if(hid.readNB(&recv_report))
pnandy 0:77e608030314 77 {
pnandy 0:77e608030314 78 switch(recv_report.data[0]) //byte 0 of recv_report.data is command
pnandy 0:77e608030314 79 {
pnandy 0:77e608030314 80 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:77e608030314 81 // COMMAND PARSER
pnandy 0:77e608030314 82 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:77e608030314 83 ////////
pnandy 0:77e608030314 84 case WRITE_LED:
pnandy 0:77e608030314 85 break;
pnandy 0:77e608030314 86 ////////
pnandy 0:77e608030314 87
pnandy 0:77e608030314 88 ////////
pnandy 0:77e608030314 89 case WRITE_DUTY_CYCLE:
pnandy 0:77e608030314 90 dutycycle = recv_report.data[1];
pnandy 0:77e608030314 91 newDataFlag = 1;
pnandy 0:77e608030314 92 break;
pnandy 0:77e608030314 93 ////////
pnandy 0:77e608030314 94 case WRITE_PWM_FREQ: //PWM frequency can be larger than 1 byte
pnandy 0:77e608030314 95 pwm_freq_lo = recv_report.data[1]; //so we have to re-assemble the number
pnandy 0:77e608030314 96 pwm_freq_hi = recv_report.data[2] * 100;
pnandy 0:77e608030314 97 frequencyHz = pwm_freq_lo + pwm_freq_hi;
pnandy 0:77e608030314 98 newDataFlag = 1;
pnandy 0:77e608030314 99 break;
pnandy 0:77e608030314 100 ////////
pnandy 0:77e608030314 101 case WRITE_RUN_STOP:
pnandy 0:77e608030314 102 newDataFlag = 1;
pnandy 0:77e608030314 103 if(recv_report.data[1] != 0)
pnandy 0:77e608030314 104 {
pnandy 0:77e608030314 105 runstop = 1;
pnandy 0:77e608030314 106 }
pnandy 0:77e608030314 107 else
pnandy 0:77e608030314 108 {
pnandy 0:77e608030314 109 runstop = 0;
pnandy 0:77e608030314 110 }
pnandy 0:77e608030314 111 break;
pnandy 0:77e608030314 112
pnandy 0:77e608030314 113 ////////
pnandy 0:77e608030314 114 case WRITE_DIRECTION:
pnandy 0:77e608030314 115 newDataFlag = 1;
pnandy 0:77e608030314 116
pnandy 0:77e608030314 117 if(recv_report.data[1] != 0)
pnandy 0:77e608030314 118 {
pnandy 0:77e608030314 119 direction = 1;
pnandy 0:77e608030314 120 }
pnandy 0:77e608030314 121 else
pnandy 0:77e608030314 122 {
pnandy 0:77e608030314 123 direction = 0;
pnandy 0:77e608030314 124 }
pnandy 0:77e608030314 125 break;
pnandy 0:77e608030314 126 ////////
pnandy 0:77e608030314 127 case WRITE_BRAKING:
pnandy 0:77e608030314 128 newDataFlag = 1;
pnandy 0:77e608030314 129 if(recv_report.data[1] == 1)
pnandy 0:77e608030314 130 {
pnandy 0:77e608030314 131 braking = 1;
pnandy 0:77e608030314 132 }
pnandy 0:77e608030314 133 else
pnandy 0:77e608030314 134 {
pnandy 0:77e608030314 135 braking = 0;
pnandy 0:77e608030314 136 }
pnandy 0:77e608030314 137 break;
pnandy 0:77e608030314 138 ////////
pnandy 0:77e608030314 139 case WRITE_D1:
pnandy 0:77e608030314 140 newDataFlag = 1;
pnandy 0:77e608030314 141 if(recv_report.data[1] == 1)
pnandy 0:77e608030314 142 {
pnandy 0:77e608030314 143 DIS = 1;
pnandy 0:77e608030314 144 }
pnandy 0:77e608030314 145 else
pnandy 0:77e608030314 146 {
pnandy 0:77e608030314 147 DIS = 0;
pnandy 0:77e608030314 148 }
pnandy 0:77e608030314 149 break;
pnandy 0:77e608030314 150 ////////
pnandy 0:77e608030314 151 case WRITE_D2_B:
pnandy 0:77e608030314 152 newDataFlag = 1;
pnandy 0:77e608030314 153 if(recv_report.data[1] == 1)
pnandy 0:77e608030314 154 {
pnandy 0:77e608030314 155 EN = 0;
pnandy 0:77e608030314 156 }
pnandy 0:77e608030314 157 else
pnandy 0:77e608030314 158 {
pnandy 0:77e608030314 159 EN = 1;
pnandy 0:77e608030314 160 }
pnandy 0:77e608030314 161 break;
pnandy 0:77e608030314 162
pnandy 0:77e608030314 163 ////////
pnandy 0:77e608030314 164 default:
pnandy 0:77e608030314 165 break;
pnandy 0:77e608030314 166 }// End Switch recv report data[0]
pnandy 0:77e608030314 167
pnandy 0:77e608030314 168 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:77e608030314 169 // end command parser
pnandy 0:77e608030314 170 //-----------------------------------------------------------------------------------------------------------------
pnandy 0:77e608030314 171
pnandy 0:77e608030314 172 status = STATUS;
pnandy 0:77e608030314 173 send_report.data[0] = status; // Echo Command
pnandy 0:77e608030314 174 send_report.data[1] = recv_report.data[1]; // Echo Subcommand 1
pnandy 0:77e608030314 175 send_report.data[2] = recv_report.data[2]; // Echo Subcommand 2
pnandy 0:77e608030314 176 send_report.data[3] = 0x00;
pnandy 0:77e608030314 177 send_report.data[4] = 0x00;
pnandy 0:77e608030314 178 send_report.data[5] = 0x00;
pnandy 0:77e608030314 179 send_report.data[6] = (CFBAvg << 8) >> 8;
pnandy 0:77e608030314 180 send_report.data[7] = CFBAvg >> 8;
pnandy 0:77e608030314 181
pnandy 0:77e608030314 182 //Send the report
pnandy 0:77e608030314 183 hid.send(&send_report);
pnandy 0:77e608030314 184 }// End If(hid.readNB(&recv_report))
pnandy 0:77e608030314 185 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pnandy 0:77e608030314 186 //End of USB message handling
pnandy 0:77e608030314 187 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pnandy 0:77e608030314 188
pnandy 0:77e608030314 189 CurrFB = CFB.read_u16();
pnandy 0:77e608030314 190 CFBArray[0] = CurrFB;
pnandy 0:77e608030314 191 CFBTotal = 0;
pnandy 0:77e608030314 192 int i = 0;
pnandy 0:77e608030314 193 for(i=0; i<100; i++)
pnandy 0:77e608030314 194 {
pnandy 0:77e608030314 195 CFBTotal = CFBTotal + CFBArray[i];
pnandy 0:77e608030314 196 }
pnandy 0:77e608030314 197 CFBAvg = CFBTotal / 100;
pnandy 0:77e608030314 198
pnandy 0:77e608030314 199 for(i=100; i>=0; i--)
pnandy 0:77e608030314 200 {
pnandy 0:77e608030314 201
pnandy 0:77e608030314 202 CFBArray[i+1] = CFBArray[i];
pnandy 0:77e608030314 203 }
pnandy 0:77e608030314 204
pnandy 0:77e608030314 205 if(newDataFlag != 0) //GUI setting changed
pnandy 0:77e608030314 206 {
pnandy 0:77e608030314 207 newDataFlag = 0;
pnandy 0:77e608030314 208 if(runstop != 0) //Running
pnandy 0:77e608030314 209 {
pnandy 0:77e608030314 210 if(direction == 0) //reverse
pnandy 0:77e608030314 211 {
pnandy 0:77e608030314 212 if(braking == 1) //dynamic
pnandy 0:77e608030314 213 {
pnandy 0:77e608030314 214 IN1.period(1/(float)frequencyHz);
pnandy 0:77e608030314 215 IN1 = (float)dutycycle/100.0;
pnandy 0:77e608030314 216 IN2 = 1;
pnandy 0:77e608030314 217 }
pnandy 0:77e608030314 218 else //coast
pnandy 0:77e608030314 219 {
pnandy 0:77e608030314 220 IN1 = 0;
pnandy 0:77e608030314 221 IN2.period(1/(float)frequencyHz);
pnandy 0:77e608030314 222 IN2 = (float)dutycycle/100.0;
pnandy 0:77e608030314 223 }
pnandy 0:77e608030314 224 }
pnandy 0:77e608030314 225 else //forward
pnandy 0:77e608030314 226 {
pnandy 0:77e608030314 227 if(braking == 1) //dynamic
pnandy 0:77e608030314 228 {
pnandy 0:77e608030314 229 IN1 = 1;
pnandy 0:77e608030314 230 IN2.period(1/(float)frequencyHz);
pnandy 0:77e608030314 231 IN2 = (float)dutycycle/100.0;
pnandy 0:77e608030314 232 }
pnandy 0:77e608030314 233 else //coast
pnandy 0:77e608030314 234 {
pnandy 0:77e608030314 235 IN1.period(1/(float)frequencyHz);
pnandy 0:77e608030314 236 IN1 = (float)dutycycle/100.0;
pnandy 0:77e608030314 237 IN2 = 0;
pnandy 0:77e608030314 238 }
pnandy 0:77e608030314 239 }
pnandy 0:77e608030314 240 }
pnandy 0:77e608030314 241 else //Stopped
pnandy 0:77e608030314 242 {
pnandy 0:77e608030314 243 if(braking == 1) //braking
pnandy 0:77e608030314 244 {
pnandy 0:77e608030314 245 IN1.period(1);
pnandy 0:77e608030314 246 IN2.period(1);
pnandy 0:77e608030314 247 IN1.write(1);
pnandy 0:77e608030314 248 IN2.write(1);
pnandy 0:77e608030314 249 }
pnandy 0:77e608030314 250 else //coasting
pnandy 0:77e608030314 251 {
pnandy 0:77e608030314 252 IN1.period(1);
pnandy 0:77e608030314 253 IN2.period(1);
pnandy 0:77e608030314 254 IN1.write(0);
pnandy 0:77e608030314 255 IN2.write(0);
pnandy 0:77e608030314 256
pnandy 0:77e608030314 257 }
pnandy 0:77e608030314 258 }
pnandy 0:77e608030314 259 }
pnandy 0:77e608030314 260 }
pnandy 0:77e608030314 261 }
pnandy 0:77e608030314 262