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
Diff: main.cpp
- Revision:
- 1:5d28312892aa
- Parent:
- 0:98fcc06c66bf
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(<1446_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