Vitaliy Loginov / Mbed 2 deprecated Chromatograph_Mobile

Dependencies:   ad5422_arduino mbed LT1446 LM35 PGA280_ADS1259

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "PerifConfig.h"
00002 #include "PGA280.h"
00003 #include "ADS1259.h"
00004 #include "PGA280ADS1259.h"
00005 #include "main.h"
00006 #include "ad5422_arduino.h"
00007 #include "lm35.h"
00008 #include "LT1446.h"
00009 
00010 #define PID_SAMPLE_TIME 0.25    //Период ПИД
00011 #define Kp (E_PCOEFF)   //Получение коэффициентов ПИД
00012 #define Ki (E_PCOEFF / E_ICOEFF * PID_SAMPLE_TIME)
00013 #define Kd (E_PCOEFF * E_DCOEFF / PID_SAMPLE_TIME)
00014 
00015 #define E_PCOEFF    0.11F    //Пропорциональный коэффициент ПИД регулятора (Из EEPROM)
00016 #define E_ICOEFF    3000.0F //Постоянная времени интегрирования ПИД регулятора в секундах (Из EEPROM) (был 3000)
00017 #define E_DCOEFF    0.1F
00018 #define TEMP 35
00019 
00020 
00021 /*Таймер для вызова функции каждые 40 мс*/
00022 Ticker lm_temp;
00023 Ticker adctask;
00024 Ticker PID1;
00025 /*Конец*/
00026 InterruptIn button(USER_BUTTON);
00027 
00028 volatile float Error = 0, dError = 0, last_Error = 0;    //Ошибка и предыдущее значение для ПИД
00029 volatile float Integral = 0.0;    //Интегральная составляющая ПИД-регулятора
00030 volatile uint8_t temp=0;
00031 char mbflag;
00032 unsigned char pga280gain;
00033 char UComandFlag;
00034 volatile unsigned char UComand;
00035 volatile long tempdata=0;
00036 char ch=0;                          //адрес на плате ТЭД-2 = 6
00037 float x=0;
00038 float k;
00039 unsigned char str[];
00040 
00041 
00042 
00043 //функция чтения АДС для выполнения в задаче
00044 void readADC()
00045 {
00046     tempdata=ads1259_readData(5);       //функция может зависать (надо избавиться от бесконечного цикла)          
00047     x=NormADC(tempdata);
00048     UART.printf("%08f\r\n",x);
00049 }
00050 
00051 void readtemp()
00052 {    
00053     float t;
00054     /*Обработка ошибки*/
00055     LM35_start(0.25);
00056     if (LM35_0.ready) //если данные готовы то считать и сбросить флаг (способ многозадачности)
00057     {
00058         LM35_0.ready=0;
00059         t=LM35_0.temp;    
00060         Error=temp-t;  
00061         Integral += Error;
00062         dError = Error - last_Error;
00063         last_Error = Error;    
00064         //временно записать в калиброванное значение (нельзя так делать)
00065         LT1446_0.dacA.Code=(uint16_t)(PID() * 4095);
00066         LT1446_Write(&LT1446_0);
00067         UART.printf("Power %04d temp %0.1f\r\n",LT1446_0.dacA.Code,t);
00068     }
00069     
00070 }
00071 void printtemp()
00072 {
00073     if (LM35_0.ready) //если данные готовы то считать и сбросить флаг (способ многозадачности)
00074     {
00075     UART.printf("TempCol %0.1f\r\n",LM35_0.temp);
00076     LM35_0.ready=0;
00077     }
00078     
00079     }
00080 
00081 float inline NormADC(long data)
00082 {
00083     x=data*2.5/0x800000;
00084     //x=x*8/(1<<pga280gain);
00085     return x;
00086 }
00087 
00088 void ComandCheck()
00089 {    
00090     if(UART.getc()=='/')              
00091         {
00092         UART_gets(16); //моя функция на время
00093         UART.printf("%c\r\n",str[0]);
00094         switch (str[0]){
00095              case 'k':{
00096                  PID1.detach();
00097                  temp=(str[1]-'0')*10+(str[2]-'0');                 
00098                  UART.printf("temp= %d\r\n",temp);
00099                  break;}
00100              case 't':{
00101                  //снять показания термодатчика
00102                  LM35_start(0.25);
00103                  lm_temp.attach(&printtemp,0.25);
00104                  break;}
00105              case 'p':{                
00106                 pga280gain=str[1]; //присваиваем числовое значение команды взятое из символа цифры
00107                 pga280gain-=0x30;
00108                 ch=5;
00109                 pga280_setGAIN(pga280gain,ch);
00110                 ch=0;               
00111                 break;}            
00112             case 'g': {               
00113                 //запустить задачу чтения АЦП каждые 40 мс (25 герц)
00114                 adctask.attach(&readADC,0.04);               
00115                 break;}
00116             case's':    {//остановить постоянное отображение
00117                 adctask.detach();
00118                 lm_temp.detach();
00119                 LM35_stop();              
00120                 break;}
00121             case 'd':
00122                 //MBFlagRegister.DAC=1;
00123                 break;
00124             case 'e':{
00125                 tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,5);//чтение ошибок                
00126                 printf("ERRORS %X\n",tempdata);                               
00127                 break;}            
00128             case 'r':{
00129                 //перезагрука                           
00130                 printf("System Reset\r\n");
00131                 NVIC_SystemReset();
00132                 break;}
00133             default:                
00134                 //MBFlagRegister.TMLS=0; //починка зависания (не работает)
00135                 break;            
00136         }
00137     }
00138 }
00139  float PID ()
00140     {
00141     float P = Kp * Error;
00142     float I = Ki * Integral;
00143     float D = Kd * dError;
00144     float control = P + I + D;
00145     if (control > 1.0) return 1.0;
00146     if (control < 0.0) return 0.0;
00147     return control;
00148     }
00149 
00150 void pressed()
00151 {
00152     PID1.attach(&readtemp,0.25);
00153     UART.printf("PID is ON\r\n");
00154 }
00155 
00156 int main()
00157 {    
00158     
00159     //Инициализация периферийных устройств
00160     SPI1_MasterInitMode(2);//работают режимы 1 и 2 
00161    //запустить задачу проверки команды по прерыванию УАРТ
00162     UART.attach(&ComandCheck,Serial::RxIrq);
00163     EN1=1;
00164           
00165     
00166     ch=5;
00167     pga280_setAdress(ch);    
00168     pga280_ads1259_init(ch); //инициализировать АЦП по адресу на плате ТЭД-2 = 5 (4)
00169     printf("\r\n");      
00170     tempdata=pga280_readOneRegisterDevice(PGA280_BUF_TIMEOUT_ADR,ch);
00171     printf("Timeout %X\n",tempdata);
00172     wait_ms(20);
00173     pga280_setGAIN(GAIN_1_PGA280,ch);
00174     pga280_setMUX(2,ch);
00175     pga280gain=3; //   gain=1 (0x03)
00176     tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,ch);//чтение ошибок
00177     printf("Errors %X\n",tempdata);   
00178     /*Конец*/
00179     
00180     button.fall(&pressed);
00181     
00182         
00183     uint16_t q1=0;
00184     while(1)
00185     {     
00186       q1=4;
00187       while(q1--){
00188           SPI1_MasterInitMode(q1);
00189     Cs=0;   
00190     TED2.write(0x00);    
00191     TED2.write(0x00);
00192     TED2.write(0x00);    
00193     Cs=1;
00194     UART.printf("%d\r\n",q1);
00195     wait_ms(3000);          
00196           }
00197     }
00198 }
00199