[code]
#define PID_INTEGER
#include "GyverPID.h"
#include <GyverPWM.h>
#include <MaxMatrix.h>
int DIN_7219 = 7; // DIN pin of MAX7219 module
int CS_7219 = 8; // CS pin of MAX7219 module
int CLK_7219 = 9; // CLK pin of MAX7219 module
int maxInUse = 4; //change this variable to set how many MAX7219's you'll use
MaxMatrix m(DIN_7219, CS_7219, CLK_7219, maxInUse); // define module
const int no_position = 23;
int *pos_1;
int *pos_2;
int *pos_3;
int *pos_4;
int *pos_5;
int so = 0;
int in_t = 0;
int incomingByte = 0;
boolean SP_EN;
byte bufer[] = { // цифры индикации
0, 6, 9, 9, 13, 11, 9, 6,
0, 7, 2, 2, 2, 2, 6, 2,
0, 15, 8, 4, 2, 1, 9, 6,
0, 6, 9, 1, 2, 4, 2, 15,
0, 1, 1, 1, 15, 9, 9, 9,
0, 6, 9, 1, 1, 14, 8, 15,
0, 6, 9, 9, 14, 8, 9, 6,
0, 4, 4, 4, 2, 1, 9, 15,
0, 6, 9, 9, 6, 9, 9, 6,
0, 6, 9, 1, 7, 9, 9, 6
};
int ones;
int tens;
int hundreds;
int thousands;
int thousands1;
int ob = 0;
GyverPID regulator(0.06, 0.050, 0.010); // коэф. П, коэф. И, коэф. Д, период дискретизации dt (мс)
// или так:
//GyverPID regulator(0.01, 0.05, 0.01); // можно П, И, Д, без dt, dt будет по умолч. 100 мс
volatile unsigned long lastflash;
volatile boolean state = false;
boolean state1;
int RPM;
int rpm0 = 0;
int rs_p = 0;
int Sp_ON = 5; //вход шпиндель "ON" "OF" pin 5
int Stop = 6; // выход на "СТОП" pin 6
void setup() {
Serial.begin(115200); //открыть порт
Serial.setTimeout(2);
m.init();
m.setIntensity(5); // dot matix intensity 0-15
pinMode(DIN_7219, OUTPUT);
digitalWrite(DIN_7219, LOW);
pinMode(CS_7219, OUTPUT);
digitalWrite(CS_7219, LOW);
pinMode(CLK_7219, OUTPUT);
digitalWrite(CLK_7219, HIGH);
pinMode(Sp_ON, INPUT);
pinMode(10, OUTPUT); // выход ШИМ 10 pin
pinMode(Stop, OUTPUT);
digitalWrite(Stop, HIGH);
PWM_resolution(10, 12, FAST_PWM);
attachInterrupt(0, sens, RISING); // вход датчика холла pin 2
regulator.setDirection(NORMAL); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL
regulator.setLimits(10, 4050); // пределы для управления ШИМ
regulator.setpoint = 0; // сообщаем регулятору обороты, которые он должен поддерживать
regulator.setMode(0);
//number(0, 0, 0, 0, 0);
// в процессе работы можно менять коэффициенты
// regulator.Kp = 0.2;
//regulator.Ki = 0.5;
// regulator.Kd = 0;
}
void loop() {
if (Serial.find('S')) {
rs_p = Serial.parseInt(); //считываем заданние оборотов сигнал"RX" с платы на "RX" ардуины
}
if (digitalRead(Sp_ON)) { // сигнал включения шпинделя есть или нет
if (rs_p == 0) {
regulator.setpoint = 0;
regulator.input = 0;
PWM_set(10, 0);
} else {
regulator.setpoint = rs_p;
regulator.input = RPM;
PWM_set(10, regulator.getResult());
}
if (state1 != state) { // проверяем крутиться или нет
so++;
state1 = state;
rpm0 = 0;
in_t = 0;
}
else //не крутиться чуть ждём
{
rpm0++;
if (rpm0 > 50) {
digitalWrite(Stop, LOW); //сигнал "-" на 6 ножке подсоединён к "СТОП" на плате, сбрасывается кнопкой рессет на ардуине
RPM = 0;
regulator.setpoint = 0;
PWM_set(10, 0);
}
}
if (RPM == 0) {
//in_t = 0;
number(0, 0, 0, 0, 0);
}
else if (so > 5) { // вывод на индикацию через 5 оборотов
so = 0; //in_t = 0;
//ob= RPM;
thousands1 = RPM / 10000;
thousands = (RPM - (thousands1 * 10000)) / 1000;
hundreds = (RPM - (thousands1 * 10000 + thousands * 1000)) / 100;
tens = (RPM - (thousands1 * 10000 + thousands * 1000) - hundreds * 100) / 10;
ones = (RPM - (thousands1 * 10000 + thousands * 1000) - hundreds * 100) - tens * 10;
//Serial.println(ones);
pos_5 = &thousands1;
pos_4 = &thousands;
pos_3 = &hundreds;
pos_2 = &tens;
pos_1 = &ones;
number(*pos_1, *pos_2, *pos_3, *pos_4, *pos_5);
}
}
else {
regulator.setpoint = 0;
PWM_set(10, 0);
number(0, 0, 0, 0, 0);
}
}
void sens() {
RPM = 60 / ((float)(micros() - lastflash) / 1000000); //расчет
lastflash = micros(); //запомнить время последнего оборота
state = !state;
}
void number(int position1, int position2, int position3, int position4, int position5)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(CS_7219, LOW);
//Serial.println(bufer[i]);
for (int f = 0; f < 4; f++)
{
if (position5 > 0) {
if (f == 3 && position4 != no_position)
{
int k = 5;
if (position5 > 1)k = 4;
shiftOut(DIN_7219, CLK_7219, MSBFIRST, i + 1);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, bufer[i + position5 * 8] << k | bufer[i + position4 * 8]);
continue;
}
}
else if (f == 3 && position4 != no_position)
{
shiftOut(DIN_7219, CLK_7219, MSBFIRST, i + 1);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, bufer[i + position4 * 8]);
continue;
}
if (f == 2 && position3 != no_position)
{
shiftOut(DIN_7219, CLK_7219, MSBFIRST, i + 1);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, bufer[i + position3 * 8] << 1);
continue;
}
if (f == 1 && position2 != no_position)
{
//if(i==1)bufer[1]+=1;
shiftOut(DIN_7219, CLK_7219, MSBFIRST, i + 1);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, bufer[i + position2 * 8] << 2);
continue;
}
if (f == 0 && position1 != no_position)
{
shiftOut(DIN_7219, CLK_7219, MSBFIRST, i + 1);
//shiftOut(DIN_7219, CLK_7219, MSBFIRST, bufer[i+position1*8]<<1);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, bufer[i + position1 * 8] << 3);
continue;
}
shiftOut(DIN_7219, CLK_7219, MSBFIRST, 0);
shiftOut(DIN_7219, CLK_7219, LSBFIRST, 0);
}
digitalWrite(CS_7219, LOW);
digitalWrite(CS_7219, HIGH);
}
}