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
Revision 1:5d28312892aa, committed 2020-06-22
- Comitter:
- vitlog
- Date:
- Mon Jun 22 10:06:00 2020 +0000
- Parent:
- 0:98fcc06c66bf
- Commit message:
- 22.06.2020
Changed in this revision
--- /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(<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
--- 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