Austin Brown
/
2171_MicroLab_3
Make 2171 Great Again
main.cpp@1:f1d2d02d724d, 2019-12-04 (annotated)
- Committer:
- austinbrown124
- Date:
- Wed Dec 04 02:36:34 2019 +0000
- Revision:
- 1:f1d2d02d724d
- Parent:
- 0:d229bc2fa375
Commit 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
austinbrown124 | 0:d229bc2fa375 | 1 | #include "mbed.h" |
austinbrown124 | 0:d229bc2fa375 | 2 | #include "HWsetup.h" |
austinbrown124 | 0:d229bc2fa375 | 3 | |
austinbrown124 | 0:d229bc2fa375 | 4 | //MicroLab, simplified. No DSA. |
austinbrown124 | 0:d229bc2fa375 | 5 | |
austinbrown124 | 0:d229bc2fa375 | 6 | |
austinbrown124 | 0:d229bc2fa375 | 7 | DigitalOut ledpin(LED1); // LED output |
austinbrown124 | 0:d229bc2fa375 | 8 | AnalogOut dac_1(PA_4); // DAC output pin |
austinbrown124 | 0:d229bc2fa375 | 9 | DigitalOut comp_time(PA_12); // D2 |
austinbrown124 | 0:d229bc2fa375 | 10 | DigitalOut ref_trig(D6); |
austinbrown124 | 0:d229bc2fa375 | 11 | |
austinbrown124 | 0:d229bc2fa375 | 12 | |
austinbrown124 | 0:d229bc2fa375 | 13 | |
austinbrown124 | 0:d229bc2fa375 | 14 | Serial pc(PA_2, PA_3); |
austinbrown124 | 0:d229bc2fa375 | 15 | int Lcount = 0; |
austinbrown124 | 0:d229bc2fa375 | 16 | float U_ref = 0.0f; |
austinbrown124 | 0:d229bc2fa375 | 17 | float U = 0.0f; |
austinbrown124 | 0:d229bc2fa375 | 18 | float Uv = 0.0f; |
austinbrown124 | 0:d229bc2fa375 | 19 | float Y = 0.0f; |
austinbrown124 | 0:d229bc2fa375 | 20 | int Yint = 0; |
austinbrown124 | 0:d229bc2fa375 | 21 | float ctrl_error = 0.0f; |
austinbrown124 | 0:d229bc2fa375 | 22 | |
austinbrown124 | 0:d229bc2fa375 | 23 | |
austinbrown124 | 0:d229bc2fa375 | 24 | extern "C" void TIM1_UP_TIM16_IRQHandler(void) { |
austinbrown124 | 0:d229bc2fa375 | 25 | |
austinbrown124 | 0:d229bc2fa375 | 26 | if (TIM1->SR & TIM_SR_UIF ) { |
austinbrown124 | 0:d229bc2fa375 | 27 | //comp_time = 1; |
austinbrown124 | 0:d229bc2fa375 | 28 | if ( TIM1->CR1 & TIM_CR1_DIR ) { |
austinbrown124 | 0:d229bc2fa375 | 29 | |
austinbrown124 | 0:d229bc2fa375 | 30 | comp_time = 1; |
austinbrown124 | 0:d229bc2fa375 | 31 | |
austinbrown124 | 0:d229bc2fa375 | 32 | while ((ADC1->ISR) & ADC_ISR_EOC == 0 ) {} // wait til ADC finishes conversion |
austinbrown124 | 0:d229bc2fa375 | 33 | DAC->DHR12R1 = (ADC1->DR); // set ADC value to DAC |
austinbrown124 | 0:d229bc2fa375 | 34 | |
austinbrown124 | 0:d229bc2fa375 | 35 | //set reference |
austinbrown124 | 1:f1d2d02d724d | 36 | if (Lcount == 250) { U_ref = 0.050f; ref_trig = 1;} //50 mA |
austinbrown124 | 1:f1d2d02d724d | 37 | if (Lcount == 500) {Lcount = 0, U_ref = 0.025f; ref_trig = 0;} //25 mA |
austinbrown124 | 0:d229bc2fa375 | 38 | Lcount++; |
austinbrown124 | 0:d229bc2fa375 | 39 | |
austinbrown124 | 0:d229bc2fa375 | 40 | |
austinbrown124 | 0:d229bc2fa375 | 41 | // fix these |
austinbrown124 | 0:d229bc2fa375 | 42 | float ADC_gain = 1.0f; |
austinbrown124 | 0:d229bc2fa375 | 43 | float Current_gain = 1.0f; |
austinbrown124 | 0:d229bc2fa375 | 44 | Uv = int(ADC1->DR) * ADC_gain; // get ADC input in volts |
austinbrown124 | 0:d229bc2fa375 | 45 | U = Uv * Current_gain; // get U in amps, divide by resistor divider gain |
austinbrown124 | 0:d229bc2fa375 | 46 | |
austinbrown124 | 0:d229bc2fa375 | 47 | |
austinbrown124 | 0:d229bc2fa375 | 48 | |
austinbrown124 | 0:d229bc2fa375 | 49 | //controller |
austinbrown124 | 0:d229bc2fa375 | 50 | ctrl_error = U_ref-U; |
austinbrown124 | 0:d229bc2fa375 | 51 | |
austinbrown124 | 0:d229bc2fa375 | 52 | // Bang-bang controller is written below. Replace this with your PI controller. |
austinbrown124 | 0:d229bc2fa375 | 53 | |
austinbrown124 | 1:f1d2d02d724d | 54 | if (U > 4096*0.4f) { Y = 0.3f*1440.0f; } // ADC readings scaled correctly |
austinbrown124 | 1:f1d2d02d724d | 55 | if (U < 4096*0.2f) { Y = 0.7f*1440.0f; } |
austinbrown124 | 0:d229bc2fa375 | 56 | |
austinbrown124 | 0:d229bc2fa375 | 57 | |
austinbrown124 | 0:d229bc2fa375 | 58 | // end controller |
austinbrown124 | 0:d229bc2fa375 | 59 | |
austinbrown124 | 0:d229bc2fa375 | 60 | float PWM_gain = 1.0f; // fix this |
austinbrown124 | 0:d229bc2fa375 | 61 | |
austinbrown124 | 0:d229bc2fa375 | 62 | Yint = Y*PWM_gain; //convert Y to integer and scale |
austinbrown124 | 0:d229bc2fa375 | 63 | if (Yint > 1430) { Yint = 1430; } // constrain |
austinbrown124 | 0:d229bc2fa375 | 64 | if (Yint < 0) { Yint = 0; } |
austinbrown124 | 0:d229bc2fa375 | 65 | |
austinbrown124 | 0:d229bc2fa375 | 66 | TIM1->CCR1 = Yint; // set duty cycle |
austinbrown124 | 0:d229bc2fa375 | 67 | |
austinbrown124 | 0:d229bc2fa375 | 68 | |
austinbrown124 | 0:d229bc2fa375 | 69 | |
austinbrown124 | 0:d229bc2fa375 | 70 | |
austinbrown124 | 0:d229bc2fa375 | 71 | } |
austinbrown124 | 0:d229bc2fa375 | 72 | comp_time = 0; |
austinbrown124 | 0:d229bc2fa375 | 73 | } |
austinbrown124 | 0:d229bc2fa375 | 74 | TIM1->SR = 0x0; |
austinbrown124 | 0:d229bc2fa375 | 75 | } |
austinbrown124 | 0:d229bc2fa375 | 76 | |
austinbrown124 | 0:d229bc2fa375 | 77 | |
austinbrown124 | 0:d229bc2fa375 | 78 | int main() { |
austinbrown124 | 0:d229bc2fa375 | 79 | |
austinbrown124 | 0:d229bc2fa375 | 80 | wait_ms(200); |
austinbrown124 | 0:d229bc2fa375 | 81 | pc.baud(115200); |
austinbrown124 | 0:d229bc2fa375 | 82 | pc.printf(" bumping clock "); // set micro freq to 72MHz |
austinbrown124 | 0:d229bc2fa375 | 83 | BumpClock(); // must be done before PWM setup, otherwise RCC gets confused |
austinbrown124 | 0:d229bc2fa375 | 84 | pc.baud(102400); // actually 115200 |
austinbrown124 | 0:d229bc2fa375 | 85 | pc.printf(" clock ready "); |
austinbrown124 | 0:d229bc2fa375 | 86 | wait_ms(50); |
austinbrown124 | 0:d229bc2fa375 | 87 | Init_All_HW(); // Setup PWM, ADC |
austinbrown124 | 0:d229bc2fa375 | 88 | wait_ms(50); |
austinbrown124 | 0:d229bc2fa375 | 89 | Init_ADC_Tim_Sync(); |
austinbrown124 | 0:d229bc2fa375 | 90 | wait_ms(5); |
austinbrown124 | 0:d229bc2fa375 | 91 | TIM1->BDTR |= TIM_BDTR_MOE; // enable switching |
austinbrown124 | 0:d229bc2fa375 | 92 | TIM1->DIER |= TIM_DIER_UIE; // start interrupt |
austinbrown124 | 0:d229bc2fa375 | 93 | wait_ms(5); |
austinbrown124 | 0:d229bc2fa375 | 94 | |
austinbrown124 | 0:d229bc2fa375 | 95 | while(1) { |
austinbrown124 | 0:d229bc2fa375 | 96 | //while(1) {} |
austinbrown124 | 0:d229bc2fa375 | 97 | |
austinbrown124 | 0:d229bc2fa375 | 98 | |
austinbrown124 | 0:d229bc2fa375 | 99 | ledpin = !ledpin; // toggle LED |
austinbrown124 | 0:d229bc2fa375 | 100 | pc.printf(" ADC raw: %i ",ADC1->DR); |
austinbrown124 | 0:d229bc2fa375 | 101 | pc.printf("U, amps: %f ",U); |
austinbrown124 | 0:d229bc2fa375 | 102 | pc.printf(" Y, volts: %f ",Y); |
austinbrown124 | 0:d229bc2fa375 | 103 | pc.printf(" Y, PWM counts: %i ",Yint); |
austinbrown124 | 0:d229bc2fa375 | 104 | pc.printf(" \r\n"); |
austinbrown124 | 0:d229bc2fa375 | 105 | |
austinbrown124 | 0:d229bc2fa375 | 106 | |
austinbrown124 | 0:d229bc2fa375 | 107 | |
austinbrown124 | 0:d229bc2fa375 | 108 | |
austinbrown124 | 0:d229bc2fa375 | 109 | } |
austinbrown124 | 0:d229bc2fa375 | 110 | } |