A modified Arduino library to let mbed boards to behave as modbus slave. See readme. Tested on Nucleo F401RE.
Dependencies: mbed mbed-rtos ModbusSlave232 MODSERIAL max6675 millis
main.cpp
- Committer:
- ascheeren
- Date:
- 2021-09-02
- Revision:
- 5:cc12e1f4daf1
- Parent:
- 4:80f3ac4b1c8b
File content as of revision 5:cc12e1f4daf1:
#include "mbed.h" #include "rtos.h" #include "ModbusSlave232.h" //see readme #include "millis.h" //see readme #include "ios.h" #include "max6675.h" ModbusSlave232 mbs; // Create new mbs instance SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCLK max6675 max(spi,PB_10); Ticker seg,media ; // Slave registersr enum { MB_0, // temperatura MB_1, // tempo restante MB_2, // setpoin temperatura MB_3, // aquecimento bit5 manual/auto bit 4 liga/deli(manual) bit0estado MB_4, // set temp1 MB_5, // set temp2 MB_6, // set temp3 MB_7, // set temp4 MB_8, // set temp5 fervura MB_9, // set tempo 1 MB_10, // set tempo 2 MB_11, // set tempo 3 MB_12, // set tempo 4 MB_13, // set tempo 5 fervura MB_14, //pwm MB_15, // MB_16, // bomba MB_17, // MB_18, //adiantar MB_19, //ok MB_20, MB_21, MB_REGS // Dummy register. using 0 offset to keep size of array }; //Prototipos void cozimento(void); void PID(); void segs(); void passagem_zero(); void atualiza(void); void leitura(void); void media_temp(); // variaveis Globais float Kp=5.5, Ki=0.5, Kd=0.1, propo, integ, deriv,medida, setpoint[6], valor_medido, erro, erro_ant, pwm,temperatura, setpointAtual, periodo; int regs[MB_REGS], etapa, minetapa[6], bomba, tempoEtapa, cont1, cont2, cont3, aquecimento; int main() { const unsigned char SLAVE = 1; const long BAUD = 9600; const unsigned PARITY = 'n'; seg.attach(&segs, 1.0); media.attach(&media_temp, 0.05); etapa=0;; res.period(5.f); startMillis(); // milliseconds (arduino like) mbs.configure(SLAVE, BAUD, PARITY); //test values (updatable) while (true) { //main thread if(aquecimento){ //se aquecimento estiver ligado periodo do duty cycle sera 1 div pwm periodo=1.0f/pwm; res.write(periodo); } if(!aquecimento)res.write(0.0f); // se aquecimento estiver deligado duty sera 0 atualiza(); // atualiza holdregistres bombaOUT=bomba; switch(etapa){ case 1: {tempoEtapa=minetapa[0]; setpointAtual=setpoint[0]; } break; case 2: {tempoEtapa=minetapa[1]; setpointAtual=setpoint[1]; } break; case 3: {tempoEtapa=minetapa[2]; setpointAtual=setpoint[2]; } break; } mbs.update(regs, MB_REGS); // Pass current register values to mbs } } void atualiza() { } void leitura() { int conta; float cache; cache+=max.read_temp(); conta++; if(conta>19){ valor_medido=cache/conta; cache=0; conta=0;} } void PID() { erro= setpointAtual - valor_medido; propo=erro*Kp; integ+=(erro*Ki); deriv=(erro-erro_ant)*Kd; erro_ant=erro; pwm=propo+integ+deriv; if(pwm>=100)pwm=100; else if(pwm<=0)pwm=0; } void segs (void) { cont1++; cont2++; cont3++; } void media_temp(void) { int contador; float cache; cache+=max.read_temp(); contador++; if(contador>=20) { temperatura =cache/contador; contador=0; cache=0; } }