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

Revision:
5:0b3c71d7e475
Parent:
4:776f59129c24
Child:
6:88e92896a3a1
Child:
7:8410439dee73
--- a/main.cpp	Wed Jan 21 17:34:22 2015 +0000
+++ b/main.cpp	Wed Apr 08 10:55:25 2015 +0000
@@ -32,7 +32,7 @@
 #define color_scale1 0x3320           // шкала U
 #define color_scale2 0x9A60           // шкала I
 //----------------------------------
-SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
+SPI_TFT_ILI9341 TFT(PB_15, PB_14, PB_13, PB_12, PC_7, PC_6,"TFT"); // mosi, miso, sclk, cs, reset, dc
 void grid(void);
 Timer fps;// FPS
 Timeout timerforfanstart; //таймер для запуска мотора
@@ -41,9 +41,10 @@
 int fst=0;
 int fst2=0;
 //Ticker valueUI;
-InterruptIn button(A4); // кнопка питания вкл\выкл
-Beep buzzer(D5);        // звук
-I2C i2c(PB_9, PB_8);            // sda, scl для флэш памяти
+InterruptIn button(PB_9); // кнопка питания вкл\выкл
+Beep buzzer(PB_3);        // звук
+//I2C i2c(PC_9, PA_8);            // sda, scl для флэш памяти для f401 
+I2C i2c(PB_11, PB_10);          // sda, scl для флэш памяти для f103
 _24LCXXX eeprom(&i2c, 0x50);
 //----------------------------------------------------------------------------------------------------------- Ввести в меню опцию коррекции падения напряжения на токоизмерительном шунте.
 int t;        // секунд с момента включения
@@ -132,9 +133,9 @@
 float noisea2; // - - для A2
 float noisea3; // - - для A3
 //-----------------------------------------------------------------------------------------------------------
-DigitalIn buttonUp(D3);     // Up
-DigitalIn buttonDown(D2);   // Down
-DigitalIn buttonEnter(A5);  // Enter
+DigitalIn buttonUp(PB_8);     // Up
+DigitalIn buttonDown(PB_6);   // Down
+DigitalIn buttonEnter(PB_7);  // Enter
 int Screen=1;               // по умолчанию грузим первое меню
 int complit=0;              // в начале меню не прорисовано
 int pb=0;                   // для прорисовки кнопки
@@ -159,22 +160,24 @@
 int cs=0;               // короткое замыкание
 int csp=0;              // для одной прорисовки короткого замыкания
 float brightness = 1.0f; //яркость экрана
-PwmOut pinbrightness(D6);    // выход на ключ регулировки яркости экрана
+PwmOut pinbrightness(PB_5);    // выход на ключ регулировки яркости экрана
 float fanspeed = 0.0f;
-PwmOut fan(D7);              // выход вентилятора
+PwmOut fan(PB_4);              // выход вентилятора
+//PwmOut fan2(PA_15);
+//float fanspeed2 = 0.8f;
 int temperature = 25;        // текущая температура
-int screensaver=0; // заставка 0 - нет, 1 - часы, 2- ...
-int beeper=0; //бипер выключен
+int screensaver=0;           // заставка 0 - нет, 1 - часы, 2- ...
+int beeper=0;                //бипер выключен
 //-----------------------------------------------------------------------------------------------------------
-DigitalOut powerMosfet(D4);         // выход управления нагрузкой
-DigitalIn cc(PC_5); //вход СС    0 - СС, 1 - CV
+DigitalOut powerMosfet(PC_11);         // выход управления нагрузкой
+DigitalIn cc(PC_10); //вход СС    0 - СС, 1 - CV
 int ccc=0;
-DigitalOut ledcc(PC_6);       // светодиод C.C
-DigitalOut ledshort(PC_8);   // светодиод КЗ
-AnalogIn  ainA0(A0);
-AnalogIn  ainA1(A1);
-AnalogIn  ainA2(A2);
-AnalogIn  ainA3(A3);
+DigitalOut ledcc(PD_2);       // светодиод C.C
+DigitalOut ledshort(PC_12);   // светодиод КЗ
+AnalogIn  ainA0(PA_2);
+AnalogIn  ainA1(PA_3);
+AnalogIn  ainA2(PA_1);
+AnalogIn  ainA3(PA_0);
 //AnalogIn  ainA4(A4);
 //AnalogIn  ainA5(A5);
 //BusOut unused(A4,A5);
@@ -241,6 +244,19 @@
         ledshort=1;
         wait(0.02);
         ledshort=0;
