f334

Dependencies:   CANnucleo FastPWM3 mbed

Fork of Hobbyking_Cheetah_Compact by Ben Katz

Committer:
benkatz
Date:
Thu Nov 02 22:28:25 2017 +0000
Revision:
23:db1263aae417
Parent:
22:c8a1f2071bb0
derp;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benkatz 22:c8a1f2071bb0 1 /*
benkatz 17:3c5df2982199 2 const unsigned int BOARDNUM = 0x2;
benkatz 17:3c5df2982199 3
benkatz 17:3c5df2982199 4 //const unsigned int a_id =
benkatz 17:3c5df2982199 5
benkatz 17:3c5df2982199 6 const unsigned int TX_ID = 0x0100;
benkatz 17:3c5df2982199 7
benkatz 18:f1d56f4acb39 8 const unsigned int cmd_ID = (BOARDNUM<<8) + 0x7;
benkatz 18:f1d56f4acb39 9
benkatz 22:c8a1f2071bb0 10 */
benkatz 17:3c5df2982199 11
benkatz 22:c8a1f2071bb0 12 //#include "CANnucleo.h"
benkatz 0:4e1c4df6aabd 13 #include "mbed.h"
benkatz 0:4e1c4df6aabd 14 #include "PositionSensor.h"
benkatz 20:bf9ea5125d52 15 #include "structs.h"
benkatz 20:bf9ea5125d52 16 #include "foc.h"
benkatz 20:bf9ea5125d52 17 #include "hw_setup.h"
benkatz 20:bf9ea5125d52 18 #include "math_ops.h"
benkatz 20:bf9ea5125d52 19 #include "current_controller_config.h"
benkatz 20:bf9ea5125d52 20 #include "hw_config.h"
benkatz 20:bf9ea5125d52 21 #include "motor_config.h"
benkatz 9:d7eb815cb057 22
benkatz 20:bf9ea5125d52 23 GPIOStruct gpio;
benkatz 20:bf9ea5125d52 24 ControllerStruct controller;
benkatz 20:bf9ea5125d52 25 COMStruct com;
benkatz 17:3c5df2982199 26
benkatz 9:d7eb815cb057 27
benkatz 22:c8a1f2071bb0 28 /*
benkatz 17:3c5df2982199 29 CANnucleo::CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name
benkatz 17:3c5df2982199 30 CANnucleo::CANMessage rxMsg;
benkatz 17:3c5df2982199 31 CANnucleo::CANMessage txMsg;
benkatz 22:c8a1f2071bb0 32 */
benkatz 17:3c5df2982199 33 int ledState;
benkatz 17:3c5df2982199 34 int counter = 0;
benkatz 18:f1d56f4acb39 35 int canCmd = 1000;
benkatz 17:3c5df2982199 36 volatile bool msgAvailable = false;
benkatz 17:3c5df2982199 37
benkatz 22:c8a1f2071bb0 38 //DigitalOut toggle(PA_0);
benkatz 20:bf9ea5125d52 39 Ticker loop;
benkatz 17:3c5df2982199 40 /**
benkatz 17:3c5df2982199 41 * @brief 'CAN receive-complete' interrup handler.
benkatz 17:3c5df2982199 42 * @note Called on arrival of new CAN message.
benkatz 17:3c5df2982199 43 * Keep it as short as possible.
benkatz 17:3c5df2982199 44 * @param
benkatz 17:3c5df2982199 45 * @retval
benkatz 17:3c5df2982199 46 */
benkatz 22:c8a1f2071bb0 47 /*
benkatz 17:3c5df2982199 48 void onMsgReceived() {
benkatz 17:3c5df2982199 49 msgAvailable = true;
benkatz 17:3c5df2982199 50 //printf("ping\n\r");
benkatz 17:3c5df2982199 51 }
benkatz 17:3c5df2982199 52
benkatz 17:3c5df2982199 53 void sendCMD(int TX_addr, int val){
benkatz 17:3c5df2982199 54 txMsg.clear(); //clear Tx message storage
benkatz 17:3c5df2982199 55 txMsg.id = TX_addr;
benkatz 17:3c5df2982199 56 txMsg << val;
benkatz 17:3c5df2982199 57 can.write(txMsg);
benkatz 17:3c5df2982199 58 //wait(.1);
benkatz 17:3c5df2982199 59
benkatz 17:3c5df2982199 60 }
benkatz 17:3c5df2982199 61
benkatz 18:f1d56f4acb39 62 void readCAN(void){
benkatz 18:f1d56f4acb39 63 if(msgAvailable) {
benkatz 18:f1d56f4acb39 64 msgAvailable = false; // reset flag for next use
benkatz 18:f1d56f4acb39 65 can.read(rxMsg); // read message into Rx message storage
benkatz 18:f1d56f4acb39 66 // Filtering performed by software:
benkatz 18:f1d56f4acb39 67 if(rxMsg.id == cmd_ID) { // See comments in CAN.cpp for filtering performed by hardware
benkatz 18:f1d56f4acb39 68 rxMsg >> canCmd;
benkatz 18:f1d56f4acb39 69 } // extract first data item
benkatz 18:f1d56f4acb39 70 }
benkatz 18:f1d56f4acb39 71 }
benkatz 17:3c5df2982199 72
benkatz 20:bf9ea5125d52 73 void cancontroller(void){
benkatz 18:f1d56f4acb39 74 //printf("%d\n\r", canCmd);
benkatz 18:f1d56f4acb39 75 readCAN();
benkatz 18:f1d56f4acb39 76 //sendCMD(TX_ID, canCmd);
benkatz 18:f1d56f4acb39 77
benkatz 17:3c5df2982199 78 //sendCMD(TX_ID+b_ID, b1);
benkatz 17:3c5df2982199 79 //sendCMD(TX_ID+c_ID, c1);
benkatz 17:3c5df2982199 80 }
benkatz 17:3c5df2982199 81
benkatz 22:c8a1f2071bb0 82 */
benkatz 20:bf9ea5125d52 83
benkatz 9:d7eb815cb057 84 Serial pc(PA_2, PA_3);
benkatz 8:10ae7bc88d6e 85
benkatz 22:c8a1f2071bb0 86 //PositionSensorAM5147 spi(16384, 0 , NPP); ///1 I really need an eeprom or something to store this....
benkatz 20:bf9ea5125d52 87 //PositionSensorEncoder encoder(4096, 0, 21);
benkatz 20:bf9ea5125d52 88
benkatz 20:bf9ea5125d52 89 int count = 0;
benkatz 20:bf9ea5125d52 90
benkatz 0:4e1c4df6aabd 91
benkatz 1:b8bceb4daed5 92 // Current Sampling IRQ
benkatz 22:c8a1f2071bb0 93 volatile float dtc1 = 0;
benkatz 22:c8a1f2071bb0 94 volatile float dtc2 = 0;
benkatz 22:c8a1f2071bb0 95 volatile float dtc3 = 0;
benkatz 22:c8a1f2071bb0 96 extern "C" void TIM1_UP_TIM16_IRQHandler(void) {
benkatz 2:8724412ad628 97 if (TIM1->SR & TIM_SR_UIF ) {
benkatz 22:c8a1f2071bb0 98
benkatz 22:c8a1f2071bb0 99 GPIOC->ODR ^= (1 << 4);
benkatz 22:c8a1f2071bb0 100
benkatz 22:c8a1f2071bb0 101 ADC1->CR |= ADC_CR_ADSTART;
benkatz 22:c8a1f2071bb0 102 volatile int eoc;
benkatz 22:c8a1f2071bb0 103 while(!eoc){
benkatz 22:c8a1f2071bb0 104 eoc = ADC1->ISR & ADC_ISR_EOC;
benkatz 22:c8a1f2071bb0 105 }
benkatz 22:c8a1f2071bb0 106
benkatz 22:c8a1f2071bb0 107 controller.adc1_raw = ADC1->DR;
benkatz 22:c8a1f2071bb0 108 controller.adc2_raw = ADC2->DR;
benkatz 20:bf9ea5125d52 109
benkatz 22:c8a1f2071bb0 110 //spi.Sample();
benkatz 22:c8a1f2071bb0 111 //controller.dtheta_mech = spi.GetMechVelocity();
benkatz 22:c8a1f2071bb0 112 //controller.theta_elec = spi.GetElecPosition();
benkatz 22:c8a1f2071bb0 113
benkatz 22:c8a1f2071bb0 114 commutate(&controller, &gpio, controller.theta_elec);
benkatz 22:c8a1f2071bb0 115 //TIM1->CCR1 = 0x708*(dtc3);
benkatz 22:c8a1f2071bb0 116 //TIM1->CCR2 = 0x708*(dtc2);
benkatz 22:c8a1f2071bb0 117 //TIM1->CCR3 = 0x708*(dtc1);
benkatz 22:c8a1f2071bb0 118 GPIOC->ODR ^= (1 << 4);
benkatz 22:c8a1f2071bb0 119
benkatz 22:c8a1f2071bb0 120 //gpio.pwm_u->write(1.0f); //write duty cycles
benkatz 22:c8a1f2071bb0 121
benkatz 22:c8a1f2071bb0 122
benkatz 20:bf9ea5125d52 123
benkatz 2:8724412ad628 124 }
benkatz 2:8724412ad628 125 TIM1->SR = 0x0; // reset the status register
benkatz 2:8724412ad628 126 }
benkatz 0:4e1c4df6aabd 127
benkatz 20:bf9ea5125d52 128
benkatz 22:c8a1f2071bb0 129 void enter_torque_mode(void){
benkatz 22:c8a1f2071bb0 130
benkatz 22:c8a1f2071bb0 131 TIM1->CR1 ^= TIM_CR1_UDIS; //enable interrupt
benkatz 22:c8a1f2071bb0 132 controller.i_d_ref = 0;
benkatz 22:c8a1f2071bb0 133 controller.i_q_ref = 0;
benkatz 22:c8a1f2071bb0 134 reset_foc(&controller);
benkatz 22:c8a1f2071bb0 135 gpio.enable->write(1);
benkatz 22:c8a1f2071bb0 136 }
benkatz 22:c8a1f2071bb0 137
benkatz 0:4e1c4df6aabd 138
benkatz 0:4e1c4df6aabd 139 int main() {
benkatz 20:bf9ea5125d52 140
benkatz 22:c8a1f2071bb0 141
benkatz 20:bf9ea5125d52 142 controller.v_bus = V_BUS;
benkatz 22:c8a1f2071bb0 143 //spi.ZeroPosition();
benkatz 20:bf9ea5125d52 144 Init_All_HW(&gpio);
benkatz 20:bf9ea5125d52 145
benkatz 9:d7eb815cb057 146 wait(.1);
benkatz 20:bf9ea5125d52 147 //TIM1->CR1 |= TIM_CR1_UDIS;
benkatz 20:bf9ea5125d52 148 gpio.enable->write(1);
benkatz 20:bf9ea5125d52 149 gpio.pwm_u->write(1.0f); //write duty cycles
benkatz 20:bf9ea5125d52 150 gpio.pwm_v->write(1.0f);
benkatz 20:bf9ea5125d52 151 gpio.pwm_w->write(1.0f);
benkatz 20:bf9ea5125d52 152 zero_current(&controller.adc1_offset, &controller.adc2_offset);
benkatz 22:c8a1f2071bb0 153 //gpio.enable->write(0);
benkatz 20:bf9ea5125d52 154 reset_foc(&controller);
benkatz 22:c8a1f2071bb0 155
benkatz 22:c8a1f2071bb0 156 //TIM1->CR1 ^= TIM_CR1_UDIS; //enable interrupt
benkatz 20:bf9ea5125d52 157 gpio.enable->write(1);
benkatz 22:c8a1f2071bb0 158 gpio.pwm_u->write(1.0f - .05f); //write duty cycles
benkatz 22:c8a1f2071bb0 159 gpio.pwm_v->write(1.0f - .05f);
benkatz 22:c8a1f2071bb0 160 gpio.pwm_w->write(1.0f - .1f);
benkatz 20:bf9ea5125d52 161
benkatz 20:bf9ea5125d52 162 wait(.1);
benkatz 20:bf9ea5125d52 163 //loop.attach(&commutate, .000025);
benkatz 22:c8a1f2071bb0 164 //can.frequency(1000000); // set bit rate to 1Mbps
benkatz 22:c8a1f2071bb0 165 //can.attach(&onMsgReceived); // attach 'CAN receive-complete' interrupt handler
benkatz 22:c8a1f2071bb0 166 //can.filter(0x020 << 25, 0xF0000004, CANAny, 0);
benkatz 18:f1d56f4acb39 167
benkatz 14:80ce59119d93 168 pc.baud(921600);
benkatz 20:bf9ea5125d52 169 wait(.01);
benkatz 20:bf9ea5125d52 170 pc.printf("HobbyKing Cheetah v1.1\n\r");
benkatz 20:bf9ea5125d52 171 pc.printf("ADC1 Offset: %d ADC2 Offset: %d", controller.adc1_offset, controller.adc2_offset);
benkatz 20:bf9ea5125d52 172 wait(.01);
benkatz 20:bf9ea5125d52 173
benkatz 22:c8a1f2071bb0 174
benkatz 22:c8a1f2071bb0 175 enter_torque_mode();
benkatz 22:c8a1f2071bb0 176 //enter_zeroing_mode();
benkatz 22:c8a1f2071bb0 177
benkatz 22:c8a1f2071bb0 178 GPIOC->ODR = 0;
benkatz 22:c8a1f2071bb0 179
benkatz 0:4e1c4df6aabd 180 while(1) {
benkatz 11:c83b18d41e54 181
benkatz 0:4e1c4df6aabd 182 }
benkatz 0:4e1c4df6aabd 183 }