motor controller

Dependencies:   mbed plotter

Committer:
dicarloj
Date:
Mon Oct 03 04:56:06 2016 +0000
Revision:
0:f899a5183b5e
Child:
1:2acd7dfc4b1b
initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dicarloj 0:f899a5183b5e 1 #include "mbed.h"
dicarloj 0:f899a5183b5e 2 #include "config.h"
dicarloj 0:f899a5183b5e 3 #include "io.h"
dicarloj 0:f899a5183b5e 4 #include "foc.h"
dicarloj 0:f899a5183b5e 5
dicarloj 0:f899a5183b5e 6 Serial pc_ser(USBTX, USBRX);
dicarloj 0:f899a5183b5e 7 Serial debug_ser(PC_10, PC_11);
dicarloj 0:f899a5183b5e 8 Serial panel_ser(PC_6, PC_7);
dicarloj 0:f899a5183b5e 9
dicarloj 0:f899a5183b5e 10 volatile bool enabled = false;
dicarloj 0:f899a5183b5e 11 volatile bool error = false;
dicarloj 0:f899a5183b5e 12
dicarloj 0:f899a5183b5e 13 bool getError()
dicarloj 0:f899a5183b5e 14 {
dicarloj 0:f899a5183b5e 15 return error;
dicarloj 0:f899a5183b5e 16 }
dicarloj 0:f899a5183b5e 17
dicarloj 0:f899a5183b5e 18 void setError()
dicarloj 0:f899a5183b5e 19 {
dicarloj 0:f899a5183b5e 20 error = true;
dicarloj 0:f899a5183b5e 21 }
dicarloj 0:f899a5183b5e 22
dicarloj 0:f899a5183b5e 23 bool getEnabled()
dicarloj 0:f899a5183b5e 24 {
dicarloj 0:f899a5183b5e 25 return enabled;
dicarloj 0:f899a5183b5e 26 }
dicarloj 0:f899a5183b5e 27
dicarloj 0:f899a5183b5e 28 void setEnabled(bool _enabled)
dicarloj 0:f899a5183b5e 29 {
dicarloj 0:f899a5183b5e 30 enabled = _enabled;
dicarloj 0:f899a5183b5e 31 }
dicarloj 0:f899a5183b5e 32 void setup()
dicarloj 0:f899a5183b5e 33 {
dicarloj 0:f899a5183b5e 34 getSerial(0)->baud(SERIAL_BAUD); //set serial baud
dicarloj 0:f899a5183b5e 35 getSerial(1)->baud(SERIAL_BAUD); //set serial baud
dicarloj 0:f899a5183b5e 36 getSerial(2)->baud(SERIAL_BAUD); //set serial baud
dicarloj 0:f899a5183b5e 37
dicarloj 0:f899a5183b5e 38 getSerial(0)->printf("GEORGE\n");
dicarloj 0:f899a5183b5e 39 getSerial(0)->printf("*******INITIALIZING**********\n");
dicarloj 0:f899a5183b5e 40
dicarloj 0:f899a5183b5e 41 getSerial(0)->printf("Setting up clocks...\n");
dicarloj 0:f899a5183b5e 42 /*************************************
dicarloj 0:f899a5183b5e 43 CLOCKS
dicarloj 0:f899a5183b5e 44 **************************************/
dicarloj 0:f899a5183b5e 45 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //gpio a
dicarloj 0:f899a5183b5e 46 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; //gpio b
dicarloj 0:f899a5183b5e 47 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; //gpio c
dicarloj 0:f899a5183b5e 48 RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; //tim1
dicarloj 0:f899a5183b5e 49 RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //adc1
dicarloj 0:f899a5183b5e 50 RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; //adc2
dicarloj 0:f899a5183b5e 51 RCC->APB1ENR |= RCC_APB1ENR_DACEN; //dac
dicarloj 0:f899a5183b5e 52
dicarloj 0:f899a5183b5e 53 getSerial(0)->printf("Setting up interrupts...\n");
dicarloj 0:f899a5183b5e 54 /*************************************
dicarloj 0:f899a5183b5e 55 INTERRUPTS
dicarloj 0:f899a5183b5e 56 **************************************/
dicarloj 0:f899a5183b5e 57 NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); //setup interrupt controller
dicarloj 0:f899a5183b5e 58 TIM1->DIER |= TIM_DIER_UIE; //enable timer interrupts
dicarloj 0:f899a5183b5e 59
dicarloj 0:f899a5183b5e 60 getSerial(0)->printf("Setting up PWM...\n");
dicarloj 0:f899a5183b5e 61 /************************************
dicarloj 0:f899a5183b5e 62 PWM CONFIGURATION
dicarloj 0:f899a5183b5e 63 *************************************/
dicarloj 0:f899a5183b5e 64 //set center aligned mode bits to 10 (might be 01 though).
dicarloj 0:f899a5183b5e 65 TIM1->CR1 |= TIM_CR1_CMS_1; //counts up and down, but only interrupts when counting up.
dicarloj 0:f899a5183b5e 66 TIM1->EGR |= TIM_EGR_UG; //reference manual says I need to go this.
dicarloj 0:f899a5183b5e 67 //enable and set polarity of output compares (using 1, 2, 3)
dicarloj 0:f899a5183b5e 68 TIM1->CCER |= TIM_CCER_CC3E;
dicarloj 0:f899a5183b5e 69 TIM1->CCER |= TIM_CCER_CC3P;
dicarloj 0:f899a5183b5e 70 TIM1->CCER |= TIM_CCER_CC2E;
dicarloj 0:f899a5183b5e 71 TIM1->CCER |= TIM_CCER_CC2P;
dicarloj 0:f899a5183b5e 72 TIM1->CCER |= TIM_CCER_CC1E;
dicarloj 0:f899a5183b5e 73 TIM1->CCER |= TIM_CCER_CC1P;
dicarloj 0:f899a5183b5e 74
dicarloj 0:f899a5183b5e 75 getSerial(0)->printf("Setting up Timers...\n");
dicarloj 0:f899a5183b5e 76 /************************************
dicarloj 0:f899a5183b5e 77 TIMER CONFIGURATION
dicarloj 0:f899a5183b5e 78 *************************************/
dicarloj 0:f899a5183b5e 79 //buffer the auto reload register (ARR) to update only on update event
dicarloj 0:f899a5183b5e 80 TIM1->CR1 |= TIM_CR1_ARPE;
dicarloj 0:f899a5183b5e 81 TIM1->RCR |= 0x01; //repetition counter set for 2 repetitions
dicarloj 0:f899a5183b5e 82 TIM1->PSC = 0x0; //no prescaler.
dicarloj 0:f899a5183b5e 83 //set counter maximum to value for 10 kHz PWM
dicarloj 0:f899a5183b5e 84 TIM1->ARR = 0x2328; //this is for 20 kHz, which is think is a needed correction.
dicarloj 0:f899a5183b5e 85 //counter needs to do two cycles for 1 full pwm cycle I think.
dicarloj 0:f899a5183b5e 86 //this is due to the center aligned mode.
dicarloj 0:f899a5183b5e 87
dicarloj 0:f899a5183b5e 88 getSerial(0)->printf("Setting up ADC...\n");
dicarloj 0:f899a5183b5e 89 /************************************
dicarloj 0:f899a5183b5e 90 ADC CONFIG
dicarloj 0:f899a5183b5e 91 *************************************/
dicarloj 0:f899a5183b5e 92 ADC->CCR |= 0b110; //set adc 1, 2 to sample together.
dicarloj 0:f899a5183b5e 93 ADC1->SQR3 |= 0x4; //on ADC1, sample ADC12_IN channel 4 (PA4)
dicarloj 0:f899a5183b5e 94 ADC2->SQR3 |= 0x8; //on ADC2, sample ADC12_IN channel 8 (PB0)
dicarloj 0:f899a5183b5e 95
dicarloj 0:f899a5183b5e 96 getSerial(0)->printf("Setting up GPIO...\n");
dicarloj 0:f899a5183b5e 97 getSerial(0)->printf("PWM pins are set up as 'alternate function'...\n");
dicarloj 0:f899a5183b5e 98 getSerial(0)->printf("May eventually need to set speed, pullup...\n");
dicarloj 0:f899a5183b5e 99 /************************************
dicarloj 0:f899a5183b5e 100 GPIO CONFIG
dicarloj 0:f899a5183b5e 101 *************************************/
dicarloj 0:f899a5183b5e 102 //pwm outs
dicarloj 0:f899a5183b5e 103 //0x2A0000 = 0b 10 10 10 00 00 00 00 00 00 00 00
dicarloj 0:f899a5183b5e 104 GPIOA->MODER |= 0x2A0000;
dicarloj 0:f899a5183b5e 105 // 109876543210
dicarloj 0:f899a5183b5e 106 GPIOA->MODER |= 0b001100000000; //PA4 as analog.
dicarloj 0:f899a5183b5e 107 GPIOB->MODER |= 0b000000000011; //PB0 as analog.
dicarloj 0:f899a5183b5e 108 GPIOA->MODER |= 0b110000000000; //PA5 as analog.
dicarloj 0:f899a5183b5e 109
dicarloj 0:f899a5183b5e 110 getSerial(0)->printf("Turning on ADC/DAC...\n");
dicarloj 0:f899a5183b5e 111 /************************************
dicarloj 0:f899a5183b5e 112 ADC/DAC START
dicarloj 0:f899a5183b5e 113 *************************************/
dicarloj 0:f899a5183b5e 114 ADC1->CR2 |= ADC_CR2_ADON; //adc 1 on
dicarloj 0:f899a5183b5e 115 ADC2->CR2 |= ADC_CR2_ADON; //adc 2 on
dicarloj 0:f899a5183b5e 116 DAC->CR |= DAC_CR_EN2; //dac 2 (PA5) on
dicarloj 0:f899a5183b5e 117
dicarloj 0:f899a5183b5e 118 getSerial(0)->printf("Turning on TIMER\n");
dicarloj 0:f899a5183b5e 119 /************************************
dicarloj 0:f899a5183b5e 120 TIMER START
dicarloj 0:f899a5183b5e 121 *************************************/
dicarloj 0:f899a5183b5e 122 TIM1->CR1 |= TIM_CR1_CEN; //enable!
dicarloj 0:f899a5183b5e 123 wait_us(100000);
dicarloj 0:f899a5183b5e 124
dicarloj 0:f899a5183b5e 125 /************************************
dicarloj 0:f899a5183b5e 126 ZERO CURRENT
dicarloj 0:f899a5183b5e 127 *************************************/
dicarloj 0:f899a5183b5e 128
dicarloj 0:f899a5183b5e 129 /************************************
dicarloj 0:f899a5183b5e 130 ENCODER
dicarloj 0:f899a5183b5e 131 *************************************/
dicarloj 0:f899a5183b5e 132
dicarloj 0:f899a5183b5e 133 /************************************
dicarloj 0:f899a5183b5e 134 FRONT PANEL BOARD
dicarloj 0:f899a5183b5e 135 *************************************/
dicarloj 0:f899a5183b5e 136
dicarloj 0:f899a5183b5e 137 }
dicarloj 0:f899a5183b5e 138
dicarloj 0:f899a5183b5e 139 Serial *getSerial(int port)
dicarloj 0:f899a5183b5e 140 {
dicarloj 0:f899a5183b5e 141 switch(port)
dicarloj 0:f899a5183b5e 142 {
dicarloj 0:f899a5183b5e 143 case 0:
dicarloj 0:f899a5183b5e 144 return &pc_ser;
dicarloj 0:f899a5183b5e 145 case 1:
dicarloj 0:f899a5183b5e 146 return &debug_ser;
dicarloj 0:f899a5183b5e 147 case 2:
dicarloj 0:f899a5183b5e 148 return &panel_ser;
dicarloj 0:f899a5183b5e 149 }
dicarloj 0:f899a5183b5e 150 return &pc_ser;
dicarloj 0:f899a5183b5e 151 }
dicarloj 0:f899a5183b5e 152
dicarloj 0:f899a5183b5e 153 extern "C" void TIM1_UP_TIM10_IRQHandler(void)
dicarloj 0:f899a5183b5e 154 {
dicarloj 0:f899a5183b5e 155 if(TIM1->SR & TIM_SR_UIF) {
dicarloj 0:f899a5183b5e 156 if(getEnabled() && !getError()) sampleCurrent();
dicarloj 0:f899a5183b5e 157 //else go turn off enabled pin.
dicarloj 0:f899a5183b5e 158 }
dicarloj 0:f899a5183b5e 159 TIM1->SR = 0;
dicarloj 0:f899a5183b5e 160 }
dicarloj 0:f899a5183b5e 161
dicarloj 0:f899a5183b5e 162 void set_inverter(*Inverter invt)
dicarloj 0:f899a5183b5e 163 {
dicarloj 0:f899a5183b5e 164 TIM1->CCR1 = volts_to_ticks(invt->v_a);
dicarloj 0:f899a5183b5e 165 TIM1->CCR2 = volts_to_ticks(invt->v_b);
dicarloj 0:f899a5183b5e 166 TIM1->CCR3 = volts_to_ticks(invt->v_c);
dicarloj 0:f899a5183b5e 167 }