Make 2171 Great Again

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }