Vitaliy Loginov / Mbed 2 deprecated Chromatograph_Mobile

Dependencies:   ad5422_arduino mbed LT1446 LM35 PGA280_ADS1259

Files at this revision

API Documentation at this revision

Comitter:
vitlog
Date:
Mon Jun 22 10:06:00 2020 +0000
Parent:
0:98fcc06c66bf
Commit message:
22.06.2020

Changed in this revision

LM35.lib Show annotated file Show diff for this revision Revisions of this file
LT1446.lib Show annotated file Show diff for this revision Revisions of this file
PGA280_ADS1259.lib Show annotated file Show diff for this revision Revisions of this file
PerifConfig.cpp Show annotated file Show diff for this revision Revisions of this file
PerifConfig.h Show annotated file Show diff for this revision Revisions of this file
ad5422_arduino.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM35.lib	Mon Jun 22 10:06:00 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/vitlog/code/LM35/#48636371d2d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LT1446.lib	Mon Jun 22 10:06:00 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/vitlog/code/LT1446/#4ca9c83d7e14
--- a/PGA280_ADS1259.lib	Mon Jun 08 05:50:32 2020 +0000
+++ b/PGA280_ADS1259.lib	Mon Jun 22 10:06:00 2020 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/vitlog/code/PGA280_ADS1259/#f9ba28ab9f4c
+https://os.mbed.com/users/vitlog/code/PGA280_ADS1259/#533ce2102fcc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PerifConfig.cpp	Mon Jun 22 10:06:00 2020 +0000
@@ -0,0 +1,89 @@
+#include "PerifConfig.h"
+#include <stdio.h>
+
+/*Переопределение имени пинов для платы ТЭД2*/
+DigitalOut Cs(D10);
+DigitalOut En1(D15);
+
+DigitalOut Adr0(D5);
+DigitalOut Adr1(D6);
+DigitalOut Adr2(D7);
+
+DigitalOut Reset(D8);
+DigitalIn CrdyA(D9);
+
+/*DigitalOut MOSI(D11);
+DigitalIn MISO(D12);
+DigitalOut SCK(D13);*/
+/*Конец*/
+
+//MOSI,MISO,SCK
+SPI TED2(D11, D12, D13); 
+
+Serial UART(SERIAL_TX,SERIAL_RX,115200);
+
+
+void UART_gets(char maxcount)
+/*Функция получения строки и записи её в глобальную переменную str[]*/
+{
+    int i=0;    
+    do
+    {
+        while (UART.readable());    //перед точкой с запятой цикл    
+        str[i++]=UART.getc();        
+    }
+    while ((str[i-2]!=0x0D)&&(str[i-1]!=0x0A));
+    for (i=i;i<maxcount;i++)
+    {
+        str[i]='\0';
+    }   
+}
+
+
+
+void DebugString (unsigned char *sData,unsigned char sz)
+{
+    /*
+    int i;        
+    for (i=0;i<sz;i++)
+    {
+        if (sData[i]==0x00)     //если пришёл символ конца строки то не отправляем что-либо
+        {
+            i=sz;
+        }
+        else UART1_Transmit(sData[i]);        
+    }
+    */
+}
+
+void SPI1_MasterInitMode(char mode)
+{   
+    TED2.format(8,mode);
+    TED2.frequency(2500000);
+}
+void SPI1_SlaveInit()
+{
+    
+}
+
+
+void SPI1MasterTransmitString(unsigned char *sData,unsigned int sz) //передать строку размером sz
+{   
+    /*
+    int i=0;
+    for (i=0;i<sz;i++)
+    {
+        SPI1MasterTransferByte(sData[i]);        
+    }
+    */
+}
+
+unsigned char SPI1MasterTransferByte(unsigned char cData)//отправить и считать байт
+{
+    return (unsigned char)TED2.write(cData);    
+}
+
+unsigned char SPI1MasterReadByte()
+{    
+    return (unsigned char)TED2.write(0xFF);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PerifConfig.h	Mon Jun 22 10:06:00 2020 +0000
@@ -0,0 +1,106 @@
+#ifndef PERIFCONFIG_H
+#define PERIFCONFIG_H
+/*Это перенос с языка Си для PIC32 максимально безболезненно*/
+#include "mbed.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/*Моё начало*/
+#define SYS_FREQ (180000000L)
+/*настройки для UART1*/
+#define BAUD            115200 //бодрейт
+#define MYUBRG          SYS_FREQ/16/BAUD-1
+/*Конец*/
+
+/*Переименование выводов SPI*/
+#define MOSI1                           mosi1  //MOSI настройка вывода SPI1 на выход (на всякий случай)
+#define MISO1                           miso2  //MISO
+#define SCK1                            sck1 //SCK      
+/*Конец*/
+
+/*Период таймера*/
+#define PER 0.04 //с
+#define PERREG  SYS_FREQ/8*PER-1 //25 fps
+#define PER2 0.00001 //10 мкс
+#define PERREG2  SYS_FREQ/8*PER2-1 // fps
+/*Конец*/
+
+#ifndef CS
+#define CS                              Cs       //чипселект
+#endif
+
+#define EN1                             En1      //включить что-то
+
+#define ADR0                            Adr0
+#define ADR1                            Adr1
+#define ADR2                            Adr2
+
+#define RESET                           Reset
+#define CRDYA                           CrdyA       //сигнал готовности с АЦП/ЦАП
+
+#define ADS1259_RESET                   Reset
+#define ADS1259_RDYA                    CrdyA
+#define MUX_AN10_IZM_RRG1               2
+#define MUX_AN10_KLAPAN_RRG1            3
+
+#define ADC_CH0                         0
+#define ADC_CH1
+#define ADC_CH2
+
+#define PGA280_TED                      4
+#define PGA280_RRG1                     5
+/*конец*/
+
+/*Переопределение имени пинов*/
+extern DigitalOut Cs,En1,Adr0,Adr1,Adr2,Reset,SCK,MOSI;
+extern DigitalIn CrdyA,MISO;
+/*Конец*/
+extern SPI TED2;
+extern Serial UART;
+
+typedef union {
+    struct {
+        uint8_t
+        adr0:1,
+             adr1:1,
+             adr2:1,
+             :5;
+    };
+    struct {
+        uint8_t adr:3;
+        uint8_t :5;
+    };
+} adress_t;
+extern adress_t adress;
+
+
+extern unsigned int counter;
+extern unsigned char str[32];
+extern unsigned char in; //счетчик буфера прерываний
+//RING_buffer_t buf_1;                //буфер данных
+
+
+
+void GPIO_Init(void);
+void UART_Init(void);
+void UART1_Transmit(unsigned char data);
+void UDebugTransmit(unsigned char cData);
+void DebugString (unsigned char *sData, unsigned char sz);
+void UART_gets(char maxcount);
+void SPI1_MasterInitMode(char mode);
+void SPI1_SlaveInit(void);
+void SPI1MasterTransmitString(unsigned char *sData,unsigned int sz); //передать строку размером sz
+unsigned char SPI1MasterTransferByte(unsigned char cData);//отправить и считать байт
+unsigned char SPI1MasterReadByte(void);
+void TIMER32bit_Init(void);
+
+namespace std{};
+using namespace std;
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif  /* PERIFCONFIG_H */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ad5422_arduino.lib	Mon Jun 22 10:06:00 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/vitlog/code/ad5422_arduino/#9a5218876095
--- 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
--- a/main.h	Mon Jun 08 05:50:32 2020 +0000
+++ b/main.h	Mon Jun 22 10:06:00 2020 +0000
@@ -1,2 +1,4 @@
 float inline NormADC(long data);
-void ComandCheck();
\ No newline at end of file
+void ComandCheck();
+float PID ();
+void printtemp();
\ No newline at end of file