Jared DiCarlo
/
george
motor controller
io.cpp@0:f899a5183b5e, 2016-10-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |