ajuste firmware pulverizador driver 2 canais

This commit is contained in:
Diego Freitas 2026-04-01 14:03:04 -03:00
parent e03d84b498
commit 23a64b93ec
4 changed files with 49 additions and 75 deletions

View File

@ -609,11 +609,8 @@ namespace AgroBase.Models.Modules
Mandatorio = true,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ENA,
FuncoesPinout.CS,
FuncoesPinout.INA,
FuncoesPinout.INB,
FuncoesPinout.PWM,
FuncoesPinout.IN1,
FuncoesPinout.IN2,
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
@ -660,11 +657,8 @@ namespace AgroBase.Models.Modules
Mandatorio = true,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ENA,
FuncoesPinout.CS,
FuncoesPinout.INA,
FuncoesPinout.INB,
FuncoesPinout.PWM,
FuncoesPinout.IN1,
FuncoesPinout.IN2,
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
@ -1399,22 +1393,13 @@ namespace AgroBase.Models.Modules
(byte)(conectar ? 1 : 0),
(byte)Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha,
(byte)Sensor_ID_Num,
(byte)(pinout.Pinos.FirstOrDefault(x => x.ComponenteID == ID && x.Funcao == FuncoesPinout.ENA)?.Pino ?? PinoutUtils.PINO_INVALIDO),
(byte)(pinout.Pinos.FirstOrDefault(x => x.Funcao == FuncoesPinout.CS)?.Pino ?? PinoutUtils.PINO_INVALIDO),
};
List<byte> config2 = new List<byte>()
{
(byte)Componente,
(byte)(pinout.Pinos.FirstOrDefault(x => x.Funcao == FuncoesPinout.INA)?.Pino ?? PinoutUtils.PINO_INVALIDO),
(byte)(pinout.Pinos.FirstOrDefault(x => x.Funcao == FuncoesPinout.INB)?.Pino ?? PinoutUtils.PINO_INVALIDO),
(byte)(pinout.Pinos.FirstOrDefault(x => x.Funcao == FuncoesPinout.PWM)?.Pino ?? PinoutUtils.PINO_INVALIDO),
(byte)(pinout.Pinos.FirstOrDefault(x => x.ComponenteID == ID && x.Funcao == FuncoesPinout.IN1)?.Pino ?? PinoutUtils.PINO_INVALIDO),
(byte)(pinout.Pinos.FirstOrDefault(x => x.ComponenteID == ID && x.Funcao == FuncoesPinout.IN2)?.Pino ?? PinoutUtils.PINO_INVALIDO),
};
return new List<(CanMessagePosicaoDados, byte[])>()
{
(CanMessagePosicaoDados.Config1, config1.ToArray()),
(CanMessagePosicaoDados.Config2, config2.ToArray()),
};
}

View File

@ -434,7 +434,9 @@ namespace AgroBase.Models.Modules
LeituraAngulo,
Cooler,
QtdPulsos,
Periodo
Periodo,
IN1,
IN2
}
public static class PinoutUtils

View File

