Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ad5422_arduino mbed LT1446 LM35 PGA280_ADS1259
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(<1446_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
Generated on Sat Jul 30 2022 07:47:02 by
1.7.2