+    }else{
+        TFT.foreground(Red);
+        TFT.printf("ERROR - flash memory is not activated\n");
+        TFT.foreground(White);
+        wait(5);
+        TFT.printf("Load default settings.");
+        for (int i=0; i<10; i++)
+        {
+        wait(0.1);
+        TFT.printf(".");
+        }
+        TFT.printf("\n");
+        loaddefaultsettings();
     }
 }
 //------------------------------------------------------------------------------------------------------------
@@ -322,41 +338,61 @@
     ledcc=0;
     ledshort=0;
     TFT.claim(stdout);
-    set_time(1414838392);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
+    //set_time(1414838392);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
     tstart = treal = time(NULL);
-    pinbrightness.period(0.001);      // задаём частоту Шим подсветки 0.001 - 1000 герц
+    pinbrightness.period(0.01);      // задаём частоту Шим подсветки 0.001 - 1000 герц
     fan.period(0.01);
+    //fan2.period(0.01);
     TFT.set_orientation(3);
     TFT.background(Black);
     TFT.cls();
     wait(0.2);
     fan = fanspeed; // устанавливаем скорость
+    //fan2=fanspeed2;
 }
 //------------------------------------------------------------------------------------------------------------
 void bootscreen(void)
 {
-    
-    wait(0.5);
     TFT.background(Black);
+    TFT.foreground(Green);
+    TFT.locate(100, 10);
+    TFT.set_font((unsigned char*) Consolas26x49);
+    TFT.printf("PSTFT\n");
     TFT.foreground(White);
     TFT.set_font((unsigned char*) CourierNew13x23);
-    TFT.locate(0, 100);
-    TFT.printf("Load settings...\n");
+    TFT.printf("      Firmware v. 1.0.0\n");
+    TFT.set_font((unsigned char*) Courier8x13);
+    TFT.printf(" Laboratory power supply based on STM32\n");
+    TFT.printf("       Copyright (c) 2015 Pimenov V\n");
+    TFT.printf("          Mail:  sinrab@gmail.com \n");
     pinbrightness = brightness;          // включаем подсветку
-    wait(0.5);
-    if (beeper==1) {
-        buzzer.beep(480,0.01);
-    }
-    
+    wait(3);
+    TFT.locate(0, 150);
+    TFT.set_font((unsigned char*) Courier8x13);
+    TFT.printf("Press button ENTER\n");
+    TFT.printf("for load default settings\n");
+    TFT.printf("\n");
+    wait(1);  
     if (buttonEnter==0) {
-      TFT.printf("default.\n");
-      wait(0.5);
+      TFT.printf("Load default settings.");
+      for (int i=0; i<10; i++)
+      {
+      wait(0.1);
+      TFT.printf(".");
+      }
+      TFT.printf("\n");
       loaddefaultsettings();
     }else{
-      TFT.printf("from flash.\n");
-      wait(1);
+      TFT.printf("Load settings from flash memory.");
+      for (int i=0; i<9; i++)
+      {
+      wait(0.1);
+      TFT.printf(".");
+      }
+      TFT.printf("\n");
       loadsettings();  
     }
+    //wait(100);
 }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 int main()                                                             //--------- Главная функция ---------//
@@ -395,6 +431,7 @@
         ccc=0;
         pb=0;
         pp=0;
+        csp=0;
         TFT.set_orientation(3);
         TFT.background(Black);
         TFT.cls();
@@ -466,8 +503,8 @@
 
 
 
-    fps.reset();
-    fps.start();
+    //fps.reset(); //мерить фпс
+    //fps.start();
 
     TFT.background(Black);
 
@@ -501,8 +538,8 @@
     TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(11, 162);
-    //TFT.printf("%05.2f W", U5*Ireal/1000);
-    TFT.printf("%f", fanspeed*100);
+    TFT.printf("%05.2f W", U30*Ireal/1000);
+    //TFT.printf("%f", fanspeed*100);
 
     TFT.background(0x2104);                                       // выводим время включеной нагрузки
     TFT.foreground(0xE71C);//текст
@@ -546,10 +583,10 @@
     //if (zxc<0) zxc=0;
     //TFT.fillrect(11+zxc,138, 13+zxc, 150, Red);                                // шкала I set
 
-    fps.stop();
-    TFT.set_font((unsigned char*) Courier8x13);                                   // FPS
-    TFT.locate(169,81);
-    printf("%0.2f", (1/fps.read()));
+    //fps.stop();
+    //TFT.set_font((unsigned char*) Courier8x13);                                   // FPS
+    //TFT.locate(169,81);
+    //printf("%0.2f", (1/fps.read()));
 
     TFT.background(0x2104);
     TFT.foreground(White);