@ -108,8 +108,8 @@ BicoPulverizador_v2* ObterBicoPorId(uint8_t idNum) {
#pragma endregion
#pragma region BOMBAS
BombaPressurizadora_v2 sBMB_Linha("BMBLN", 51, 40, 38, 37, 36, 39, TiposBarramentos::CONTROLADOR, 0, &sPRS_Linha);
BombaPressurizadora_v2 sBMB_Agitador("BMBAGT", 52, 6, 7, 15, 16, 17, TiposBarramentos::CONTROLADOR, 1);
BombaPressurizadora_v2 sBMB_Linha("BMBLN", 51, 36, 1, 37, 2, TiposBarramentos::CONTROLADOR, Sentido::Horario, &sPRS_Linha);
BombaPressurizadora_v2 sBMB_Agitador("BMBAGT", 52, 38, 3, 39, 4, TiposBarramentos::CONTROLADOR, Sentido::Horario);
BombaPressurizadora_v2* ObterBombaPorId(uint8_t idNum) {
switch (idNum) {

View File

@ -12,24 +12,22 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
BombaPressurizadora_v2(
const String& id,
uint8_t idNum,
int pinoEN,
int pinoCS,
int pinoINA,
int pinoINB,
int pinoPWM,
int pinoIN1,
int canalIN1,
int pinoIN2,
int canalIN2,
TiposBarramentos barramento = CONTROLADOR,
int canalPwm = 0,
Sentido sentido = Sentido::Horario,
SensorPressao_v2* sensor = nullptr,
int pressaoInicial = 0
)
: _ID(id),
ID_Num(idNum),
_pinoEN(pinoEN, barramento, _OUTPUT),
_pinoCS(pinoCS, barramento, _INPUT),
_pinoINA(pinoINA, barramento, _OUTPUT),
_pinoINB(pinoINB, barramento, _OUTPUT),
_pinoPWM(pinoPWM, barramento, _PWM),
_canal(canalPwm),
_pinoIN1(pinoIN1, barramento, _PWM),
_pinoIN2(pinoIN2, barramento, _PWM),
_canalIN1(canalIN1),
_canalIN2(canalIN2),
_sentido(sentido),
sensorPressao(sensor),
_PressaoSP(pressaoInicial) {
}
@ -37,13 +35,13 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
String _ID;
uint8_t ID_Num = 0;
PinoModel _pinoEN;
PinoModel _pinoCS;
PinoModel _pinoINA;
PinoModel _pinoINB;
PinoModel _pinoPWM;
PinoModel _pinoIN1;
PinoModel _pinoIN2;
int _canalIN1 = 1;
int _canalIN2 = 2;
int _canal = 0;
Sentido _sentido = Sentido::Horario;
float _Kp = 3.0;
float _Ki = 2.2;
@ -79,23 +77,20 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
MalhaFechada = (sensorPressao != nullptr);
_pinoEN.Conectar(false);
_pinoCS.Conectar();
_pinoINA.Conectar(false);
_pinoINB.Conectar(true);
_pinoPWM.Conectar(0);
if (_pinoPWM.Definido()) {
ledcSetup(_canal, 1000, 10);
ledcAttachPin(_pinoPWM.num, _canal);
ledcWrite(_canal, 0);
_pinoIN1.Conectar(0);
if (_pinoIN1.Definido()) {
ledcSetup(_canalIN1, 1000, 10);
ledcAttachPin(_pinoIN1.num, _canalIN1);
ledcWrite(_canalIN1, 0);
}
_pinoIN2.Conectar(0);
if (_pinoIN2.Definido()) {
ledcSetup(_canalIN2, 1000, 10);
ledcAttachPin(_pinoIN2.num, _canalIN2);
ledcWrite(_canalIN2, 0);
}
Iniciado =
_pinoEN.Definido() &&
_pinoINA.Definido() &&
_pinoINB.Definido() &&
_pinoPWM.Definido();
Iniciado = _pinoIN1.Definido() && _pinoIN2.Definido();
if (Iniciado) {
_EstadoControle = Estado::Desligado;
@ -116,14 +111,12 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
}
_EstadoControle = Estado::Desligado;
AplicarSaida(false, 0);
_pinoPWM.Desconectar();
_pinoEN.Desconectar();
_pinoCS.Desconectar();
_pinoINA.Desconectar();
_pinoINB.Desconectar();
ledcWrite(_canalIN1, 0);
ledcWrite(_canalIN2, 0);
_pinoIN1.Desconectar();
_pinoIN2.Desconectar();
PotenciaLeitura = 0;
PercentualPotenciaLeitura = 0;
EstadoLeitura = Estado::Desligado;
@ -181,7 +174,7 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
}
}
AplicarSaida(_EstadoControle == Estado::Desligado, PotenciaLeitura);
AplicarSaida(_EstadoControle == Estado::Ligado, PotenciaLeitura);
AtualizarLeitura();
}
@ -251,19 +244,13 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
void AplicarSaida(bool ligado, int pwm) {
if (!Iniciado && pwm != 0) return;
_pinoEN.set(ligado);
if (ligado) {
_pinoINA.set(false);
_pinoINB.set(true);
} else {
_pinoINA.set(false);
_pinoINB.set(false);
if (!ligado) {
pwm = 0;
}
pwm = LimitarPWM(pwm);
ledcWrite(_canal, pwm);
ledcWrite(_canalIN1, _sentido == Sentido::Horario ? pwm : 0);
ledcWrite(_canalIN2, _sentido == Sentido::Horario ? 0 : pwm);
}
int LimitarPWM(int valor) {
@ -275,7 +262,7 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
void AtualizarLeitura() {
if (!Iniciado) return;
EstadoLeitura = _pinoEN.get() ? Ligado : Desligado;
EstadoLeitura = (PotenciaLeitura > 0 && _EstadoControle == Estado::Ligado) ? Estado::Ligado : Estado::Desligado;
PercentualPotenciaLeitura = (RampaMax > 0)
? (PotenciaLeitura / (double)RampaMax) * 100.0
: 0.0;