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_v02.txt
- Committer:
- sinrab
- Date:
- 2019-06-06
- Revision:
- 10:60fa02641552
- Parent:
- 0:ed1ba99f7b14
File content as of revision 10:60fa02641552:
#include "mbed.h" #include "SPI_TFT_ILI9341.h" #include "Consolas26x49.h" #include "digi36x44.h" #include "Courier8x13.h" #include "Consolas19x35.h" #include "CourierNew13x23.h" SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc void grid(void); Timer t;// FPS //Ticker valueUI; InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл //----------------------------------------------------------------------------------------------------------- //----------- my functions ---------// void drawScreen1(void); // экран 1 void drawScreen2(void); // экран 2 void drawScreen3(void); // экран 3 void drawScreen4(void); // экран 4 void bootCold(void); // холодный старт void map(void); // масштабирование //--------------------------- float avgAin0(); // среднее значение с входа A0 float avgAin1(); // среднее значение с входа A1 float avgAin2(); // среднее значение с входа A2 float avgAin3(); // среднее значение с входа A3 float avgAin4(); // среднее значение с входа A4 float avgAin5(); // среднее значение с входа A5 //---- float in0 = 0; float in1 = 0; float in2 = 0; float in3 = 0; float in4 = 0; float in5 = 0; //---- float Ureal = 0; float Ireal = 0; float Uset = 0; float Iset = 0; float Uusb = 0; float Iusb = 0; //--------------------------- void dataProcessing(void); // обработка и подготовка данных с аналоговых входов void powerButton(void); // при нажатии кнопки питания void buttonUse(void); // обработка нажатий кнопок //----------------------------------------------------------------------------------------------------------- float a0a = 0.000677; // A0 - U бп - avg при 0 - нижняя точка float a0k = 33.61; // A0 - U бп - коэффициент - верхняя точка //--------------------------------------------------------------- float a1a = 0.0024; // A1 - I бп - avg при 0 - нижняя точка a1a = avgAin1() - 0.00004 int a1k = 3144; // A1 - I бп - коэффициент - верхняя точка a1k = 2000/(avgAin1() - a1a) при 2амперах //--------------------------------------------------------------- float a2a = 0.0024; // A2 - U уст - avg при 0 - нижняя точка float a2k = 4; // A2 - U уст - коэффициент - верхняя точка //--------------------------------------------------------------- float a3a = 0.0024; // A3 - I уст - avg при 0 - нижняя точка float a3k = 4; // A3 - I уст - коэффициент - верхняя точка //--------------------------------------------------------------- float a4a = 0.0024; // A4 - U usb - avg при 0 - нижняя точка float a4k = 2.0; // A4 - U usb - коэффициент - верхняя точка //--------------------------------------------------------------- float a5a = 0.0024; // A5 - I usb - avg при 0 - нижняя точка int a5k = 3144; // A5 - I usb - коэффициент - верхняя точка //--------------------------------------------------------------- float noisea0; //типа уровень шума (разница между минимум и максимум за 100 измерений) для А0 float noisea1; // - - для A1 float noisea2; // - - для A2 float noisea3; // - - для A3 float noisea4; // - - для A4 float noisea5; // - - для A5 //----------------------------------------------------------------------------------------------------------- DigitalIn buttonUp(D3); // Up DigitalIn buttonDown(D4); // Down DigitalIn buttonEnter(D5); // Enter int Screen=1; // по умолчанию грузим первое меню int complit=0; // в начале меню не прорисовано int pb=0; // для прорисовки кнопки int kline=15; // номер начальной строки в меню калибровки экран 4 //----------------------------------------------------------------------------------------------------------- DigitalOut powerMosfet(D2); // выход управления нагрузкой AnalogIn ainA0(A0); AnalogIn ainA1(A1); AnalogIn ainA2(A2); AnalogIn ainA3(A3); AnalogIn ainA4(A4); AnalogIn ainA5(A5); //BusOut unused(A5,A2,A3,A4); //------------------------------------------------------------------------------------------------------------ //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------ int main() //--------- Главная функция ---------// { powerMosfet = 0; // при включении выход выключен bootCold(); // холодный старт button.fall(&powerButton); while(1) { dataProcessing(); // обработка и подготовка данных с аналоговых входов buttonUse(); // обработка нажатий кнопок if (Screen == 1) drawScreen1(); if (Screen == 2) drawScreen2(); if (Screen == 3) drawScreen3(); if (Screen == 4) drawScreen4(); } } //--------- Главная функция ---------// //------------------------------------------------------------------------------------------------------------ //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------ void drawScreen1(void) // экран 1 { if (complit==0) { pb=0; TFT.set_orientation(3); TFT.background(Black); TFT.cls(); TFT.rect(0,0,319,239,0xECA7); //рамка TFT.rect(10,62,309,76,0x9000); //аналоговая 1 TFT.rect(10,137,309,151,0x9000); //авалоговая 2 //grid(); //int y = 51; //TFT.line(5,y,310,y, White); TFT.background(Black); TFT.foreground(0xECA7); // цвет слов TFT.set_font((unsigned char*) Consolas26x49); TFT.locate(185, 13); TFT.printf("V"); // U= TFT.locate(165, 88); TFT.printf("mA"); // I= complit = 1; // прорисовали! TFT.fillrect(230,10,304,53,Green); // c.v c.c TFT.fillrect(230,85,304,128,Green); TFT.background(Green); TFT.foreground(Black); TFT.set_font((unsigned char*) Consolas19x35); TFT.locate(241, 14); TFT.printf("C.V"); TFT.locate(241, 89); TFT.printf("C.C"); TFT.rect(10,160,105,232,0xECA7); TFT.fillrect(11,161,104,231,0x09E1); TFT.rect(112,160,207,232,0xECA7); TFT.rect(214,160,309,232,0xECA7); TFT.background(0x09E1); TFT.foreground(White); TFT.set_font((unsigned char*) CourierNew13x23); TFT.locate(11, 161); TFT.printf("10.4 W"); TFT.locate(11, 185); TFT.printf("00.42.58"); TFT.locate(11, 209); TFT.printf("42 'C"); } TFT.background(Black); TFT.foreground(Green); TFT.set_font((unsigned char*) digi36x44); TFT.locate(10, 10); TFT.printf("%05.2f", Ureal); // выводим значение с A0 (напряжение) TFT.locate(10, 85); TFT.printf("%04.0f", Ireal); // выводим значение с A1 (ток) if (powerMosfet==0 & pb==0) { // выводим OFF TFT.background(0x09E1); TFT.foreground(Black); TFT.fillrect(215,161,308,231,0x09E1); TFT.set_font((unsigned char*) Consolas26x49); TFT.locate(226, 174); TFT.printf("OFF"); pb=1; } if (powerMosfet==1 & pb==0) { // выводим ON TFT.background(Green); TFT.foreground(Black); TFT.fillrect(215,161,308,231,Green); TFT.set_font((unsigned char*) Consolas26x49); TFT.locate(237, 174); TFT.printf("ON"); pb=1; } } //------------------------------------------------------------------------------------------------------------ void drawScreen2(void) // экран 2 { if (complit==0) { TFT.background(Blue); TFT.foreground(Black); TFT.cls(); complit = 1; // прорисовали! } TFT.background(Blue); TFT.foreground(White); TFT.set_font((unsigned char*) Courier8x13); TFT.locate(0, 0); printf("--------- Data Analog In --------- \n"); printf("U.real A0 noise= %0.2f, avg= %0.5f \n", noisea0, in0); printf("U= %06.4f coeff. k=%0.4f, a=%0.6f \n", Ureal, a0k, a0a); // A0 U real printf("---------------------------------- \n"); printf("I.real A1 noise= %0.2f, avg= %0.5f \n", noisea1, in1); printf("I= %06.2f coeff. k=%0.0d, a=%0.4f \n", Ireal, a1k, a1a); // A1 I real printf("---------------------------------- \n"); printf("U.set A2 noise= %0.2f, avg= %0.5f \n", noisea2, in2); printf("U= %06.3f coeff. k=%0.0f, a=%0.4f \n", Uset, a2k, a2a); // A2 U set printf("---------------------------------- \n"); printf("I.set A3 noise= %0.2f, avg= %0.5f \n", noisea3, in3); printf("I= %06.1f coeff. k=%0.0f, a=%0.4f \n", Iset, a3k, a3a); // A3 I set printf("---------------------------------- \n"); printf("U.usb A4 noise= %0.2f, avg= %0.5f \n", noisea4, in4); printf("U= %06.3f coeff. k=%0.0f, a=%0.4f \n", Uusb, a4k, a4a); // A4 U usb printf("---------------------------------- \n"); printf("I.usb A5 noise= %0.2f, avg= %0.5f \n", noisea5, in5); printf("I= %06.1f coeff. k=%0.0d, a=%0.4f \n", Iusb, a5k, a5a); // A5 I usb } //------------------------------------------------------------------------------------------------------------ void drawScreen3(void) // экран 3 { TFT.background(Blue); TFT.foreground(Black); TFT.cls(); TFT.locate(0, 0); } //------------------------------------------------------------------------------------------------------------ void drawScreen4(void) // экран 4 калибровка { if (complit==0) { TFT.background(Black); TFT.foreground(White); TFT.cls(); complit = 1; // прорисовали! } //---------------------------------------------------------------- TFT.background(Black); TFT.foreground(White); TFT.locate(0, 0); TFT.set_font((unsigned char*) Courier8x13); printf(" Calibration. Enter - set. \n"); printf("--------------------------- \n"); //---------------------------------------------------------------- if (kline==1) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U real = %06.3f set zero \n", Ureal); // U real A0 zero //---------------------------------------------------------------- if (kline==2) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U real = %06.3f set up dot \n", Ureal); // U real A0 hi //---------------------------------------------------------------- if (kline==3) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I real = %06.1f set zero \n", Ireal); // I real A1 zero //---------------------------------------------------------------- if (kline==4) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I real = %06.1f set up dot \n", Ireal); // I real A1 hi //---------------------------------------------------------------- if (kline==5) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U set = %06.3f set zero \n", Uset); // U set A2 zero //---------------------------------------------------------------- if (kline==6) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U set = %06.3f set up dot \n", Uset); // U set A2 hi //---------------------------------------------------------------- if (kline==7) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I set = %06.1f set zero \n", Iset); // I set A3 zero //---------------------------------------------------------------- if (kline==8) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I set = %06.1f set up dot \n",Iset); // I set A3 hi //---------------------------------------------------------------- if (kline==9) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U usb = %06.3f set up dot \n", Uusb); // U usb A4 zero //---------------------------------------------------------------- if (kline==10) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" U usb = %06.3f set zero \n", Uusb); // U usb A4 hi //---------------------------------------------------------------- if (kline==11) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I usb = %06.1f set up dot \n", Iusb); // I usb A5 zero //---------------------------------------------------------------- if (kline==12) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" I usb = %06.1f set up dot \n", Iusb); // I usb A5 hi //---------------------------------------------------------------- if (kline==13) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" Load Default \n"); //---------------------------------------------------------------- if (kline==14) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" Save all to flash memory \n"); //---------------------------------------------------------------- if (kline==15) { TFT.background(Green); TFT.foreground(Black); } else { TFT.background(Black); TFT.foreground(White); } printf(" Exit \n"); //---------------------------------------------------------------- TFT.background(Black); TFT.foreground(White); printf("--------------------------- \n"); } //------------------------------------------------------------------------------------------------------------ void bootCold(void) { TFT.claim(stdout); // send stdout to the TFT display } //------------------------------------------------------------------------------------------------------------ long map(long x, long in_min, long in_max, long out_min, long out_max) // функция масштабирования { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } //------------------------------------------------------------------------------------------------------------ float avgAin0() // функция среднего значения с входа A0 { int m = 100; float value[m]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<m; i++) { value[i] = ainA0; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea0 = (max - min)*1000; return itg/m; } //------------------------------------------------------------------------------------------------------------ float avgAin1() // функция среднего значения с входа A1 { float value[100]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<100; i++) { value[i] = ainA1; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea1 = (max - min)*1000; return itg/100; } //------------------------------------------------------------------------------------------------------------ float avgAin2() // функция среднего значения с входа A2 { float value[100]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<100; i++) { value[i] = ainA2; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea2 = (max - min)*1000; return itg/100; } //------------------------------------------------------------------------------------------------------------ float avgAin3() // функция среднего значения с входа A3 { float value[100]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<100; i++) { value[i] = ainA3; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea3 = (max - min)*1000; return itg/100; } //------------------------------------------------------------------------------------------------------------ float avgAin4() // функция среднего значения с входа A4 { float value[100]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<100; i++) { value[i] = ainA4; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea4 = (max - min)*1000; return itg/100; } //------------------------------------------------------------------------------------------------------------ float avgAin5() // функция среднего значения с входа A5 { float value[100]; float max; float min; double itg; max = itg = 0.0; min = 3.3; for (int i=0; i<100; i++) { value[i] = ainA5; if (value[i] > max) max = value[i]; if (value[i] < min) min = value[i]; itg += value[i]; } noisea5 = (max - min)*1000; return itg/100; } /*/------------------------------------------------------------------------------------------------------------ void drawMainScale(void) { a int a = avg*1000; b = mapIOIO(c, 0, 100, 0, 220); TFT.fillrect(10, 10, (b+10), 20, Red); // аналоговая шкала 1 TFT.fillrect((b+10), 10, 230, 20, Black); } //------------------------------------------------------------------------------------------------------------*/ void powerButton(void) // при нажатии кнопки питания { powerMosfet=!powerMosfet; pb=0; } //------------------------------------------------------------------------------------------------------------ void dataProcessing(void) // обработка и подготовка данных с аналоговых входов { /*t.reset();// FPS t.start();// FPS*/ in0 = avgAin0(); in1 = avgAin1(); in2 = avgAin2(); in3 = avgAin3(); in4 = avgAin4(); in5 = avgAin5(); // A0 U real U = (avgAin0() - a0a) * a0k // A1 I real I = (avgAin1() - a1a) * a1k // A2 U set U = (avgAin2() - a2a) * a2k // A3 I set I = (avgAin3() - a3a) * a3k // A4 U usb U = (avgAin4() - a4a) * a4k // A5 I usb I = (avgAin5() - a5a) * a5k Ureal = a0k*(in0-a0a); Ireal = a1k*(in1-a1a); Uset = a2k*(in2-a2a); Iset = a3k*(in3-a3a); Uusb = a4k*(in4-a4a); Iusb = a5k*(in5-a5a); /*t.stop();// FPS TFT.background(Black);// FPS TFT.foreground(Green);// FPS TFT.set_font((unsigned char*) Courier8x13);// FPS TFT.locate(260,225);// FPS TFT.printf("%0.2f", (1/t.read()));// FPS*/ } //------------------------------------------------------------------------------------------------------------ void buttonUse(void) // обработка нажатий кнопок { int one=0; // для обработки одной кнопки за раз //------------------------------------------------------------------ if (Screen==1 & one==0) { //главный экран if (buttonEnter==0) { // Enter //wait(1); Screen=2; complit=0; } if (buttonDown==0) { // Down Screen=4; complit=0; } if (buttonUp==0) { // Up Screen=3; complit=0; } one=1; } //------------------------------------------------------------------ if (Screen==2 & one==0) { if (buttonEnter==0) { // Enter //wait(1); Screen=1; complit=0; } one=1; } //------------------------------------------------------------------ if (Screen==3 & one==0) { //экран меню общие настройки if (buttonEnter==0) { // Enter //wait(1); Screen=1; complit=0; } one=1; } //------------------------------------------------------------------ if (Screen==4 & one==0) { //экран меню Калибровка if (buttonEnter==0) { // Enter if (kline==1) a0a = in0 - 0.0001; if (kline==2) a0k = 20/(in0-a0a); if (kline==3) Screen=1; if (kline==4) Screen=1; if (kline==5) Screen=1; if (kline==6) Screen=1; if (kline==7) Screen=1; if (kline==8) Screen=1; if (kline==9) Screen=1; if (kline==10) Screen=1; if (kline==11) Screen=1; if (kline==12) Screen=1; if (kline==13) Screen=1; if (kline==14) Screen=1; if (kline==15) Screen=1; complit=0; } if (buttonUp==0) { // Up kline--; if (kline==0) kline=15; } if (buttonDown==0) { // Down kline++; if (kline==16) kline=1; } one=1; } //------------------------------------------------------------------ } //------------------------------------------------------------------------------------------------------------ void grid(void) { TFT.cls(); for (int i=0; i<240; i=i+5) { TFT.line(0,i,320,i, White); } for (int i=2; i<240; i=i+5) { TFT.line(4,i,320,i, White); } for (int i=3; i<240; i=i+5) { TFT.line(4,i,320,i, White); } }