Linear stabilizer voltage and current on lm358 and transictor. Digital control and indication on stm32f103rbt and tft01-22sp (ili9341). https://www.youtube.com/watch?v=DLC3KEtlr9I https://radiokot.ru/forum/viewtopic.php?f=11&t=112440
Dependencies: mbed TFT_fonts SPI_TFT_ILI9341 beep _24LCXXX
main_v01.txt@10:60fa02641552, 2019-06-06 (annotated)
- Committer:
- sinrab
- Date:
- Thu Jun 06 10:22:13 2019 +0000
- Revision:
- 10:60fa02641552
- Parent:
- 0:ed1ba99f7b14
v1.0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sinrab | 0:ed1ba99f7b14 | 1 | #include "mbed.h" |
sinrab | 0:ed1ba99f7b14 | 2 | #include "SPI_TFT_ILI9341.h" |
sinrab | 0:ed1ba99f7b14 | 3 | #include "Consolas26x49.h" |
sinrab | 0:ed1ba99f7b14 | 4 | #include "digi36x44.h" |
sinrab | 0:ed1ba99f7b14 | 5 | SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc |
sinrab | 0:ed1ba99f7b14 | 6 | void grid(void); |
sinrab | 0:ed1ba99f7b14 | 7 | //Ticker valueUI; |
sinrab | 0:ed1ba99f7b14 | 8 | InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл |
sinrab | 0:ed1ba99f7b14 | 9 | //----------------------------------------------------------------------------------------------------------- |
sinrab | 0:ed1ba99f7b14 | 10 | //----------- my functions ---------// |
sinrab | 0:ed1ba99f7b14 | 11 | void drawScreenStatic(void); // прорисовка постоянных элементов |
sinrab | 0:ed1ba99f7b14 | 12 | void drawScreenAction(void); // прорисовка показаний |
sinrab | 0:ed1ba99f7b14 | 13 | void bootCold(void); // холодный старт |
sinrab | 0:ed1ba99f7b14 | 14 | void map(void); // масштабирование |
sinrab | 0:ed1ba99f7b14 | 15 | float avgAin0(); // среднее значение с входа A0 |
sinrab | 0:ed1ba99f7b14 | 16 | float avgAin1(); // среднее значение с входа A1 |
sinrab | 0:ed1ba99f7b14 | 17 | void dataProcessing(void); // обработка и подготовка данных с аналоговых входов |
sinrab | 0:ed1ba99f7b14 | 18 | void powerButton(void); // при нажатии кнопки питания |
sinrab | 0:ed1ba99f7b14 | 19 | void buttonUse(void); // обработка нажатий кнопок |
sinrab | 0:ed1ba99f7b14 | 20 | //----------------------------------------------------------------------------------------------------------- |
sinrab | 0:ed1ba99f7b14 | 21 | float h = 0.0024; // сюда среднее значение при нулевом токе |
sinrab | 0:ed1ba99f7b14 | 22 | int j = 3144; // сюда коэффициент |
sinrab | 0:ed1ba99f7b14 | 23 | //----------------------------------------------------------------------------------------------------------- |
sinrab | 0:ed1ba99f7b14 | 24 | DigitalIn buttonUp(D3); // Up |
sinrab | 0:ed1ba99f7b14 | 25 | DigitalIn buttonDown(D4); // Down |
sinrab | 0:ed1ba99f7b14 | 26 | DigitalIn buttonEnter(D5); // Enter |
sinrab | 0:ed1ba99f7b14 | 27 | int menu=1; // по умолчанию грузим первое меню |
sinrab | 0:ed1ba99f7b14 | 28 | int complit=0; // в начале меню не прорисовано |
sinrab | 0:ed1ba99f7b14 | 29 | int pb=0; // для прорисовки кнопки |
sinrab | 0:ed1ba99f7b14 | 30 | //----------------------------------------------------------------------------------------------------------- |
sinrab | 0:ed1ba99f7b14 | 31 | DigitalOut powerMosfet(D2); // выход управления нагрузкой |
sinrab | 0:ed1ba99f7b14 | 32 | AnalogIn ainA0(A0); |
sinrab | 0:ed1ba99f7b14 | 33 | AnalogIn ainA1(A1); |
sinrab | 0:ed1ba99f7b14 | 34 | BusOut unused(A5,A2,A3,A4); |
sinrab | 0:ed1ba99f7b14 | 35 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 36 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 37 | int main() //--------- Главная функция ---------// |
sinrab | 0:ed1ba99f7b14 | 38 | { |
sinrab | 0:ed1ba99f7b14 | 39 | powerMosfet = 0; // при включении выход выключен |
sinrab | 0:ed1ba99f7b14 | 40 | bootCold(); // холодный старт |
sinrab | 0:ed1ba99f7b14 | 41 | button.fall(&powerButton); |
sinrab | 0:ed1ba99f7b14 | 42 | //valueUI.attach(&drawMenuMainValues, 0.1); |
sinrab | 0:ed1ba99f7b14 | 43 | |
sinrab | 0:ed1ba99f7b14 | 44 | while(1) { |
sinrab | 0:ed1ba99f7b14 | 45 | dataProcessing(); // обработка и подготовка данных с аналоговых входов |
sinrab | 0:ed1ba99f7b14 | 46 | buttonUse(); // обработка нажатий кнопок |
sinrab | 0:ed1ba99f7b14 | 47 | drawScreenStatic(); |
sinrab | 0:ed1ba99f7b14 | 48 | drawScreenAction(); |
sinrab | 0:ed1ba99f7b14 | 49 | } |
sinrab | 0:ed1ba99f7b14 | 50 | } //--------- Главная функция ---------// |
sinrab | 0:ed1ba99f7b14 | 51 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 52 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 53 | |
sinrab | 0:ed1ba99f7b14 | 54 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 55 | void drawScreenStatic(void) // отрисовка главного экрана |
sinrab | 0:ed1ba99f7b14 | 56 | { |
sinrab | 0:ed1ba99f7b14 | 57 | if (menu==1 & complit==0) { |
sinrab | 0:ed1ba99f7b14 | 58 | pb=0; |
sinrab | 0:ed1ba99f7b14 | 59 | TFT.set_orientation(3); |
sinrab | 0:ed1ba99f7b14 | 60 | TFT.background(Black); |
sinrab | 0:ed1ba99f7b14 | 61 | TFT.cls(); |
sinrab | 0:ed1ba99f7b14 | 62 | TFT.rect(0,0,319,239,0xECA7); //рамка |
sinrab | 0:ed1ba99f7b14 | 63 | TFT.rect(10,62,309,76,0x9000); //аналоговая 1 |
sinrab | 0:ed1ba99f7b14 | 64 | TFT.rect(10,137,309,151,0x9000); //авалоговая 2 |
sinrab | 0:ed1ba99f7b14 | 65 | //grid(); |
sinrab | 0:ed1ba99f7b14 | 66 | //int y = 51; |
sinrab | 0:ed1ba99f7b14 | 67 | //TFT.line(5,y,310,y, White); |
sinrab | 0:ed1ba99f7b14 | 68 | TFT.background(Black); |
sinrab | 0:ed1ba99f7b14 | 69 | TFT.foreground(0xECA7); // цвет слов |
sinrab | 0:ed1ba99f7b14 | 70 | TFT.set_font((unsigned char*) Consolas26x49); |
sinrab | 0:ed1ba99f7b14 | 71 | TFT.locate(185, 13); |
sinrab | 0:ed1ba99f7b14 | 72 | TFT.printf("V"); // U= |
sinrab | 0:ed1ba99f7b14 | 73 | TFT.locate(165, 88); |
sinrab | 0:ed1ba99f7b14 | 74 | TFT.printf("mA"); // I= |
sinrab | 0:ed1ba99f7b14 | 75 | complit = 1; // прорисовали! |
sinrab | 0:ed1ba99f7b14 | 76 | } |
sinrab | 0:ed1ba99f7b14 | 77 | if (menu==2 & complit==0) { |
sinrab | 0:ed1ba99f7b14 | 78 | TFT.background(0xECA7); |
sinrab | 0:ed1ba99f7b14 | 79 | TFT.foreground(Black); |
sinrab | 0:ed1ba99f7b14 | 80 | TFT.cls(); |
sinrab | 0:ed1ba99f7b14 | 81 | TFT.rect(1,1,318,238,Red); |
sinrab | 0:ed1ba99f7b14 | 82 | complit = 1; // прорисовали! |
sinrab | 0:ed1ba99f7b14 | 83 | } |
sinrab | 0:ed1ba99f7b14 | 84 | } |
sinrab | 0:ed1ba99f7b14 | 85 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 86 | void drawScreenAction(void) // отрисовка главного экрана переменные |
sinrab | 0:ed1ba99f7b14 | 87 | { |
sinrab | 0:ed1ba99f7b14 | 88 | if (menu==1) { |
sinrab | 0:ed1ba99f7b14 | 89 | TFT.background(Black); |
sinrab | 0:ed1ba99f7b14 | 90 | TFT.foreground(Green); |
sinrab | 0:ed1ba99f7b14 | 91 | |
sinrab | 0:ed1ba99f7b14 | 92 | TFT.set_font((unsigned char*) digi36x44); |
sinrab | 0:ed1ba99f7b14 | 93 | TFT.locate(10, 10); |
sinrab | 0:ed1ba99f7b14 | 94 | TFT.printf("%0.2f", avgAin0()*25); // выводим значение с A0 (напряжение) |
sinrab | 0:ed1ba99f7b14 | 95 | TFT.locate(10, 85); |
sinrab | 0:ed1ba99f7b14 | 96 | TFT.printf("%d", int(avgAin1()*2200)); // выводим значение с A1 (ток) |
sinrab | 0:ed1ba99f7b14 | 97 | |
sinrab | 0:ed1ba99f7b14 | 98 | if (powerMosfet==0 & pb==0) { |
sinrab | 0:ed1ba99f7b14 | 99 | TFT.background(0x09E1); |
sinrab | 0:ed1ba99f7b14 | 100 | TFT.foreground(Black); |
sinrab | 0:ed1ba99f7b14 | 101 | TFT.fillrect(225,160,309,231,0x09E1); |
sinrab | 0:ed1ba99f7b14 | 102 | TFT.set_font((unsigned char*) Consolas26x49); |
sinrab | 0:ed1ba99f7b14 | 103 | TFT.locate(231, 173); |
sinrab | 0:ed1ba99f7b14 | 104 | TFT.printf("OFF"); |
sinrab | 0:ed1ba99f7b14 | 105 | pb=1; |
sinrab | 0:ed1ba99f7b14 | 106 | } |
sinrab | 0:ed1ba99f7b14 | 107 | if (powerMosfet==1 & pb==0) { |
sinrab | 0:ed1ba99f7b14 | 108 | TFT.background(Green); |
sinrab | 0:ed1ba99f7b14 | 109 | TFT.foreground(Black); |
sinrab | 0:ed1ba99f7b14 | 110 | TFT.fillrect(225,160,309,231,Green); |
sinrab | 0:ed1ba99f7b14 | 111 | TFT.set_font((unsigned char*) Consolas26x49); |
sinrab | 0:ed1ba99f7b14 | 112 | TFT.locate(242, 173); |
sinrab | 0:ed1ba99f7b14 | 113 | TFT.printf("ON"); |
sinrab | 0:ed1ba99f7b14 | 114 | pb=1; |
sinrab | 0:ed1ba99f7b14 | 115 | } |
sinrab | 0:ed1ba99f7b14 | 116 | |
sinrab | 0:ed1ba99f7b14 | 117 | } |
sinrab | 0:ed1ba99f7b14 | 118 | if (menu==2) { |
sinrab | 0:ed1ba99f7b14 | 119 | TFT.background(Black); |
sinrab | 0:ed1ba99f7b14 | 120 | TFT.foreground(White); |
sinrab | 0:ed1ba99f7b14 | 121 | TFT.locate(10, 110); |
sinrab | 0:ed1ba99f7b14 | 122 | TFT.printf("menu 2"); |
sinrab | 0:ed1ba99f7b14 | 123 | } |
sinrab | 0:ed1ba99f7b14 | 124 | } |
sinrab | 0:ed1ba99f7b14 | 125 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 126 | void bootCold(void) |
sinrab | 0:ed1ba99f7b14 | 127 | { |
sinrab | 0:ed1ba99f7b14 | 128 | TFT.claim(stdout); // send stdout to the TFT display |
sinrab | 0:ed1ba99f7b14 | 129 | |
sinrab | 0:ed1ba99f7b14 | 130 | } |
sinrab | 0:ed1ba99f7b14 | 131 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 132 | long map(long x, long in_min, long in_max, long out_min, long out_max) // функция масштабирования |
sinrab | 0:ed1ba99f7b14 | 133 | { |
sinrab | 0:ed1ba99f7b14 | 134 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
sinrab | 0:ed1ba99f7b14 | 135 | } |
sinrab | 0:ed1ba99f7b14 | 136 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 137 | float avgAin0() // функция среднего значения с входа A0 |
sinrab | 0:ed1ba99f7b14 | 138 | { |
sinrab | 0:ed1ba99f7b14 | 139 | float value[100]; |
sinrab | 0:ed1ba99f7b14 | 140 | float max; |
sinrab | 0:ed1ba99f7b14 | 141 | float min; |
sinrab | 0:ed1ba99f7b14 | 142 | double itg; |
sinrab | 0:ed1ba99f7b14 | 143 | max = itg = 0.0; |
sinrab | 0:ed1ba99f7b14 | 144 | min = 3.3; |
sinrab | 0:ed1ba99f7b14 | 145 | for (int i=0; i<100; i++) { |
sinrab | 0:ed1ba99f7b14 | 146 | value[i] = ainA0; |
sinrab | 0:ed1ba99f7b14 | 147 | if (value[i] > max) max = value[i]; |
sinrab | 0:ed1ba99f7b14 | 148 | if (value[i] < min) min = value[i]; |
sinrab | 0:ed1ba99f7b14 | 149 | itg += value[i]; |
sinrab | 0:ed1ba99f7b14 | 150 | } |
sinrab | 0:ed1ba99f7b14 | 151 | return itg/100; |
sinrab | 0:ed1ba99f7b14 | 152 | } |
sinrab | 0:ed1ba99f7b14 | 153 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 154 | float avgAin1() // функция среднего значения с входа A1 |
sinrab | 0:ed1ba99f7b14 | 155 | { |
sinrab | 0:ed1ba99f7b14 | 156 | float value[100]; |
sinrab | 0:ed1ba99f7b14 | 157 | float max; |
sinrab | 0:ed1ba99f7b14 | 158 | float min; |
sinrab | 0:ed1ba99f7b14 | 159 | double itg; |
sinrab | 0:ed1ba99f7b14 | 160 | max = itg = 0.0; |
sinrab | 0:ed1ba99f7b14 | 161 | min = 3.3; |
sinrab | 0:ed1ba99f7b14 | 162 | for (int i=0; i<100; i++) { |
sinrab | 0:ed1ba99f7b14 | 163 | value[i] = ainA1; |
sinrab | 0:ed1ba99f7b14 | 164 | if (value[i] > max) max = value[i]; |
sinrab | 0:ed1ba99f7b14 | 165 | if (value[i] < min) min = value[i]; |
sinrab | 0:ed1ba99f7b14 | 166 | itg += value[i]; |
sinrab | 0:ed1ba99f7b14 | 167 | } |
sinrab | 0:ed1ba99f7b14 | 168 | return itg/100; |
sinrab | 0:ed1ba99f7b14 | 169 | } |
sinrab | 0:ed1ba99f7b14 | 170 | /*/------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 171 | void drawMainScale(void) { |
sinrab | 0:ed1ba99f7b14 | 172 | a |
sinrab | 0:ed1ba99f7b14 | 173 | int a = avg*1000; |
sinrab | 0:ed1ba99f7b14 | 174 | b = mapIOIO(c, 0, 100, 0, 220); |
sinrab | 0:ed1ba99f7b14 | 175 | |
sinrab | 0:ed1ba99f7b14 | 176 | TFT.fillrect(10, 10, (b+10), 20, Red); // аналоговая шкала 1 |
sinrab | 0:ed1ba99f7b14 | 177 | TFT.fillrect((b+10), 10, 230, 20, Black); |
sinrab | 0:ed1ba99f7b14 | 178 | } |
sinrab | 0:ed1ba99f7b14 | 179 | //------------------------------------------------------------------------------------------------------------*/ |
sinrab | 0:ed1ba99f7b14 | 180 | void powerButton(void) // при нажатии кнопки питания |
sinrab | 0:ed1ba99f7b14 | 181 | { |
sinrab | 0:ed1ba99f7b14 | 182 | powerMosfet=!powerMosfet; |
sinrab | 0:ed1ba99f7b14 | 183 | pb=0; |
sinrab | 0:ed1ba99f7b14 | 184 | } |
sinrab | 0:ed1ba99f7b14 | 185 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 186 | void dataProcessing(void) // обработка и подготовка данных с аналоговых входов |
sinrab | 0:ed1ba99f7b14 | 187 | { |
sinrab | 0:ed1ba99f7b14 | 188 | |
sinrab | 0:ed1ba99f7b14 | 189 | } |
sinrab | 0:ed1ba99f7b14 | 190 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 191 | void buttonUse(void) // обработка нажатий кнопок |
sinrab | 0:ed1ba99f7b14 | 192 | { |
sinrab | 0:ed1ba99f7b14 | 193 | //---------------------------- |
sinrab | 0:ed1ba99f7b14 | 194 | int one=0; // для обработки одной кнопки за раз |
sinrab | 0:ed1ba99f7b14 | 195 | if (menu==1 & one==0) { |
sinrab | 0:ed1ba99f7b14 | 196 | if (buttonEnter==0) { |
sinrab | 0:ed1ba99f7b14 | 197 | //wait(1); |
sinrab | 0:ed1ba99f7b14 | 198 | menu=2; |
sinrab | 0:ed1ba99f7b14 | 199 | complit=0; |
sinrab | 0:ed1ba99f7b14 | 200 | } |
sinrab | 0:ed1ba99f7b14 | 201 | if (buttonDown==0) { |
sinrab | 0:ed1ba99f7b14 | 202 | menu=3; |
sinrab | 0:ed1ba99f7b14 | 203 | complit=0; |
sinrab | 0:ed1ba99f7b14 | 204 | } |
sinrab | 0:ed1ba99f7b14 | 205 | one=1; |
sinrab | 0:ed1ba99f7b14 | 206 | } |
sinrab | 0:ed1ba99f7b14 | 207 | //---------------------------- |
sinrab | 0:ed1ba99f7b14 | 208 | if (menu==2 & one==0) { |
sinrab | 0:ed1ba99f7b14 | 209 | if (buttonEnter==0) { |
sinrab | 0:ed1ba99f7b14 | 210 | //wait(1); |
sinrab | 0:ed1ba99f7b14 | 211 | menu=1; |
sinrab | 0:ed1ba99f7b14 | 212 | complit=0; |
sinrab | 0:ed1ba99f7b14 | 213 | } |
sinrab | 0:ed1ba99f7b14 | 214 | one=1; |
sinrab | 0:ed1ba99f7b14 | 215 | } |
sinrab | 0:ed1ba99f7b14 | 216 | //---------------------------- |
sinrab | 0:ed1ba99f7b14 | 217 | if (menu==3 & one==0) { |
sinrab | 0:ed1ba99f7b14 | 218 | if (buttonEnter==0) { |
sinrab | 0:ed1ba99f7b14 | 219 | //wait(1); |
sinrab | 0:ed1ba99f7b14 | 220 | menu=1; |
sinrab | 0:ed1ba99f7b14 | 221 | complit=0; |
sinrab | 0:ed1ba99f7b14 | 222 | } |
sinrab | 0:ed1ba99f7b14 | 223 | one=1; |
sinrab | 0:ed1ba99f7b14 | 224 | } |
sinrab | 0:ed1ba99f7b14 | 225 | } |
sinrab | 0:ed1ba99f7b14 | 226 | //------------------------------------------------------------------------------------------------------------ |
sinrab | 0:ed1ba99f7b14 | 227 | void grid(void) |
sinrab | 0:ed1ba99f7b14 | 228 | { |
sinrab | 0:ed1ba99f7b14 | 229 | TFT.cls(); |
sinrab | 0:ed1ba99f7b14 | 230 | for (int i=0; i<240; i=i+5) { |
sinrab | 0:ed1ba99f7b14 | 231 | TFT.line(0,i,320,i, White); |
sinrab | 0:ed1ba99f7b14 | 232 | } |
sinrab | 0:ed1ba99f7b14 | 233 | for (int i=2; i<240; i=i+5) { |
sinrab | 0:ed1ba99f7b14 | 234 | TFT.line(4,i,320,i, White); |
sinrab | 0:ed1ba99f7b14 | 235 | } |
sinrab | 0:ed1ba99f7b14 | 236 | for (int i=3; i<240; i=i+5) { |
sinrab | 0:ed1ba99f7b14 | 237 | TFT.line(4,i,320,i, White); |
sinrab | 0:ed1ba99f7b14 | 238 | } |
sinrab | 0:ed1ba99f7b14 | 239 | |
sinrab | 0:ed1ba99f7b14 | 240 | } |