test

Dependencies:   ad5422_arduino mbed LT1446 ADS1248-1 LM35-1 Flash FT813 PGA280_ADS1259

Revision:
1:5d28312892aa
Parent:
0:98fcc06c66bf
Child:
2:04090a362742
diff -r 98fcc06c66bf -r 5d28312892aa main.cpp
--- a/main.cpp	Mon Jun 08 05:50:32 2020 +0000
+++ b/main.cpp	Mon Jun 22 10:06:00 2020 +0000
@@ -3,11 +3,31 @@
 #include "ADS1259.h"
 #include "PGA280ADS1259.h"
 #include "main.h"
+#include "ad5422_arduino.h"
+#include "lm35.h"
+#include "LT1446.h"
+
+#define PID_SAMPLE_TIME 0.25    //Период ПИД
+#define Kp (E_PCOEFF)   //Получение коэффициентов ПИД
+#define Ki (E_PCOEFF / E_ICOEFF * PID_SAMPLE_TIME)
+#define Kd (E_PCOEFF * E_DCOEFF / PID_SAMPLE_TIME)
+
+#define E_PCOEFF    0.11F    //Пропорциональный коэффициент ПИД регулятора (Из EEPROM)
+#define E_ICOEFF    3000.0F //Постоянная времени интегрирования ПИД регулятора в секундах (Из EEPROM) (был 3000)
+#define E_DCOEFF    0.1F
+#define TEMP 35
+
 
 /*Таймер для вызова функции каждые 40 мс*/
+Ticker lm_temp;
 Ticker adctask;
+Ticker PID1;
 /*Конец*/
+InterruptIn button(USER_BUTTON);
 
+volatile float Error = 0, dError = 0, last_Error = 0;    //Ошибка и предыдущее значение для ПИД
+volatile float Integral = 0.0;    //Интегральная составляющая ПИД-регулятора
+volatile uint8_t temp=0;
 char mbflag;
 unsigned char pga280gain;
 char UComandFlag;
@@ -25,9 +45,38 @@
 {
     tempdata=ads1259_readData(5);       //функция может зависать (надо избавиться от бесконечного цикла)          
     x=NormADC(tempdata);
-    printf("%08f\r\n",x);
+    UART.printf("%08f\r\n",x);
 }
 
+void readtemp()
+{    
+    float t;
+    /*Обработка ошибки*/
+    LM35_start(0.25);
+    if (LM35_0.ready) //если данные готовы то считать и сбросить флаг (способ многозадачности)
+    {
+        LM35_0.ready=0;
+        t=LM35_0.temp;    
+        Error=temp-t;  
+        Integral += Error;
+        dError = Error - last_Error;
+        last_Error = Error;    
+        //временно записать в калиброванное значение (нельзя так делать)
+        LT1446_0.dacA.Code=(uint16_t)(PID() * 4095);
+        LT1446_Write(&LT1446_0);
+        UART.printf("Power %04d temp %0.1f\r\n",LT1446_0.dacA.Code,t);
+    }
+    
+}
+void printtemp()
+{
+    if (LM35_0.ready) //если данные готовы то считать и сбросить флаг (способ многозадачности)
+    {
+    UART.printf("TempCol %0.1f\r\n",LM35_0.temp);
+    LM35_0.ready=0;
+    }
+    
+    }
 
 float inline NormADC(long data)
 {
@@ -43,6 +92,16 @@
         UART_gets(16); //моя функция на время
         UART.printf("%c\r\n",str[0]);
         switch (str[0]){
+             case 'k':{
+                 PID1.detach();
+                 temp=(str[1]-'0')*10+(str[2]-'0');                 
+                 UART.printf("temp= %d\r\n",temp);
+                 break;}
+             case 't':{
+                 //снять показания термодатчика
+                 LM35_start(0.25);
+                 lm_temp.attach(&printtemp,0.25);
+                 break;}
              case 'p':{                
                 pga280gain=str[1]; //присваиваем числовое значение команды взятое из символа цифры
                 pga280gain-=0x30;
@@ -54,8 +113,10 @@
                 //запустить задачу чтения АЦП каждые 40 мс (25 герц)
                 adctask.attach(&readADC,0.04);               
                 break;}
-            case's':    {
-                adctask.detach();               
+            case's':    {//остановить постоянное отображение
+                adctask.detach();
+                lm_temp.detach();
+                LM35_stop();              
                 break;}
             case 'd':
                 //MBFlagRegister.DAC=1;
@@ -75,17 +136,35 @@
         }
     }
 }
+ float PID ()
+    {
+    float P = Kp * Error;
+    float I = Ki * Integral;
+    float D = Kd * dError;
+    float control = P + I + D;
+    if (control > 1.0) return 1.0;
+    if (control < 0.0) return 0.0;
+    return control;
+    }
+
+void pressed()
+{
+    PID1.attach(&readtemp,0.25);
+    UART.printf("PID is ON\r\n");
+}
 
 int main()
 {    
-    SPI1_MasterInitMode(0);
-   
+    
+    //Инициализация периферийных устройств
+    SPI1_MasterInitMode(2);//работают режимы 1 и 2 
    //запустить задачу проверки команды по прерыванию УАРТ
     UART.attach(&ComandCheck,Serial::RxIrq);
+    EN1=1;
+          
     
-    EN1=1;
     ch=5;
-    //pga280_setAdress(ch);    
+    pga280_setAdress(ch);    
     pga280_ads1259_init(ch); //инициализировать АЦП по адресу на плате ТЭД-2 = 5 (4)
     printf("\r\n");      
     tempdata=pga280_readOneRegisterDevice(PGA280_BUF_TIMEOUT_ADR,ch);
@@ -96,13 +175,25 @@
     pga280gain=3; //   gain=1 (0x03)
     tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,ch);//чтение ошибок
     printf("Errors %X\n",tempdata);   
-    /*Конец*/ 
+    /*Конец*/
     
+    button.fall(&pressed);
     
+        
+    uint16_t q1=0;
     while(1)
-    {
-        
-        wait_ms(100);
+    {     
+      q1=4;
+      while(q1--){
+          SPI1_MasterInitMode(q1);
+    Cs=0;   
+    TED2.write(0x00);    
+    TED2.write(0x00);
+    TED2.write(0x00);    
+    Cs=1;
+    UART.printf("%d\r\n",q1);
+    wait_ms(3000);          
+          }
     }
 }
  
\ No newline at end of file