@@ -899,7 +936,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" -\n");                  // U usb A4 hi
+    printf(" -.\n");                  // U usb A4 hi
     //----------------------------------------------------------------
     if (kline==11) {
         TFT.background(back4_i);
@@ -908,7 +945,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" -\n");                  // I usb A5 zero
+    printf(" -,\n");                  // I usb A5 zero
     //----------------------------------------------------------------
     if (kline==12) {
         TFT.background(back4_i);
@@ -926,7 +963,8 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" Load Default                \n");
+    //printf(" Load Default                \n");
+    printf(" Load Default calibration    \n");
     //----------------------------------------------------------------
     if (kline==14) {
         TFT.background(back4_i);
@@ -935,7 +973,8 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" Save all to flash memory   \n");
+    //printf(" Save all to flash memory   \n");
+    printf(" Save calibration to flash memory\n");
     //----------------------------------------------------------------
     if (kline==15) {
         TFT.background(back4_i);
@@ -1354,7 +1393,7 @@
 
     Ireal = a1k*1000*(in1-a1a);
 
-    temperature = map(in3, 0.232, 0.188 , 0, 90); //(in3, 0.232, 0.188 , 0, 90);
+    temperature = map(in3, 0.228, 0.188 , 0, 90); //(in3, 0.232, 0.188 , 0, 90); //преобразование температуры
 
     if (rdown_on==1) {
         U5 = a0k*(in0-a0a)+Ireal*rdown/1000;
@@ -1404,8 +1443,6 @@
         if (buttonDown==0) {  // Down
         if (powerMosfet==0){
             a1a = in1 - 0.000100f;         // 2
-            Screen=7;
-            iiii=0;
             complit=0;
         }
         }
@@ -1423,6 +1460,11 @@
             Screen=5;          //3
             complit=0;
         }
+        if (buttonDown==0) {  // Down
+            Screen=7;
+            iiii=0;
+            complit=0;
+        }
         one=1;
     }
 //------------------------------------------------------------------
@@ -1528,7 +1570,36 @@
             if (kline==4) a1k = 0.2f/(in1 - a1a);        //a1k = 1000/(avgAin1() - a1a) при 1амперах
 
             if (kline==5) a2a = in2;                     // U high v
-            if (kline==6) a2k = 1.900f/(in2-a2a);        // U high v
+            if (kline==6) a2k = 19.00f/(in2-a2a);        // U high v
+            
+            if (kline==10) 
+            {
+                ledshort=1;  // 1 раз моргнуло - начало записи
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                int s=1;
+                int s1=0;
+                eeprom.nbyte_write(0, (char*)&s, sizeof(s));
+                eeprom.nbyte_write(4, (char*)&s1, sizeof(s1));
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+            }
+            if (kline==11) 
+            {
+                ledshort=1;  // 1 раз моргнуло - начало записи
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                int s=0;
+                int s1=1;
+                eeprom.nbyte_write(0, (char*)&s, sizeof(s));
+                eeprom.nbyte_write(4, (char*)&s1, sizeof(s1));
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+            }
 
             if (kline==13) {          // load
 
@@ -1942,15 +2013,17 @@
 //------------------------------------------------------------------
     if (Screen==7 & one==0) {                  //экран 7
         if (buttonEnter==0) {  // Enter
-        
+            Screen=2;
+            complit=0;
         }
 
         if (buttonUp==0) {     // Up
-        
+            Screen=2;
+            complit=0;
         }
 
         if (buttonDown==0) {   // Down
-            Screen=1;
+            Screen=2;
             complit=0;
         }
         one=1;
@@ -2045,10 +2118,12 @@
         fst=0;
         fst2=0;
         fan = 0.0f;
+        //fan2 = 0.0f;
     }
 
     if (temperature >= tempstart && fst == 0) {
         fan = 1.0f;
+        //fan2 = 1.0f;
         timerforfanstart.attach(&fanstart, 2.0);
         fst=1;
     }
@@ -2056,6 +2131,8 @@
     if (fst2==1) {
         fanspeed = map (temperature, tempstart, tempfull, 0.4, 1);
         fan = fanspeed;
+        //fanspeed2 = map (temperature, tempstart, tempfull, 0.4, 1);
+        //fan2 = fanspeed2;    
     }
 
     if (temperature >= tempcutoff) {