adicionado fluxo de balanceamento de carga mov
This commit is contained in:
parent
1dfab912a7
commit
eb02e4e8a2
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -30,7 +30,6 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.gpbSentido = new System.Windows.Forms.GroupBox();
|
this.gpbSentido = new System.Windows.Forms.GroupBox();
|
||||||
this.btnSalvarSentido = new System.Windows.Forms.Button();
|
|
||||||
this.gpbDF = new System.Windows.Forms.GroupBox();
|
this.gpbDF = new System.Windows.Forms.GroupBox();
|
||||||
this.cmbDFFrente = new System.Windows.Forms.ComboBox();
|
this.cmbDFFrente = new System.Windows.Forms.ComboBox();
|
||||||
this.cmbDFTras = new System.Windows.Forms.ComboBox();
|
this.cmbDFTras = new System.Windows.Forms.ComboBox();
|
||||||
|
|
@ -83,6 +82,11 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.lblRampaMin = new System.Windows.Forms.Label();
|
this.lblRampaMin = new System.Windows.Forms.Label();
|
||||||
this.nudRampaMax = new System.Windows.Forms.NumericUpDown();
|
this.nudRampaMax = new System.Windows.Forms.NumericUpDown();
|
||||||
this.nudRampaMin = new System.Windows.Forms.NumericUpDown();
|
this.nudRampaMin = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.lblMargemRPM = new System.Windows.Forms.Label();
|
||||||
|
this.nudMargemRPM = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.lblDelayBalanceamento = new System.Windows.Forms.Label();
|
||||||
|
this.nudDelayBalancemaneto = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.btnSalvarSentido = new System.Windows.Forms.Button();
|
||||||
this.gpbSentido.SuspendLayout();
|
this.gpbSentido.SuspendLayout();
|
||||||
this.gpbDF.SuspendLayout();
|
this.gpbDF.SuspendLayout();
|
||||||
this.gpbEF.SuspendLayout();
|
this.gpbEF.SuspendLayout();
|
||||||
|
|
@ -93,11 +97,12 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudPPR)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudPPR)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudRampaMax)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudRampaMax)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudRampaMin)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudRampaMin)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudMargemRPM)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudDelayBalancemaneto)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// gpbSentido
|
// gpbSentido
|
||||||
//
|
//
|
||||||
this.gpbSentido.Controls.Add(this.btnSalvarSentido);
|
|
||||||
this.gpbSentido.Controls.Add(this.gpbDF);
|
this.gpbSentido.Controls.Add(this.gpbDF);
|
||||||
this.gpbSentido.Controls.Add(this.gpbEF);
|
this.gpbSentido.Controls.Add(this.gpbEF);
|
||||||
this.gpbSentido.Controls.Add(this.gpbDT);
|
this.gpbSentido.Controls.Add(this.gpbDT);
|
||||||
|
|
@ -106,22 +111,11 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.gpbSentido.Margin = new System.Windows.Forms.Padding(2);
|
this.gpbSentido.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbSentido.Name = "gpbSentido";
|
this.gpbSentido.Name = "gpbSentido";
|
||||||
this.gpbSentido.Padding = new System.Windows.Forms.Padding(2);
|
this.gpbSentido.Padding = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbSentido.Size = new System.Drawing.Size(379, 345);
|
this.gpbSentido.Size = new System.Drawing.Size(379, 308);
|
||||||
this.gpbSentido.TabIndex = 40;
|
this.gpbSentido.TabIndex = 40;
|
||||||
this.gpbSentido.TabStop = false;
|
this.gpbSentido.TabStop = false;
|
||||||
this.gpbSentido.Text = "Sentido de giro";
|
this.gpbSentido.Text = "Sentido de giro";
|
||||||
//
|
//
|
||||||
// btnSalvarSentido
|
|
||||||
//
|
|
||||||
this.btnSalvarSentido.Location = new System.Drawing.Point(196, 310);
|
|
||||||
this.btnSalvarSentido.Margin = new System.Windows.Forms.Padding(2);
|
|
||||||
this.btnSalvarSentido.Name = "btnSalvarSentido";
|
|
||||||
this.btnSalvarSentido.Size = new System.Drawing.Size(168, 24);
|
|
||||||
this.btnSalvarSentido.TabIndex = 8;
|
|
||||||
this.btnSalvarSentido.Text = "Salvar";
|
|
||||||
this.btnSalvarSentido.UseVisualStyleBackColor = true;
|
|
||||||
this.btnSalvarSentido.Click += new System.EventHandler(this.btnSalvarSentido_Click);
|
|
||||||
//
|
|
||||||
// gpbDF
|
// gpbDF
|
||||||
//
|
//
|
||||||
this.gpbDF.Controls.Add(this.cmbDFFrente);
|
this.gpbDF.Controls.Add(this.cmbDFFrente);
|
||||||
|
|
@ -504,7 +498,10 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// groupBox1
|
// groupBox1
|
||||||
//
|
//
|
||||||
this.groupBox1.Controls.Add(this.chbMalhaFechada);
|
this.groupBox1.Controls.Add(this.lblMargemRPM);
|
||||||
|
this.groupBox1.Controls.Add(this.nudMargemRPM);
|
||||||
|
this.groupBox1.Controls.Add(this.lblDelayBalanceamento);
|
||||||
|
this.groupBox1.Controls.Add(this.nudDelayBalancemaneto);
|
||||||
this.groupBox1.Controls.Add(this.gpbPID);
|
this.groupBox1.Controls.Add(this.gpbPID);
|
||||||
this.groupBox1.Controls.Add(this.btnSalvarPID);
|
this.groupBox1.Controls.Add(this.btnSalvarPID);
|
||||||
this.groupBox1.Controls.Add(this.lblPPR);
|
this.groupBox1.Controls.Add(this.lblPPR);
|
||||||
|
|
@ -513,7 +510,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.groupBox1.Controls.Add(this.lblRampaMin);
|
this.groupBox1.Controls.Add(this.lblRampaMin);
|
||||||
this.groupBox1.Controls.Add(this.nudRampaMax);
|
this.groupBox1.Controls.Add(this.nudRampaMax);
|
||||||
this.groupBox1.Controls.Add(this.nudRampaMin);
|
this.groupBox1.Controls.Add(this.nudRampaMin);
|
||||||
this.groupBox1.Location = new System.Drawing.Point(11, 361);
|
this.groupBox1.Location = new System.Drawing.Point(11, 323);
|
||||||
this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
|
this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.groupBox1.Name = "groupBox1";
|
this.groupBox1.Name = "groupBox1";
|
||||||
this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
|
this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
|
||||||
|
|
@ -527,7 +524,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.chbMalhaFechada.AutoSize = true;
|
this.chbMalhaFechada.AutoSize = true;
|
||||||
this.chbMalhaFechada.Checked = true;
|
this.chbMalhaFechada.Checked = true;
|
||||||
this.chbMalhaFechada.CheckState = System.Windows.Forms.CheckState.Checked;
|
this.chbMalhaFechada.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
this.chbMalhaFechada.Location = new System.Drawing.Point(262, 40);
|
this.chbMalhaFechada.Location = new System.Drawing.Point(17, 17);
|
||||||
this.chbMalhaFechada.Margin = new System.Windows.Forms.Padding(2);
|
this.chbMalhaFechada.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.chbMalhaFechada.Name = "chbMalhaFechada";
|
this.chbMalhaFechada.Name = "chbMalhaFechada";
|
||||||
this.chbMalhaFechada.Size = new System.Drawing.Size(100, 17);
|
this.chbMalhaFechada.Size = new System.Drawing.Size(100, 17);
|
||||||
|
|
@ -542,13 +539,15 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.gpbPID.Controls.Add(this.txtKp);
|
this.gpbPID.Controls.Add(this.txtKp);
|
||||||
this.gpbPID.Controls.Add(this.lblKi);
|
this.gpbPID.Controls.Add(this.lblKi);
|
||||||
this.gpbPID.Controls.Add(this.txtKi);
|
this.gpbPID.Controls.Add(this.txtKi);
|
||||||
|
this.gpbPID.Controls.Add(this.chbMalhaFechada);
|
||||||
this.gpbPID.Controls.Add(this.lblKd);
|
this.gpbPID.Controls.Add(this.lblKd);
|
||||||
this.gpbPID.Controls.Add(this.txtKd);
|
this.gpbPID.Controls.Add(this.txtKd);
|
||||||
this.gpbPID.Location = new System.Drawing.Point(4, 71);
|
this.gpbPID.Enabled = false;
|
||||||
|
this.gpbPID.Location = new System.Drawing.Point(4, 60);
|
||||||
this.gpbPID.Margin = new System.Windows.Forms.Padding(2);
|
this.gpbPID.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbPID.Name = "gpbPID";
|
this.gpbPID.Name = "gpbPID";
|
||||||
this.gpbPID.Padding = new System.Windows.Forms.Padding(2);
|
this.gpbPID.Padding = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbPID.Size = new System.Drawing.Size(268, 61);
|
this.gpbPID.Size = new System.Drawing.Size(268, 76);
|
||||||
this.gpbPID.TabIndex = 37;
|
this.gpbPID.TabIndex = 37;
|
||||||
this.gpbPID.TabStop = false;
|
this.gpbPID.TabStop = false;
|
||||||
this.gpbPID.Text = "PID";
|
this.gpbPID.Text = "PID";
|
||||||
|
|
@ -556,7 +555,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
// lblKp
|
// lblKp
|
||||||
//
|
//
|
||||||
this.lblKp.AutoSize = true;
|
this.lblKp.AutoSize = true;
|
||||||
this.lblKp.Location = new System.Drawing.Point(14, 29);
|
this.lblKp.Location = new System.Drawing.Point(14, 44);
|
||||||
this.lblKp.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblKp.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblKp.Name = "lblKp";
|
this.lblKp.Name = "lblKp";
|
||||||
this.lblKp.Size = new System.Drawing.Size(20, 13);
|
this.lblKp.Size = new System.Drawing.Size(20, 13);
|
||||||
|
|
@ -565,7 +564,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// txtKp
|
// txtKp
|
||||||
//
|
//
|
||||||
this.txtKp.Location = new System.Drawing.Point(37, 27);
|
this.txtKp.Location = new System.Drawing.Point(37, 42);
|
||||||
this.txtKp.Margin = new System.Windows.Forms.Padding(2);
|
this.txtKp.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.txtKp.Name = "txtKp";
|
this.txtKp.Name = "txtKp";
|
||||||
this.txtKp.Size = new System.Drawing.Size(46, 20);
|
this.txtKp.Size = new System.Drawing.Size(46, 20);
|
||||||
|
|
@ -576,7 +575,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
// lblKi
|
// lblKi
|
||||||
//
|
//
|
||||||
this.lblKi.AutoSize = true;
|
this.lblKi.AutoSize = true;
|
||||||
this.lblKi.Location = new System.Drawing.Point(101, 29);
|
this.lblKi.Location = new System.Drawing.Point(101, 44);
|
||||||
this.lblKi.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblKi.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblKi.Name = "lblKi";
|
this.lblKi.Name = "lblKi";
|
||||||
this.lblKi.Size = new System.Drawing.Size(16, 13);
|
this.lblKi.Size = new System.Drawing.Size(16, 13);
|
||||||
|
|
@ -585,7 +584,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// txtKi
|
// txtKi
|
||||||
//
|
//
|
||||||
this.txtKi.Location = new System.Drawing.Point(121, 27);
|
this.txtKi.Location = new System.Drawing.Point(121, 42);
|
||||||
this.txtKi.Margin = new System.Windows.Forms.Padding(2);
|
this.txtKi.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.txtKi.Name = "txtKi";
|
this.txtKi.Name = "txtKi";
|
||||||
this.txtKi.Size = new System.Drawing.Size(46, 20);
|
this.txtKi.Size = new System.Drawing.Size(46, 20);
|
||||||
|
|
@ -596,7 +595,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
// lblKd
|
// lblKd
|
||||||
//
|
//
|
||||||
this.lblKd.AutoSize = true;
|
this.lblKd.AutoSize = true;
|
||||||
this.lblKd.Location = new System.Drawing.Point(184, 29);
|
this.lblKd.Location = new System.Drawing.Point(184, 44);
|
||||||
this.lblKd.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblKd.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblKd.Name = "lblKd";
|
this.lblKd.Name = "lblKd";
|
||||||
this.lblKd.Size = new System.Drawing.Size(20, 13);
|
this.lblKd.Size = new System.Drawing.Size(20, 13);
|
||||||
|
|
@ -605,7 +604,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// txtKd
|
// txtKd
|
||||||
//
|
//
|
||||||
this.txtKd.Location = new System.Drawing.Point(207, 27);
|
this.txtKd.Location = new System.Drawing.Point(207, 42);
|
||||||
this.txtKd.Margin = new System.Windows.Forms.Padding(2);
|
this.txtKd.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.txtKd.Name = "txtKd";
|
this.txtKd.Name = "txtKd";
|
||||||
this.txtKd.Size = new System.Drawing.Size(46, 20);
|
this.txtKd.Size = new System.Drawing.Size(46, 20);
|
||||||
|
|
@ -615,28 +614,28 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// btnSalvarPID
|
// btnSalvarPID
|
||||||
//
|
//
|
||||||
this.btnSalvarPID.Location = new System.Drawing.Point(277, 93);
|
this.btnSalvarPID.Location = new System.Drawing.Point(276, 109);
|
||||||
this.btnSalvarPID.Margin = new System.Windows.Forms.Padding(2);
|
this.btnSalvarPID.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.btnSalvarPID.Name = "btnSalvarPID";
|
this.btnSalvarPID.Name = "btnSalvarPID";
|
||||||
this.btnSalvarPID.Size = new System.Drawing.Size(98, 27);
|
this.btnSalvarPID.Size = new System.Drawing.Size(98, 27);
|
||||||
this.btnSalvarPID.TabIndex = 28;
|
this.btnSalvarPID.TabIndex = 28;
|
||||||
this.btnSalvarPID.Text = "Salvar";
|
this.btnSalvarPID.Text = "Editar";
|
||||||
this.btnSalvarPID.UseVisualStyleBackColor = true;
|
this.btnSalvarPID.UseVisualStyleBackColor = true;
|
||||||
this.btnSalvarPID.Click += new System.EventHandler(this.btnSalvarPID_Click);
|
this.btnSalvarPID.Click += new System.EventHandler(this.btnSalvarPID_Click);
|
||||||
//
|
//
|
||||||
// lblPPR
|
// lblPPR
|
||||||
//
|
//
|
||||||
this.lblPPR.AutoSize = true;
|
this.lblPPR.AutoSize = true;
|
||||||
this.lblPPR.Location = new System.Drawing.Point(183, 23);
|
this.lblPPR.Location = new System.Drawing.Point(154, 18);
|
||||||
this.lblPPR.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblPPR.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblPPR.Name = "lblPPR";
|
this.lblPPR.Name = "lblPPR";
|
||||||
this.lblPPR.Size = new System.Drawing.Size(32, 13);
|
this.lblPPR.Size = new System.Drawing.Size(29, 13);
|
||||||
this.lblPPR.TabIndex = 36;
|
this.lblPPR.TabIndex = 36;
|
||||||
this.lblPPR.Text = "PPR:";
|
this.lblPPR.Text = "PPR";
|
||||||
//
|
//
|
||||||
// nudPPR
|
// nudPPR
|
||||||
//
|
//
|
||||||
this.nudPPR.Location = new System.Drawing.Point(185, 39);
|
this.nudPPR.Location = new System.Drawing.Point(156, 34);
|
||||||
this.nudPPR.Margin = new System.Windows.Forms.Padding(2);
|
this.nudPPR.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.nudPPR.Maximum = new decimal(new int[] {
|
this.nudPPR.Maximum = new decimal(new int[] {
|
||||||
999,
|
999,
|
||||||
|
|
@ -653,7 +652,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.nudPPR.TabIndex = 35;
|
this.nudPPR.TabIndex = 35;
|
||||||
this.nudPPR.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
this.nudPPR.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
this.nudPPR.Value = new decimal(new int[] {
|
this.nudPPR.Value = new decimal(new int[] {
|
||||||
40,
|
22,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0});
|
0});
|
||||||
|
|
@ -662,26 +661,26 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
// lblRampaMax
|
// lblRampaMax
|
||||||
//
|
//
|
||||||
this.lblRampaMax.AutoSize = true;
|
this.lblRampaMax.AutoSize = true;
|
||||||
this.lblRampaMax.Location = new System.Drawing.Point(93, 23);
|
this.lblRampaMax.Location = new System.Drawing.Point(83, 18);
|
||||||
this.lblRampaMax.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblRampaMax.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblRampaMax.Name = "lblRampaMax";
|
this.lblRampaMax.Name = "lblRampaMax";
|
||||||
this.lblRampaMax.Size = new System.Drawing.Size(67, 13);
|
this.lblRampaMax.Size = new System.Drawing.Size(64, 13);
|
||||||
this.lblRampaMax.TabIndex = 34;
|
this.lblRampaMax.TabIndex = 34;
|
||||||
this.lblRampaMax.Text = "Rampa Max:";
|
this.lblRampaMax.Text = "Rampa Max";
|
||||||
//
|
//
|
||||||
// lblRampaMin
|
// lblRampaMin
|
||||||
//
|
//
|
||||||
this.lblRampaMin.AutoSize = true;
|
this.lblRampaMin.AutoSize = true;
|
||||||
this.lblRampaMin.Location = new System.Drawing.Point(11, 23);
|
this.lblRampaMin.Location = new System.Drawing.Point(11, 18);
|
||||||
this.lblRampaMin.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
this.lblRampaMin.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.lblRampaMin.Name = "lblRampaMin";
|
this.lblRampaMin.Name = "lblRampaMin";
|
||||||
this.lblRampaMin.Size = new System.Drawing.Size(64, 13);
|
this.lblRampaMin.Size = new System.Drawing.Size(61, 13);
|
||||||
this.lblRampaMin.TabIndex = 33;
|
this.lblRampaMin.TabIndex = 33;
|
||||||
this.lblRampaMin.Text = "Rampa Min:";
|
this.lblRampaMin.Text = "Rampa Min";
|
||||||
//
|
//
|
||||||
// nudRampaMax
|
// nudRampaMax
|
||||||
//
|
//
|
||||||
this.nudRampaMax.Location = new System.Drawing.Point(95, 39);
|
this.nudRampaMax.Location = new System.Drawing.Point(85, 34);
|
||||||
this.nudRampaMax.Margin = new System.Windows.Forms.Padding(2);
|
this.nudRampaMax.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.nudRampaMax.Maximum = new decimal(new int[] {
|
this.nudRampaMax.Maximum = new decimal(new int[] {
|
||||||
9999,
|
9999,
|
||||||
|
|
@ -693,7 +692,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.nudRampaMax.TabIndex = 32;
|
this.nudRampaMax.TabIndex = 32;
|
||||||
this.nudRampaMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
this.nudRampaMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
this.nudRampaMax.Value = new decimal(new int[] {
|
this.nudRampaMax.Value = new decimal(new int[] {
|
||||||
4095,
|
1023,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0});
|
0});
|
||||||
|
|
@ -701,7 +700,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
//
|
//
|
||||||
// nudRampaMin
|
// nudRampaMin
|
||||||
//
|
//
|
||||||
this.nudRampaMin.Location = new System.Drawing.Point(14, 39);
|
this.nudRampaMin.Location = new System.Drawing.Point(14, 34);
|
||||||
this.nudRampaMin.Margin = new System.Windows.Forms.Padding(2);
|
this.nudRampaMin.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.nudRampaMin.Maximum = new decimal(new int[] {
|
this.nudRampaMin.Maximum = new decimal(new int[] {
|
||||||
9999,
|
9999,
|
||||||
|
|
@ -714,12 +713,84 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
this.nudRampaMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
this.nudRampaMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
this.nudRampaMin.ValueChanged += new System.EventHandler(this.nudRampaMin_ValueChanged);
|
this.nudRampaMin.ValueChanged += new System.EventHandler(this.nudRampaMin_ValueChanged);
|
||||||
//
|
//
|
||||||
|
// lblMargemRPM
|
||||||
|
//
|
||||||
|
this.lblMargemRPM.AutoSize = true;
|
||||||
|
this.lblMargemRPM.Location = new System.Drawing.Point(296, 18);
|
||||||
|
this.lblMargemRPM.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.lblMargemRPM.Name = "lblMargemRPM";
|
||||||
|
this.lblMargemRPM.Size = new System.Drawing.Size(72, 13);
|
||||||
|
this.lblMargemRPM.TabIndex = 41;
|
||||||
|
this.lblMargemRPM.Text = "Margem RPM";
|
||||||
|
//
|
||||||
|
// nudMargemRPM
|
||||||
|
//
|
||||||
|
this.nudMargemRPM.Location = new System.Drawing.Point(298, 34);
|
||||||
|
this.nudMargemRPM.Margin = new System.Windows.Forms.Padding(2);
|
||||||
|
this.nudMargemRPM.Maximum = new decimal(new int[] {
|
||||||
|
99,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.nudMargemRPM.Name = "nudMargemRPM";
|
||||||
|
this.nudMargemRPM.Size = new System.Drawing.Size(57, 20);
|
||||||
|
this.nudMargemRPM.TabIndex = 40;
|
||||||
|
this.nudMargemRPM.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
|
this.nudMargemRPM.Value = new decimal(new int[] {
|
||||||
|
5,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.nudMargemRPM.ValueChanged += new System.EventHandler(this.nudMargemRPM_ValueChanged);
|
||||||
|
//
|
||||||
|
// lblDelayBalanceamento
|
||||||
|
//
|
||||||
|
this.lblDelayBalanceamento.AutoSize = true;
|
||||||
|
this.lblDelayBalanceamento.Location = new System.Drawing.Point(225, 18);
|
||||||
|
this.lblDelayBalanceamento.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.lblDelayBalanceamento.Name = "lblDelayBalanceamento";
|
||||||
|
this.lblDelayBalanceamento.Size = new System.Drawing.Size(64, 13);
|
||||||
|
this.lblDelayBalanceamento.TabIndex = 39;
|
||||||
|
this.lblDelayBalanceamento.Text = "Delay Balan";
|
||||||
|
//
|
||||||
|
// nudDelayBalancemaneto
|
||||||
|
//
|
||||||
|
this.nudDelayBalancemaneto.Location = new System.Drawing.Point(227, 34);
|
||||||
|
this.nudDelayBalancemaneto.Margin = new System.Windows.Forms.Padding(2);
|
||||||
|
this.nudDelayBalancemaneto.Maximum = new decimal(new int[] {
|
||||||
|
99999,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.nudDelayBalancemaneto.Name = "nudDelayBalancemaneto";
|
||||||
|
this.nudDelayBalancemaneto.Size = new System.Drawing.Size(57, 20);
|
||||||
|
this.nudDelayBalancemaneto.TabIndex = 38;
|
||||||
|
this.nudDelayBalancemaneto.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
|
this.nudDelayBalancemaneto.Value = new decimal(new int[] {
|
||||||
|
2000,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.nudDelayBalancemaneto.ValueChanged += new System.EventHandler(this.nudDelayBalancemaneto_ValueChanged);
|
||||||
|
//
|
||||||
|
// btnSalvarSentido
|
||||||
|
//
|
||||||
|
this.btnSalvarSentido.Location = new System.Drawing.Point(222, 477);
|
||||||
|
this.btnSalvarSentido.Margin = new System.Windows.Forms.Padding(2);
|
||||||
|
this.btnSalvarSentido.Name = "btnSalvarSentido";
|
||||||
|
this.btnSalvarSentido.Size = new System.Drawing.Size(168, 24);
|
||||||
|
this.btnSalvarSentido.TabIndex = 136;
|
||||||
|
this.btnSalvarSentido.Text = "Salvar";
|
||||||
|
this.btnSalvarSentido.UseVisualStyleBackColor = true;
|
||||||
|
this.btnSalvarSentido.Click += new System.EventHandler(this.btnSalvarSentido_Click);
|
||||||
|
//
|
||||||
// frmMovConfig
|
// frmMovConfig
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.BackColor = System.Drawing.Color.White;
|
this.BackColor = System.Drawing.Color.White;
|
||||||
this.ClientSize = new System.Drawing.Size(398, 512);
|
this.ClientSize = new System.Drawing.Size(398, 512);
|
||||||
|
this.Controls.Add(this.btnSalvarSentido);
|
||||||
this.Controls.Add(this.groupBox1);
|
this.Controls.Add(this.groupBox1);
|
||||||
this.Controls.Add(this.gpbSentido);
|
this.Controls.Add(this.gpbSentido);
|
||||||
this.Margin = new System.Windows.Forms.Padding(2);
|
this.Margin = new System.Windows.Forms.Padding(2);
|
||||||
|
|
@ -744,6 +815,8 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudPPR)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudPPR)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudRampaMax)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudRampaMax)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.nudRampaMin)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.nudRampaMin)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudMargemRPM)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudDelayBalancemaneto)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -760,7 +833,6 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
private System.Windows.Forms.Label lblDFTras;
|
private System.Windows.Forms.Label lblDFTras;
|
||||||
private System.Windows.Forms.Label lblDFFrente;
|
private System.Windows.Forms.Label lblDFFrente;
|
||||||
private System.Windows.Forms.GroupBox gpbEF;
|
private System.Windows.Forms.GroupBox gpbEF;
|
||||||
private System.Windows.Forms.Button btnSalvarSentido;
|
|
||||||
private System.Windows.Forms.ComboBox cmbEFFrente;
|
private System.Windows.Forms.ComboBox cmbEFFrente;
|
||||||
private System.Windows.Forms.ComboBox cmbEFTras;
|
private System.Windows.Forms.ComboBox cmbEFTras;
|
||||||
private System.Windows.Forms.ComboBox cmbEFDireita;
|
private System.Windows.Forms.ComboBox cmbEFDireita;
|
||||||
|
|
@ -803,5 +875,10 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
private System.Windows.Forms.Label lblRampaMin;
|
private System.Windows.Forms.Label lblRampaMin;
|
||||||
private System.Windows.Forms.NumericUpDown nudRampaMax;
|
private System.Windows.Forms.NumericUpDown nudRampaMax;
|
||||||
private System.Windows.Forms.NumericUpDown nudRampaMin;
|
private System.Windows.Forms.NumericUpDown nudRampaMin;
|
||||||
|
private System.Windows.Forms.Label lblMargemRPM;
|
||||||
|
private System.Windows.Forms.NumericUpDown nudMargemRPM;
|
||||||
|
private System.Windows.Forms.Label lblDelayBalanceamento;
|
||||||
|
private System.Windows.Forms.NumericUpDown nudDelayBalancemaneto;
|
||||||
|
private System.Windows.Forms.Button btnSalvarSentido;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -24,6 +24,8 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
nudRampaMin.Value = MovimentacaoModel.RampaMin;
|
nudRampaMin.Value = MovimentacaoModel.RampaMin;
|
||||||
nudRampaMax.Value = MovimentacaoModel.RampaMax;
|
nudRampaMax.Value = MovimentacaoModel.RampaMax;
|
||||||
nudPPR.Value = MovimentacaoModel.PulsosPorRevolucao;
|
nudPPR.Value = MovimentacaoModel.PulsosPorRevolucao;
|
||||||
|
nudDelayBalancemaneto.Value = MovimentacaoModel._DelayBalanceamento;
|
||||||
|
nudMargemRPM.Value = MovimentacaoModel._MargemRPM;
|
||||||
chbMalhaFechada.Checked = MovimentacaoModel._FOC;
|
chbMalhaFechada.Checked = MovimentacaoModel._FOC;
|
||||||
txtKd.Text = MovimentacaoModel.Kd.ToString();
|
txtKd.Text = MovimentacaoModel.Kd.ToString();
|
||||||
txtKp.Text = MovimentacaoModel.Kp.ToString();
|
txtKp.Text = MovimentacaoModel.Kp.ToString();
|
||||||
|
|
@ -116,18 +118,27 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
|
|
||||||
private void btnSalvarPID_Click(object sender, EventArgs e)
|
private void btnSalvarPID_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (double.TryParse(txtKp.Text, out double kp))
|
if (btnSalvarPID.Text == "Editar")
|
||||||
{
|
{
|
||||||
MovimentacaoModel.Kp = kp;
|
btnSalvarPID.Text = "Salvar";
|
||||||
}
|
}
|
||||||
if (double.TryParse(txtKi.Text, out double ki))
|
else
|
||||||
{
|
{
|
||||||
MovimentacaoModel.Ki = ki;
|
btnSalvarPID.Text = "Editar";
|
||||||
}
|
if (double.TryParse(txtKp.Text, out double kp))
|
||||||
if (double.TryParse(txtKd.Text, out double kd))
|
{
|
||||||
{
|
MovimentacaoModel.Kp = kp;
|
||||||
MovimentacaoModel.Kd = kd;
|
}
|
||||||
|
if (double.TryParse(txtKi.Text, out double ki))
|
||||||
|
{
|
||||||
|
MovimentacaoModel.Ki = ki;
|
||||||
|
}
|
||||||
|
if (double.TryParse(txtKd.Text, out double kd))
|
||||||
|
{
|
||||||
|
MovimentacaoModel.Kd = kd;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
gpbPID.Enabled = btnSalvarPID.Text == "Salvar";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nudRampaMin_ValueChanged(object sender, EventArgs e)
|
private void nudRampaMin_ValueChanged(object sender, EventArgs e)
|
||||||
|
|
@ -144,5 +155,15 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
{
|
{
|
||||||
MovimentacaoModel.PulsosPorRevolucao = Convert.ToInt32(nudPPR.Value);
|
MovimentacaoModel.PulsosPorRevolucao = Convert.ToInt32(nudPPR.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void nudDelayBalancemaneto_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
MovimentacaoModel._DelayBalanceamento = Convert.ToInt32(nudDelayBalancemaneto.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void nudMargemRPM_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
MovimentacaoModel._MargemRPM = Convert.ToInt32(nudMargemRPM.Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,13 @@ namespace AgroBase.Forms
|
||||||
Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo;
|
Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo;
|
||||||
Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo;
|
Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo;
|
||||||
|
|
||||||
|
var serieRPMOffset = new Series("RPM Offset: " + (Log != null ? Log.RPM_Offset : 0));
|
||||||
|
serieRPMOffset.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM_Offset).ToList());
|
||||||
|
serieRPMOffset.ChartType = SeriesChartType.Spline;
|
||||||
|
chart.Series.Add(serieRPMOffset);
|
||||||
|
Minimo = Logs.Min(x => x.RPM_Offset) < Minimo ? Logs.Min(x => x.RPM_Offset) : Minimo;
|
||||||
|
Maximo = Logs.Max(x => x.RPM_Offset) > Maximo ? Logs.Max(x => x.RPM_Offset) : Maximo;
|
||||||
|
|
||||||
var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0));
|
var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0));
|
||||||
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
|
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
|
||||||
seriePotencia.ChartType = SeriesChartType.Line;
|
seriePotencia.ChartType = SeriesChartType.Line;
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,14 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
public static int _TaxaAmostragem { get; set; } = 500;
|
public static int _TaxaAmostragem { get; set; } = 500;
|
||||||
public static int RampaMin { get; set; } = 0;
|
public static int RampaMin { get; set; } = 0;
|
||||||
public static int RampaMax { get; set; } = 4095;
|
public static int RampaMax { get; set; } = 1023;
|
||||||
public static int PulsosPorRevolucao { get; set; } = 22;
|
public static int PulsosPorRevolucao { get; set; } = 22;
|
||||||
public static bool _FOC { get; set; } = true;
|
public static bool _FOC { get; set; } = true;
|
||||||
public static double Kp { get; set; } = 1.85;
|
public static double Kp { get; set; } = 1.85;
|
||||||
public static double Ki { get; set; } = 2.1;
|
public static double Ki { get; set; } = 2.1;
|
||||||
public static double Kd { get; set; } = 0.08;
|
public static double Kd { get; set; } = 0.08;
|
||||||
|
public static int _DelayBalanceamento { get; set; } = 2000;
|
||||||
|
public static int _MargemRPM { get; set; } = 5;
|
||||||
public static double DiametroRoda { get; set; } = 0.3556;
|
public static double DiametroRoda { get; set; } = 0.3556;
|
||||||
public bool Conectado { get; set; } = false;
|
public bool Conectado { get; set; } = false;
|
||||||
public static int LogsManter { get; set; } = 60;
|
public static int LogsManter { get; set; } = 60;
|
||||||
|
|
@ -36,6 +38,7 @@ namespace AgroBase.Models
|
||||||
public Timer tmrRegistrador { get; set; }
|
public Timer tmrRegistrador { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static MovimentacaoModel CarregarParametrosIniciais()
|
public static MovimentacaoModel CarregarParametrosIniciais()
|
||||||
{
|
{
|
||||||
return new MovimentacaoModel()
|
return new MovimentacaoModel()
|
||||||
|
|
@ -139,8 +142,10 @@ namespace AgroBase.Models
|
||||||
_TaxaAmostragem.ToString("00000") + ";" + // 5 ~ 9
|
_TaxaAmostragem.ToString("00000") + ";" + // 5 ~ 9
|
||||||
(Pinout.Any(x => x.Funcao == FuncoesPinout.Geral) ? Pinout.FirstOrDefault(x => x.Funcao == FuncoesPinout.Geral).Pino.ToString("00") : "-1") + ";" + // 11 ~ 12
|
(Pinout.Any(x => x.Funcao == FuncoesPinout.Geral) ? Pinout.FirstOrDefault(x => x.Funcao == FuncoesPinout.Geral).Pino.ToString("00") : "-1") + ";" + // 11 ~ 12
|
||||||
RampaMin.ToString("0000") + ";" + // 14 ~ 17
|
RampaMin.ToString("0000") + ";" + // 14 ~ 17
|
||||||
RampaMax.ToString("0000"); // 19 ~ 22
|
RampaMax.ToString("0000") + // 19 ~ 22
|
||||||
PulsosPorRevolucao.ToString("000"); // 24 ~ 26
|
PulsosPorRevolucao.ToString("000") + // 24 ~ 26
|
||||||
|
_DelayBalanceamento.ToString("000") + // 28 ~ 32
|
||||||
|
_MargemRPM.ToString("00");// 34 ~ 35
|
||||||
Config.Add(ProtocoloMOD);
|
Config.Add(ProtocoloMOD);
|
||||||
return Config;
|
return Config;
|
||||||
}
|
}
|
||||||
|
|
@ -182,6 +187,9 @@ namespace AgroBase.Models
|
||||||
int.TryParse(Dados[5], out sentido);
|
int.TryParse(Dados[5], out sentido);
|
||||||
Motor.Sentido = (Sentido)sentido;
|
Motor.Sentido = (Sentido)sentido;
|
||||||
Motor.Revertendo = Dados[6] == "1";
|
Motor.Revertendo = Dados[6] == "1";
|
||||||
|
double rpm_offset = 0;
|
||||||
|
double.TryParse(Dados[7].Replace(".", ","), out rpm_offset);
|
||||||
|
Motor.RPM_Offset = rpm_offset;
|
||||||
AtualizaGrafico = true;
|
AtualizaGrafico = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -246,6 +254,7 @@ namespace AgroBase.Models
|
||||||
ComponenteID = Motor.ID,
|
ComponenteID = Motor.ID,
|
||||||
RPM_SP = Motor.RPM_SP,
|
RPM_SP = Motor.RPM_SP,
|
||||||
RPM = Motor.RPM,
|
RPM = Motor.RPM,
|
||||||
|
RPM_Offset = Motor.RPM_Offset,
|
||||||
Periodo = Motor.Intervalo,
|
Periodo = Motor.Intervalo,
|
||||||
Potencia = Motor.Potencia,
|
Potencia = Motor.Potencia,
|
||||||
PotenciaSP = Motor.Potencia_SP,
|
PotenciaSP = Motor.Potencia_SP,
|
||||||
|
|
@ -306,6 +315,7 @@ namespace AgroBase.Models
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clStatus", "Status");
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clStatus", "Status");
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clPotencia", "Potencia");
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clPotencia", "Potencia");
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clRPM", "RPM");
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clRPM", "RPM");
|
||||||
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clRPMOffset", "RPM Offset");
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clVelocidade", "Velocidade");
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clVelocidade", "Velocidade");
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clTemperatura", "Temperatura");
|
frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clTemperatura", "Temperatura");
|
||||||
//frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clUmidade", "Umidade");
|
//frmInstancial.frmPrincipal.gridSenMotores.Columns.Add("clUmidade", "Umidade");
|
||||||
|
|
@ -320,6 +330,7 @@ namespace AgroBase.Models
|
||||||
Enum.GetName(typeof(StatusMotor), Motor.Aceleracao),
|
Enum.GetName(typeof(StatusMotor), Motor.Aceleracao),
|
||||||
Motor.Potencia.ToString(),
|
Motor.Potencia.ToString(),
|
||||||
Motor.RPM.ToString(),
|
Motor.RPM.ToString(),
|
||||||
|
Motor.RPM_Offset.ToString(),
|
||||||
Motor.VelocidadeInstantanea.ToString(),
|
Motor.VelocidadeInstantanea.ToString(),
|
||||||
Motor.Temperatura.ToString(),
|
Motor.Temperatura.ToString(),
|
||||||
//Motor.Umidade.ToString(),
|
//Motor.Umidade.ToString(),
|
||||||
|
|
@ -338,9 +349,10 @@ namespace AgroBase.Models
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[4].Value = Enum.GetName(typeof(StatusMotor), Motor.Aceleracao);
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[4].Value = Enum.GetName(typeof(StatusMotor), Motor.Aceleracao);
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[5].Value = Motor.Potencia.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[5].Value = Motor.Potencia.ToString();
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[6].Value = Motor.RPM.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[6].Value = Motor.RPM.ToString();
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[7].Value = Motor.VelocidadeInstantanea.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[7].Value = Motor.RPM_Offset.ToString();
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[8].Value = Motor.Temperatura.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[8].Value = Motor.VelocidadeInstantanea.ToString();
|
||||||
//frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[9].Value = Motor.Umidade.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[9].Value = Motor.Temperatura.ToString();
|
||||||
|
//frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[10].Value = Motor.Umidade.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -369,7 +381,7 @@ namespace AgroBase.Models
|
||||||
Enabled = false
|
Enabled = false
|
||||||
};
|
};
|
||||||
tmrRegistrador.Tick += TmrRegistrador_Tick;
|
tmrRegistrador.Tick += TmrRegistrador_Tick;
|
||||||
tmrRegistrador.Enabled = true;
|
tmrRegistrador.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TmrRegistrador_Tick(object sender, EventArgs e)
|
private void TmrRegistrador_Tick(object sender, EventArgs e)
|
||||||
|
|
@ -394,6 +406,8 @@ namespace AgroBase.Models
|
||||||
double RPM = Math.Round((Velocidade * 1000) / (Math.PI * DiametroRoda * 60), 2);
|
double RPM = Math.Round((Velocidade * 1000) / (Math.PI * DiametroRoda * 60), 2);
|
||||||
return RPM;
|
return RPM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MovSensoriamentoMotor
|
public class MovSensoriamentoMotor
|
||||||
|
|
@ -413,6 +427,7 @@ namespace AgroBase.Models
|
||||||
public Sentido Sentido { get; set; } = Sentido.Parado;
|
public Sentido Sentido { get; set; } = Sentido.Parado;
|
||||||
public StatusMotor Aceleracao { get; set; } = StatusMotor.Estavel;
|
public StatusMotor Aceleracao { get; set; } = StatusMotor.Estavel;
|
||||||
public double RPM { get; set; } = 0;
|
public double RPM { get; set; } = 0;
|
||||||
|
public double RPM_Offset { get; set; } = 0;
|
||||||
public long Intervalo { get; set; } = 0;
|
public long Intervalo { get; set; } = 0;
|
||||||
public double VelocidadeInstantanea { get; set; } = 0;
|
public double VelocidadeInstantanea { get; set; } = 0;
|
||||||
public double Temperatura { get; set; } = 0;
|
public double Temperatura { get; set; } = 0;
|
||||||
|
|
@ -529,6 +544,7 @@ namespace AgroBase.Models
|
||||||
public string ComponenteID { get; set; }
|
public string ComponenteID { get; set; }
|
||||||
public int RPM_SP { get; set; }
|
public int RPM_SP { get; set; }
|
||||||
public double RPM { get; set; }
|
public double RPM { get; set; }
|
||||||
|
public double RPM_Offset { get; set; }
|
||||||
public long Periodo { get; set; }
|
public long Periodo { get; set; }
|
||||||
public double Potencia { get; set; }
|
public double Potencia { get; set; }
|
||||||
public double PotenciaSP { get; set; }
|
public double PotenciaSP { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -370,7 +370,7 @@ namespace AgroBase.Models.Modules
|
||||||
null;
|
null;
|
||||||
if (Motor != null)
|
if (Motor != null)
|
||||||
{
|
{
|
||||||
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[8].Value = Motor.Temperatura.ToString();
|
frmInstancial.frmPrincipal.gridSenMotores.Rows[Motor.Canal].Cells[9].Value = Motor.Temperatura.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
{"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[22.13],"ValorMinimo":0.0,"ValorMaximo":125.27},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[0.0],"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[0.0],"ValorMinimo":0.0,"ValorMaximo":211.32},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[228.34],"ValorMinimo":0.0,"ValorMaximo":228.34},{"LogGrafico":[],"ID":"VBAT","Prioridade":20,"Descricao":"Tensão da bateria","Componente":112,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[28],"Parametros":[["V offset","-0.900"],["R1","120000"],["R2","010000"]],"UnidadeMedida":null,"Leituras":[327.0,0.33,4.28],"ValorMinimo":0.0,"ValorMaximo":13.66},{"LogGrafico":[],"ID":"ABAT","Prioridade":10,"Descricao":"Corrente da bateria","Componente":322,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[29],"Parametros":[["V offset","00.413"],["Sensibilidade","000.35"]],"UnidadeMedida":null,"Leituras":[446.0,0.36,-0.15],"ValorMinimo":-1.15,"ValorMaximo":1.51},{"LogGrafico":[],"ID":"TBAT","Prioridade":5,"Descricao":"Temperatura da bateria","Componente":411,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","0.0000"]],"UnidadeMedida":null,"Leituras":[179.53],"ValorMinimo":-273.15,"ValorMaximo":265.63}]}
|
{"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[10.41],"ValorMinimo":0.0,"ValorMaximo":125.27},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[12.24],"ValorMinimo":0.0,"ValorMaximo":74.35},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[15.06],"ValorMinimo":0.0,"ValorMaximo":211.32},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","-1.038"]],"UnidadeMedida":null,"Leituras":[12.25],"ValorMinimo":0.0,"ValorMaximo":228.34},{"LogGrafico":[],"ID":"VBAT","Prioridade":20,"Descricao":"Tensão da bateria","Componente":112,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[28],"Parametros":[["V offset","-0.900"],["R1","120000"],["R2","010000"]],"UnidadeMedida":null,"Leituras":[4095.0,3.23,42.0],"ValorMinimo":0.0,"ValorMaximo":42.0},{"LogGrafico":[],"ID":"ABAT","Prioridade":10,"Descricao":"Corrente da bateria","Componente":322,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[29],"Parametros":[["V offset","00.413"],["Sensibilidade","000.35"]],"UnidadeMedida":null,"Leituras":[0.0,0.0,-1.18],"ValorMinimo":-1.18,"ValorMaximo":1.51},{"LogGrafico":[],"ID":"TBAT","Prioridade":5,"Descricao":"Temperatura da bateria","Componente":411,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["V offset","0.0000"]],"UnidadeMedida":null,"Leituras":[32.34],"ValorMinimo":-273.15,"ValorMaximo":265.63}]}
|
||||||
|
|
@ -1 +1 @@
|
||||||
[{"Tipo":0,"Pino":99,"Descricao":"1","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":98,"Descricao":"2","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":97,"Descricao":"3","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":4,"Descricao":"4","Funcao":5,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":5,"Descricao":"5","Funcao":9,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":6,"Descricao":"6","Funcao":10,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":7,"Descricao":"7","Funcao":11,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":15,"Descricao":"8","Funcao":6,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":16,"Descricao":"9","Funcao":7,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":17,"Descricao":"10","Funcao":8,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":18,"Descricao":"11","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":8,"Descricao":"12","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":3,"Descricao":"13","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":46,"Descricao":"14","Funcao":7,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":9,"Descricao":"15","Funcao":8,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":10,"Descricao":"16","Funcao":6,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":11,"Descricao":"17","Funcao":11,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":12,"Descricao":"18","Funcao":10,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":13,"Descricao":"19","Funcao":9,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":14,"Descricao":"20","Funcao":5,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":96,"Descricao":"21","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":95,"Descricao":"22","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":94,"Descricao":"23","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":93,"Descricao":"24","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":19,"Descricao":"25","Funcao":5,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":20,"Descricao":"26","Funcao":9,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":21,"Descricao":"27","Funcao":10,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":47,"Descricao":"28","Funcao":11,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":48,"Descricao":"29","Funcao":6,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":45,"Descricao":"30","Funcao":8,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":0,"Descricao":"31","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":35,"Descricao":"32","Funcao":7,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":36,"Descricao":"33","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":37,"Descricao":"34","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":38,"Descricao":"35","Funcao":7,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":39,"Descricao":"36","Funcao":8,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":40,"Descricao":"37","Funcao":6,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":41,"Descricao":"38","Funcao":11,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":42,"Descricao":"39","Funcao":10,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":2,"Descricao":"40","Funcao":9,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":1,"Descricao":"41","Funcao":5,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":44,"Descricao":"42","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":43,"Descricao":"43","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":92,"Descricao":"44","Funcao":0,"Habilitado":false,"ComponenteID":""}]
|
[{"Tipo":0,"Pino":99,"Descricao":"1","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":98,"Descricao":"2","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":97,"Descricao":"3","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":4,"Descricao":"4","Funcao":5,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":5,"Descricao":"5","Funcao":9,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":6,"Descricao":"6","Funcao":10,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":7,"Descricao":"7","Funcao":11,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":15,"Descricao":"8","Funcao":6,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":16,"Descricao":"9","Funcao":7,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":17,"Descricao":"10","Funcao":8,"Habilitado":true,"ComponenteID":"ET"},{"Tipo":0,"Pino":18,"Descricao":"11","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":8,"Descricao":"12","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":3,"Descricao":"13","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":46,"Descricao":"14","Funcao":7,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":9,"Descricao":"15","Funcao":8,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":10,"Descricao":"16","Funcao":6,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":11,"Descricao":"17","Funcao":11,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":12,"Descricao":"18","Funcao":10,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":13,"Descricao":"19","Funcao":9,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":14,"Descricao":"20","Funcao":5,"Habilitado":true,"ComponenteID":"DT"},{"Tipo":0,"Pino":96,"Descricao":"21","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":95,"Descricao":"22","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":94,"Descricao":"23","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":93,"Descricao":"24","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":19,"Descricao":"25","Funcao":5,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":20,"Descricao":"26","Funcao":9,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":21,"Descricao":"27","Funcao":10,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":47,"Descricao":"28","Funcao":11,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":48,"Descricao":"29","Funcao":6,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":45,"Descricao":"30","Funcao":8,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":0,"Descricao":"31","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":35,"Descricao":"32","Funcao":7,"Habilitado":true,"ComponenteID":"DF"},{"Tipo":0,"Pino":36,"Descricao":"33","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":37,"Descricao":"34","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":38,"Descricao":"35","Funcao":8,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":39,"Descricao":"36","Funcao":7,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":40,"Descricao":"37","Funcao":6,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":41,"Descricao":"38","Funcao":11,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":42,"Descricao":"39","Funcao":10,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":2,"Descricao":"40","Funcao":9,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":1,"Descricao":"41","Funcao":5,"Habilitado":true,"ComponenteID":"EF"},{"Tipo":0,"Pino":44,"Descricao":"42","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":43,"Descricao":"43","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":92,"Descricao":"44","Funcao":0,"Habilitado":false,"ComponenteID":""}]
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -41,13 +41,14 @@ String MontarDadosProtocoloTeste(bool Testando, String Componente, String Result
|
||||||
return Protocolo;
|
return Protocolo;
|
||||||
}
|
}
|
||||||
|
|
||||||
String MontarDadosProtocoloRPM(float rpm, double potencia, StatusMotor aceleracao, Sentido sentido, bool revertendo) {
|
String MontarDadosProtocoloRPM(float rpm, double potencia, StatusMotor aceleracao, Sentido sentido, bool revertendo, float rpm_offset) {
|
||||||
String Protocolo =
|
String Protocolo =
|
||||||
(String)rpm + ";" +
|
(String)rpm + ";" +
|
||||||
(String)potencia + ";" +
|
(String)potencia + ";" +
|
||||||
(String)aceleracao + ";" +
|
(String)aceleracao + ";" +
|
||||||
(String)sentido + ";" +
|
(String)sentido + ";" +
|
||||||
(revertendo ? "1" : "0");
|
(revertendo ? "1" : "0") + ";" +
|
||||||
|
(String)rpm_offset;
|
||||||
return Protocolo;
|
return Protocolo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,567 @@
|
||||||
|
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||||
|
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h"
|
||||||
|
#include <PID_v1.h>
|
||||||
|
#define D_Code Mov
|
||||||
|
|
||||||
|
#define _pinoLED RGB_BUILTIN
|
||||||
|
int _pinoReleGeral = -1;
|
||||||
|
|
||||||
|
long _baudRate = 115200;
|
||||||
|
|
||||||
|
bool Conectado = false;
|
||||||
|
|
||||||
|
int _TaxaAmostragem = 500;
|
||||||
|
const int PPR = 22; // Pulsos por revolução
|
||||||
|
|
||||||
|
int RampaMin = 0;
|
||||||
|
int ZeroRampa = 0;
|
||||||
|
int RampaMax = 1023;
|
||||||
|
|
||||||
|
class Motor {
|
||||||
|
public:
|
||||||
|
// Construtor
|
||||||
|
Motor(String desc) {
|
||||||
|
_ID = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Definições
|
||||||
|
String _ID;
|
||||||
|
int _canal;
|
||||||
|
int _pinoPWM;
|
||||||
|
int _pinoDIR;
|
||||||
|
int _pinoBRK;
|
||||||
|
int _pinoSTP;
|
||||||
|
int _pinoHLA;
|
||||||
|
int _pinoHLB;
|
||||||
|
int _pinoHLC;
|
||||||
|
|
||||||
|
double _Kp;
|
||||||
|
double _Ki;
|
||||||
|
double _Kd;
|
||||||
|
PID* _PID = nullptr;
|
||||||
|
|
||||||
|
bool Iniciado = false;
|
||||||
|
bool Testando = false;
|
||||||
|
bool Revertendo = false;
|
||||||
|
bool SentidoContrario = false;
|
||||||
|
StatusMotor Aceleracao = Estavel;
|
||||||
|
StatusMotor AceleracaoA = Estavel;
|
||||||
|
|
||||||
|
// Consumo
|
||||||
|
const int leituras = 5;
|
||||||
|
volatile float RPM_arr[5];
|
||||||
|
volatile bool Hall_arr[5][3];
|
||||||
|
double RPM;
|
||||||
|
double PotenciaAtual;
|
||||||
|
volatile int ultimaLeituraHallA = 0;
|
||||||
|
volatile int ultimaLeituraHallB = 0;
|
||||||
|
volatile int ultimaLeituraHallC = 0;
|
||||||
|
volatile unsigned int tempoAnterior = 0;
|
||||||
|
volatile float periodo = 0;
|
||||||
|
|
||||||
|
// Entrada de dados
|
||||||
|
bool _MalhaFechada;
|
||||||
|
int _PotMap;
|
||||||
|
double _RPM_SP;
|
||||||
|
Sentido _SentidoSP = Parado;
|
||||||
|
Sentido _Sentido = Parado;
|
||||||
|
Sentido _SentidoU = Parado;
|
||||||
|
int _US_Addr;
|
||||||
|
bool _Freio = false;
|
||||||
|
int _Margem = 2;
|
||||||
|
|
||||||
|
void Inicializar() {
|
||||||
|
if (Iniciado) {
|
||||||
|
EnviarDadosSerial(_ID + " ja inicializado");
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
ledcSetup(_canal, 1000, 10);
|
||||||
|
ledcAttachPin(_pinoPWM, _canal);
|
||||||
|
PotenciaAtual = ZeroRampa;
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
_RPM_SP = 0;
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
}
|
||||||
|
if (_pinoDIR > -1) {
|
||||||
|
pinMode(_pinoDIR, OUTPUT);
|
||||||
|
digitalWrite(_pinoDIR, LOW);
|
||||||
|
|
||||||
|
_SentidoU = Parado;
|
||||||
|
}
|
||||||
|
if (_pinoBRK > -1) {
|
||||||
|
pinMode(_pinoBRK, OUTPUT);
|
||||||
|
digitalWrite(_pinoBRK, LOW);
|
||||||
|
}
|
||||||
|
if (_pinoSTP > -1) {
|
||||||
|
pinMode(_pinoSTP, OUTPUT);
|
||||||
|
digitalWrite(_pinoSTP, HIGH);
|
||||||
|
}
|
||||||
|
if (_pinoHLA > -1) {
|
||||||
|
pinMode(_pinoHLA, INPUT);
|
||||||
|
ultimaLeituraHallA = digitalRead(_pinoHLA);
|
||||||
|
RPM = 0;
|
||||||
|
periodo = 0;
|
||||||
|
tempoAnterior = 0;
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(&Motor::RPMTaskWrapper, "RPMTask", 15000, this, 25 - _canal, &RPMTaskHandle, tskNO_AFFINITY);
|
||||||
|
|
||||||
|
ReiniciarAceleracaoArr();
|
||||||
|
ReiniciarHallArr();
|
||||||
|
|
||||||
|
_PID = new PID(&RPM, &PotenciaAtual, &_RPM_SP, _Kp, _Ki, _Kd, DIRECT);
|
||||||
|
_PID->SetOutputLimits(RampaMin, RampaMax);
|
||||||
|
_PID->SetMode(AUTOMATIC);
|
||||||
|
}
|
||||||
|
if (_pinoHLB > -1) {
|
||||||
|
pinMode(_pinoHLB, INPUT);
|
||||||
|
ultimaLeituraHallB = digitalRead(_pinoHLB);
|
||||||
|
}
|
||||||
|
if (_pinoHLC > -1) {
|
||||||
|
pinMode(_pinoHLC, INPUT);
|
||||||
|
ultimaLeituraHallC = digitalRead(_pinoHLC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(&Motor::RampaTaskWrapper, "RampaTask", 5000, this, 21 - _canal + 4, &RampaTaskHandle, tskNO_AFFINITY);
|
||||||
|
|
||||||
|
EnviarDadosSerial(_ID + " Iniciado");
|
||||||
|
|
||||||
|
Iniciado = true;
|
||||||
|
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Desligar() {
|
||||||
|
if (!Iniciado) {
|
||||||
|
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parar a execução das tarefas
|
||||||
|
vTaskDelete(RampaTaskHandle);
|
||||||
|
if (_pinoHLA > -1) {
|
||||||
|
vTaskDelete(RPMTaskHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Desanexar o canal PWM
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
ledcDetachPin(_pinoPWM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redefinir as configurações para os valores iniciais
|
||||||
|
pinMode(_pinoPWM, INPUT);
|
||||||
|
pinMode(_pinoDIR, INPUT);
|
||||||
|
pinMode(_pinoBRK, INPUT);
|
||||||
|
pinMode(_pinoSTP, INPUT);
|
||||||
|
pinMode(_pinoHLA, INPUT);
|
||||||
|
pinMode(_pinoHLB, INPUT);
|
||||||
|
pinMode(_pinoHLC, INPUT);
|
||||||
|
|
||||||
|
// Outras redefinições de variáveis de estado, se necessário
|
||||||
|
delete _PID;
|
||||||
|
|
||||||
|
EnviarDadosSerial(_ID + " Desligado");
|
||||||
|
|
||||||
|
Iniciado = false;
|
||||||
|
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReiniciarAceleracaoArr() {
|
||||||
|
for (int i = 0; i < leituras; i++) {
|
||||||
|
RPM_arr[i] = -1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReiniciarHallArr() {
|
||||||
|
for (int i = 0; i < leituras; i++) {
|
||||||
|
Hall_arr[i][0] = false;
|
||||||
|
Hall_arr[i][1] = false;
|
||||||
|
Hall_arr[i][2] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReverterSentidoGiro() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TaskHandle_t RPMTaskHandle = NULL;
|
||||||
|
static void RPMTaskWrapper(void *pvParameters) {
|
||||||
|
Motor *motor = static_cast<Motor*>(pvParameters);
|
||||||
|
motor->RPMTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RPMTask() {
|
||||||
|
const int RpmMax = 650; // RPM Máximo aferir
|
||||||
|
const float RelacaoPPR = (60 / PPR) * 1000; // Multiplicador do cálculo de RPM (período em ms)
|
||||||
|
const float MenorPeriodo = RelacaoPPR / RpmMax; // Tempo mínimo de leitura
|
||||||
|
unsigned long firstMilis = millis();
|
||||||
|
int pulsos = 0;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (!Conectado) {
|
||||||
|
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||||
|
vTaskDelay(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Medir RPM apenas quando ocorrer um pulso no sensor HALL
|
||||||
|
bool LeituraHa = digitalRead(_pinoHLA) == 1;
|
||||||
|
if (LeituraHa != ultimaLeituraHallA) {
|
||||||
|
ultimaLeituraHallA = LeituraHa;
|
||||||
|
pulsos++;
|
||||||
|
|
||||||
|
// Calcular o período em microssegundos
|
||||||
|
unsigned long tempoAtual = micros();
|
||||||
|
unsigned long periodoUs = tempoAtual - tempoAnterior;
|
||||||
|
periodo = periodoUs / 1000.0; // Converte de us para ms (2300 us para 2,3 ms)
|
||||||
|
|
||||||
|
// Salva o valor do RPM anterior
|
||||||
|
double RPM_A = RPM;
|
||||||
|
|
||||||
|
// Se o período entre pulsos for menor que o tempo mínimo entre pulsos em ms, significa que o sensor está em uma posição em que existe oscilação de leitura,
|
||||||
|
// pois o RPM estaria acima do máximo, logo, assumir o valor de RPM aferido anteriormente
|
||||||
|
if (periodo < MenorPeriodo) {
|
||||||
|
RPM = RPM_A;
|
||||||
|
}
|
||||||
|
// Calcular RPM se houve variação de tempo entre o pulso atual e o pulso anterior
|
||||||
|
else if (periodo != 0) {
|
||||||
|
// RPM = 60 / (Pulsos por Revolução * Período em segundos)
|
||||||
|
// A fórmula foi adaptada para otimizar processamento
|
||||||
|
RPM = RelacaoPPR / periodo;
|
||||||
|
}
|
||||||
|
// Se não houve alteração no período, então o motor não se moveu
|
||||||
|
else {
|
||||||
|
RPM = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CalcularSentidoGiro(RPM);
|
||||||
|
|
||||||
|
// Reiniciar variáveis
|
||||||
|
tempoAnterior = tempoAtual;
|
||||||
|
}
|
||||||
|
|
||||||
|
CorrigirPotenciaMotor();
|
||||||
|
|
||||||
|
long intMillis = (millis() - firstMilis);
|
||||||
|
|
||||||
|
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||||
|
if (intMillis >= _TaxaAmostragem) {
|
||||||
|
if (pulsos == 0) {
|
||||||
|
RPM = 0;
|
||||||
|
periodo = 0;
|
||||||
|
CalcularSentidoGiro(RPM);
|
||||||
|
}
|
||||||
|
pulsos = 0;
|
||||||
|
|
||||||
|
double PotAtual = fmap(PotenciaAtual, RampaMin, RampaMax, 0.0, 100.0);
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sRPM, _ID, MontarDadosProtocoloRPM(RPM, PotAtual, Aceleracao, _Sentido, Revertendo)));
|
||||||
|
firstMilis = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aguarda metade do menor período possível entre leituras
|
||||||
|
vTaskDelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CalcularSentidoGiro(float _RPM) {
|
||||||
|
if (_pinoHLA == -1 || _pinoHLB == -1 || _pinoHLC == -1) {
|
||||||
|
CalculaAceleracao(_RPM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LeituraHa = ultimaLeituraHallA == 1;
|
||||||
|
bool LeituraHb = digitalRead(_pinoHLB) == 1;
|
||||||
|
bool LeituraHc = digitalRead(_pinoHLC) == 1;
|
||||||
|
|
||||||
|
for (int i = 1; i < leituras; i++) {
|
||||||
|
Hall_arr[i - 1][0] = Hall_arr[i][0];
|
||||||
|
Hall_arr[i - 1][1] = Hall_arr[i][1];
|
||||||
|
Hall_arr[i - 1][2] = Hall_arr[i][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
Hall_arr[leituras - 1][0] = LeituraHa;
|
||||||
|
Hall_arr[leituras - 1][1] = LeituraHb;
|
||||||
|
Hall_arr[leituras - 1][2] = LeituraHc;
|
||||||
|
|
||||||
|
// Leituras dos sensores Hall nas leituras anteriores
|
||||||
|
bool LeituraAnteriorHa = Hall_arr[leituras - 2][0];
|
||||||
|
bool LeituraAnteriorHb = Hall_arr[leituras - 2][1];
|
||||||
|
bool LeituraAnteriorHc = Hall_arr[leituras - 2][2];
|
||||||
|
|
||||||
|
|
||||||
|
// Comparação das leituras atuais com as leituras anteriores
|
||||||
|
if (LeituraHa == LeituraAnteriorHc && LeituraHc == LeituraAnteriorHa) {
|
||||||
|
_Sentido = Antihorario;
|
||||||
|
}
|
||||||
|
else if (LeituraHa == LeituraAnteriorHb && LeituraHb == LeituraAnteriorHa) {
|
||||||
|
_Sentido = Horario;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Outros casos (não determinados)
|
||||||
|
}
|
||||||
|
|
||||||
|
CalculaAceleracao(_RPM);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CalculaAceleracao(float _RPM) {
|
||||||
|
float RPM_total = _RPM;
|
||||||
|
int Desconsiderar = 0;
|
||||||
|
// Salvar as ultimas leituras
|
||||||
|
for (int i = 1; i < leituras; i++) {
|
||||||
|
RPM_arr[i - 1] = RPM_arr[i];
|
||||||
|
|
||||||
|
RPM_total += RPM_arr[i - 1] < 0 ? 0 : RPM_arr[i - 1];
|
||||||
|
Desconsiderar += RPM_arr[i - 1] < 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
RPM_arr[leituras - 1] = _RPM;
|
||||||
|
|
||||||
|
float RPM_medio = RPM_total / (leituras - Desconsiderar);
|
||||||
|
|
||||||
|
AceleracaoA = Aceleracao;
|
||||||
|
|
||||||
|
if (_SentidoSP == Parado && _RPM == 0) {
|
||||||
|
Aceleracao = Estavel;
|
||||||
|
} else if (RPM_arr[leituras - 3] < (RPM_arr[leituras - 2] - _Margem) && RPM_arr[leituras - 2] < (_RPM - _Margem)) {
|
||||||
|
Aceleracao = Acelerando;
|
||||||
|
} else if (RPM_arr[leituras - 3] > (RPM_arr[leituras - 2] + _Margem) && RPM_arr[leituras - 2] > (_RPM + _Margem)) {
|
||||||
|
Aceleracao = Desacelerando;
|
||||||
|
} else {
|
||||||
|
Aceleracao = Estavel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CorrigirPotenciaMotor() {
|
||||||
|
if (_MalhaFechada && !Revertendo && _SentidoSP != Parado) {
|
||||||
|
if (_pinoHLA > -1 && _pinoHLB > -1 && _pinoHLC > -1) {
|
||||||
|
SentidoContrario = _Sentido != _SentidoSP;
|
||||||
|
}
|
||||||
|
|
||||||
|
float _rpmA = RPM;
|
||||||
|
if (SentidoContrario) {
|
||||||
|
RPM = RPM * -1;
|
||||||
|
}
|
||||||
|
/*else if (Aceleracao == Desacelerando && AceleracaoA == Estavel) {
|
||||||
|
RPM = 0;
|
||||||
|
}*/
|
||||||
|
_PID->Compute();
|
||||||
|
//RPM = _rpmA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskHandle_t RampaTaskHandle = NULL;
|
||||||
|
static void RampaTaskWrapper(void *pvParameters) {
|
||||||
|
Motor *motor = static_cast<Motor*>(pvParameters);
|
||||||
|
motor->RampaTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RampaTask() {
|
||||||
|
unsigned long firstMilis = millis();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (!Conectado) {
|
||||||
|
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||||
|
vTaskDelay(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Atualizar();
|
||||||
|
|
||||||
|
vTaskDelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Atualizar() {
|
||||||
|
|
||||||
|
/*bool Travado = _PotMap > ZeroRampa && RPM_arr[leituras - 1] == 0 && RPM_arr[leituras - 2] > 0 && RPM_arr[leituras - 3] > 0 && _Sentido != Parado;
|
||||||
|
|
||||||
|
if (_pinoPWM > -1 && Travado) {
|
||||||
|
_PotMap = ZeroRampa;
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
vTaskDelay(400);
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (_pinoDIR > -1) {
|
||||||
|
bool ReleAtuado = _SentidoSP == Horario;
|
||||||
|
|
||||||
|
if (_SentidoSP != _SentidoU && ReleAtuado) {
|
||||||
|
digitalWrite(_pinoDIR, ReleAtuado);
|
||||||
|
vTaskDelay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(_pinoDIR, ReleAtuado);
|
||||||
|
|
||||||
|
_SentidoU = _SentidoSP;
|
||||||
|
}
|
||||||
|
if (_pinoBRK > -1) {
|
||||||
|
digitalWrite(_pinoBRK, _Freio);
|
||||||
|
}
|
||||||
|
if (_pinoSTP > -1) {
|
||||||
|
//digitalWrite(_pinoSTP, HIGH);
|
||||||
|
}
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
if (_SentidoSP == Parado) {
|
||||||
|
_PotMap = ZeroRampa;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
}
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Motor M1("ET");
|
||||||
|
Motor M2("EF");
|
||||||
|
Motor M3("DT");
|
||||||
|
Motor M4("DF");
|
||||||
|
|
||||||
|
Motor* MotorPorID(String ID) {
|
||||||
|
Motor* _motor =
|
||||||
|
ID == "ET" ? &M1 :
|
||||||
|
ID == "EF" ? &M2 :
|
||||||
|
ID == "DT" ? &M3 :
|
||||||
|
ID == "DF" ? &M4 :
|
||||||
|
nullptr;
|
||||||
|
return _motor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(_baudRate);
|
||||||
|
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
if (_pinoReleGeral > -1) {
|
||||||
|
pinMode(_pinoReleGeral, OUTPUT);
|
||||||
|
digitalWrite(_pinoReleGeral, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (Serial.available() > 3) {
|
||||||
|
String Protocolo = "";
|
||||||
|
F_Code _funcao = Nda;
|
||||||
|
while (Serial.available()) {
|
||||||
|
char Entrada = (char)Serial.read();
|
||||||
|
if (Entrada == EndLine) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Protocolo += Entrada;
|
||||||
|
if (Protocolo.length() == 3) {
|
||||||
|
if (_funcao == Nda) {
|
||||||
|
_funcao = (F_Code)((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2]).toInt();
|
||||||
|
Protocolo = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EnviarDadosSerial("OK");
|
||||||
|
|
||||||
|
if (_funcao == Chk) {
|
||||||
|
EnviarDadosSerial(MontarProtocoloVerificacao(D_Code));
|
||||||
|
}
|
||||||
|
else if (_funcao == Cfg) {
|
||||||
|
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||||
|
bool Conectar = (String)Protocolo[3] == "1";
|
||||||
|
if (ID == "MD") {
|
||||||
|
_TaxaAmostragem = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7] + (String)Protocolo[8] + (String)Protocolo[9]).toInt();
|
||||||
|
int pinoReleGeral = ((String)Protocolo[11] + (String)Protocolo[12]).toInt();
|
||||||
|
int _RampaMin = ((String)Protocolo[14] + (String)Protocolo[15] + (String)Protocolo[16] + (String)Protocolo[17]).toInt();
|
||||||
|
int _RampaMax = ((String)Protocolo[19] + (String)Protocolo[20] + (String)Protocolo[21] + (String)Protocolo[22]).toInt();
|
||||||
|
int _PPR = ((String)Protocolo[24] + (String)Protocolo[25] + (String)Protocolo[26]).toInt();
|
||||||
|
|
||||||
|
RampaMin = _RampaMin;
|
||||||
|
RampaMax = _RampaMax;
|
||||||
|
//PPR = _PPR;
|
||||||
|
|
||||||
|
if (pinoReleGeral > -1) {
|
||||||
|
pinMode(_pinoReleGeral, INPUT);
|
||||||
|
_pinoReleGeral = pinoReleGeral;
|
||||||
|
pinMode(_pinoReleGeral, OUTPUT);
|
||||||
|
digitalWrite(_pinoReleGeral, Conectar);
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
Conectado = Conectar;
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int canal = ((String)Protocolo[5]).toInt();
|
||||||
|
bool _foc = (String)Protocolo[7] == "1";
|
||||||
|
bool motor_ativado = (String)Protocolo[9] == "1";
|
||||||
|
double _Kp = ((String)Protocolo[11] + (String)Protocolo[12] + (String)Protocolo[13] + (String)Protocolo[14] + (String)Protocolo[15]).toDouble();
|
||||||
|
double _Ki = ((String)Protocolo[17] + (String)Protocolo[18] + (String)Protocolo[19] + (String)Protocolo[20] + (String)Protocolo[21]).toDouble();
|
||||||
|
double _Kd = ((String)Protocolo[23] + (String)Protocolo[24] + (String)Protocolo[25] + (String)Protocolo[26] + (String)Protocolo[27]).toDouble();
|
||||||
|
int pwm = ((String)Protocolo[29] + (String)Protocolo[30]).toInt();
|
||||||
|
int dir = ((String)Protocolo[32] + (String)Protocolo[33]).toInt();
|
||||||
|
int brk = ((String)Protocolo[35] + (String)Protocolo[36]).toInt();
|
||||||
|
int stp = ((String)Protocolo[38] + (String)Protocolo[39]).toInt();
|
||||||
|
int hallA = ((String)Protocolo[41] + (String)Protocolo[42]).toInt();
|
||||||
|
int hallB = ((String)Protocolo[44] + (String)Protocolo[45]).toInt();
|
||||||
|
int hallC = ((String)Protocolo[47] + (String)Protocolo[48]).toInt();
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
if (motor_ativado) {
|
||||||
|
if (Conectar) {
|
||||||
|
_motor->_canal = canal;
|
||||||
|
_motor->_pinoPWM = pwm;
|
||||||
|
_motor->_pinoDIR = dir;
|
||||||
|
_motor->_pinoBRK = brk;
|
||||||
|
_motor->_pinoSTP = stp;
|
||||||
|
_motor->_pinoHLA = hallA;
|
||||||
|
_motor->_pinoHLB = hallB;
|
||||||
|
_motor->_pinoHLC = hallC;
|
||||||
|
_motor->_MalhaFechada = _foc;
|
||||||
|
_motor->_Kp = _Kp;
|
||||||
|
_motor->_Ki = _Ki;
|
||||||
|
_motor->_Kd = _Kd;
|
||||||
|
|
||||||
|
_motor->Inicializar();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_motor->Desligar();
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_funcao == Cmd) {
|
||||||
|
//canal;potencia;sentido;rampa;precisao;rpm
|
||||||
|
//0;000;0;000;000;000
|
||||||
|
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
|
||||||
|
_motor->_SentidoSP = (Sentido)((String)Protocolo[3]).toInt();
|
||||||
|
_motor->_RPM_SP = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7]).toInt();
|
||||||
|
_motor->_MalhaFechada = (String)Protocolo[9] == "1";
|
||||||
|
_motor->ReiniciarAceleracaoArr();
|
||||||
|
|
||||||
|
bool reverter = ((String)Protocolo[11]) == "1";
|
||||||
|
if (reverter) {
|
||||||
|
_motor->ReverterSentidoGiro();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_funcao == Tst) {
|
||||||
|
String ID = ((String)Protocolo[0] +(String)Protocolo[1]);
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
|
||||||
|
bool EmTeste = _motor->Testando;
|
||||||
|
if (!EmTeste) {
|
||||||
|
//_motor->Testar();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,636 @@
|
||||||
|
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||||
|
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h"
|
||||||
|
#include <PID_v1.h>
|
||||||
|
#define D_Code Mov
|
||||||
|
|
||||||
|
#define _pinoLED RGB_BUILTIN
|
||||||
|
int _pinoReleGeral = -1;
|
||||||
|
|
||||||
|
long _baudRate = 115200;
|
||||||
|
|
||||||
|
bool Conectado = false;
|
||||||
|
|
||||||
|
int _TaxaAmostragem = 500;
|
||||||
|
int PPR = 22; // Pulsos por revolução
|
||||||
|
|
||||||
|
int RampaMin = 0;
|
||||||
|
int ZeroRampa = 0;
|
||||||
|
int RampaMax = 1023;
|
||||||
|
const int RpmMax = 650; // RPM Máximo aferir
|
||||||
|
float RelacaoPPR = 0;
|
||||||
|
float MenorPeriodo = 0;
|
||||||
|
|
||||||
|
int delayBalanceamento = 5000;
|
||||||
|
float RPM_Margem = 5.0;
|
||||||
|
float RPM_SetPoint = 0.0;
|
||||||
|
float RPM_Medio = 0.0;
|
||||||
|
bool RPM_Estavel = true;
|
||||||
|
|
||||||
|
class Motor {
|
||||||
|
public:
|
||||||
|
// Construtor
|
||||||
|
Motor(String desc) {
|
||||||
|
_ID = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Definições
|
||||||
|
String _ID;
|
||||||
|
int _canal;
|
||||||
|
int _pinoPWM;
|
||||||
|
int _pinoDIR;
|
||||||
|
int _pinoBRK;
|
||||||
|
int _pinoSTP;
|
||||||
|
int _pinoHLA;
|
||||||
|
int _pinoHLB;
|
||||||
|
int _pinoHLC;
|
||||||
|
|
||||||
|
double _Kp;
|
||||||
|
double _Ki;
|
||||||
|
double _Kd;
|
||||||
|
PID* _PID = nullptr;
|
||||||
|
|
||||||
|
bool Iniciado = false;
|
||||||
|
bool Testando = false;
|
||||||
|
bool Revertendo = false;
|
||||||
|
bool SentidoContrario = false;
|
||||||
|
StatusMotor Aceleracao = Estavel;
|
||||||
|
StatusMotor AceleracaoA = Estavel;
|
||||||
|
|
||||||
|
// Consumo
|
||||||
|
const int leituras = 5;
|
||||||
|
volatile float RPM_arr[5];
|
||||||
|
volatile bool Hall_arr[5][3];
|
||||||
|
double RPM;
|
||||||
|
double PotenciaAtual;
|
||||||
|
volatile int ultimaLeituraHallA = 0;
|
||||||
|
volatile int ultimaLeituraHallB = 0;
|
||||||
|
volatile int ultimaLeituraHallC = 0;
|
||||||
|
volatile unsigned int tempoAnterior = 0;
|
||||||
|
volatile float periodo = 0;
|
||||||
|
|
||||||
|
// Entrada de dados
|
||||||
|
bool _MalhaFechada;
|
||||||
|
int _PotMap;
|
||||||
|
double _RPM_SP;
|
||||||
|
Sentido _SentidoSP = Parado;
|
||||||
|
Sentido _Sentido = Parado;
|
||||||
|
Sentido _SentidoU = Parado;
|
||||||
|
int _US_Addr;
|
||||||
|
bool _Freio = false;
|
||||||
|
int _Margem = 2;
|
||||||
|
double _RPM_Offset = 0;
|
||||||
|
|
||||||
|
void Inicializar() {
|
||||||
|
if (Iniciado) {
|
||||||
|
EnviarDadosSerial(_ID + " ja inicializado");
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
ledcSetup(_canal, 1000, 10);
|
||||||
|
ledcAttachPin(_pinoPWM, _canal);
|
||||||
|
PotenciaAtual = ZeroRampa;
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
_RPM_SP = 0;
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
}
|
||||||
|
if (_pinoDIR > -1) {
|
||||||
|
pinMode(_pinoDIR, OUTPUT);
|
||||||
|
digitalWrite(_pinoDIR, LOW);
|
||||||
|
|
||||||
|
_SentidoU = Parado;
|
||||||
|
}
|
||||||
|
if (_pinoBRK > -1) {
|
||||||
|
pinMode(_pinoBRK, OUTPUT);
|
||||||
|
digitalWrite(_pinoBRK, LOW);
|
||||||
|
}
|
||||||
|
if (_pinoSTP > -1) {
|
||||||
|
pinMode(_pinoSTP, OUTPUT);
|
||||||
|
digitalWrite(_pinoSTP, HIGH);
|
||||||
|
}
|
||||||
|
if (_pinoHLA > -1) {
|
||||||
|
pinMode(_pinoHLA, INPUT);
|
||||||
|
ultimaLeituraHallA = digitalRead(_pinoHLA);
|
||||||
|
RPM = 0;
|
||||||
|
periodo = 0;
|
||||||
|
tempoAnterior = 0;
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(&Motor::RPMTaskWrapper, "RPMTask", 15000, this, 25 - _canal, &RPMTaskHandle, tskNO_AFFINITY);
|
||||||
|
|
||||||
|
ReiniciarAceleracaoArr();
|
||||||
|
ReiniciarHallArr();
|
||||||
|
|
||||||
|
_PID = new PID(&RPM, &PotenciaAtual, &_RPM_SP, _Kp, _Ki, _Kd, DIRECT);
|
||||||
|
_PID->SetOutputLimits(RampaMin, RampaMax);
|
||||||
|
_PID->SetMode(AUTOMATIC);
|
||||||
|
}
|
||||||
|
if (_pinoHLB > -1) {
|
||||||
|
pinMode(_pinoHLB, INPUT);
|
||||||
|
ultimaLeituraHallB = digitalRead(_pinoHLB);
|
||||||
|
}
|
||||||
|
if (_pinoHLC > -1) {
|
||||||
|
pinMode(_pinoHLC, INPUT);
|
||||||
|
ultimaLeituraHallC = digitalRead(_pinoHLC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(&Motor::RampaTaskWrapper, "RampaTask", 5000, this, 21 - _canal + 4, &RampaTaskHandle, tskNO_AFFINITY);
|
||||||
|
|
||||||
|
EnviarDadosSerial(_ID + " Iniciado");
|
||||||
|
|
||||||
|
Iniciado = true;
|
||||||
|
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Desligar() {
|
||||||
|
if (!Iniciado) {
|
||||||
|
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parar a execução das tarefas
|
||||||
|
vTaskDelete(RampaTaskHandle);
|
||||||
|
if (_pinoHLA > -1) {
|
||||||
|
vTaskDelete(RPMTaskHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Desanexar o canal PWM
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
ledcDetachPin(_pinoPWM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redefinir as configurações para os valores iniciais
|
||||||
|
pinMode(_pinoPWM, INPUT);
|
||||||
|
pinMode(_pinoDIR, INPUT);
|
||||||
|
pinMode(_pinoBRK, INPUT);
|
||||||
|
pinMode(_pinoSTP, INPUT);
|
||||||
|
pinMode(_pinoHLA, INPUT);
|
||||||
|
pinMode(_pinoHLB, INPUT);
|
||||||
|
pinMode(_pinoHLC, INPUT);
|
||||||
|
|
||||||
|
// Outras redefinições de variáveis de estado, se necessário
|
||||||
|
delete _PID;
|
||||||
|
|
||||||
|
EnviarDadosSerial(_ID + " Desligado");
|
||||||
|
|
||||||
|
Iniciado = false;
|
||||||
|
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReiniciarAceleracaoArr() {
|
||||||
|
for (int i = 0; i < leituras; i++) {
|
||||||
|
RPM_arr[i] = -1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReiniciarHallArr() {
|
||||||
|
for (int i = 0; i < leituras; i++) {
|
||||||
|
Hall_arr[i][0] = false;
|
||||||
|
Hall_arr[i][1] = false;
|
||||||
|
Hall_arr[i][2] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReverterSentidoGiro() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TaskHandle_t RPMTaskHandle = NULL;
|
||||||
|
static void RPMTaskWrapper(void *pvParameters) {
|
||||||
|
Motor *motor = static_cast<Motor*>(pvParameters);
|
||||||
|
motor->RPMTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RPMTask() {
|
||||||
|
unsigned long firstMilis = millis();
|
||||||
|
int pulsos = 0;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (!Conectado) {
|
||||||
|
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||||
|
vTaskDelay(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Medir RPM apenas quando ocorrer um pulso no sensor HALL
|
||||||
|
bool LeituraHa = digitalRead(_pinoHLA) == 1;
|
||||||
|
if (LeituraHa != ultimaLeituraHallA) {
|
||||||
|
ultimaLeituraHallA = LeituraHa;
|
||||||
|
pulsos++;
|
||||||
|
|
||||||
|
// Calcular o período em microssegundos
|
||||||
|
unsigned long tempoAtual = micros();
|
||||||
|
unsigned long periodoUs = tempoAtual - tempoAnterior;
|
||||||
|
periodo = periodoUs / 1000.0; // Converte de us para ms (2300 us para 2,3 ms)
|
||||||
|
|
||||||
|
// Salva o valor do RPM anterior
|
||||||
|
double RPM_A = RPM;
|
||||||
|
|
||||||
|
// Se o período entre pulsos for menor que o tempo mínimo entre pulsos em ms, significa que o sensor está em uma posição em que existe oscilação de leitura,
|
||||||
|
// pois o RPM estaria acima do máximo, logo, assumir o valor de RPM aferido anteriormente
|
||||||
|
if (periodo < MenorPeriodo) {
|
||||||
|
RPM = RPM_A;
|
||||||
|
}
|
||||||
|
// Calcular RPM se houve variação de tempo entre o pulso atual e o pulso anterior
|
||||||
|
else if (periodo != 0) {
|
||||||
|
// RPM = 60 / (Pulsos por Revolução * Período em segundos)
|
||||||
|
// A fórmula foi adaptada para otimizar processamento
|
||||||
|
RPM = RelacaoPPR / periodo;
|
||||||
|
}
|
||||||
|
// Se não houve alteração no período, então o motor não se moveu
|
||||||
|
else {
|
||||||
|
RPM = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CalcularSentidoGiro(RPM);
|
||||||
|
|
||||||
|
// Reiniciar variáveis
|
||||||
|
tempoAnterior = tempoAtual;
|
||||||
|
}
|
||||||
|
|
||||||
|
CorrigirPotenciaMotor();
|
||||||
|
|
||||||
|
long intMillis = (millis() - firstMilis);
|
||||||
|
|
||||||
|
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||||
|
if (intMillis >= _TaxaAmostragem) {
|
||||||
|
if (pulsos == 0) {
|
||||||
|
RPM = 0;
|
||||||
|
periodo = 0;
|
||||||
|
CalcularSentidoGiro(RPM);
|
||||||
|
}
|
||||||
|
pulsos = 0;
|
||||||
|
|
||||||
|
double PotAtual = fmap(PotenciaAtual, RampaMin, RampaMax, 0.0, 100.0);
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sRPM, _ID, MontarDadosProtocoloRPM(RPM, PotAtual, Aceleracao, _Sentido, Revertendo, _RPM_Offset)));
|
||||||
|
firstMilis = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aguarda metade do menor período possível entre leituras
|
||||||
|
vTaskDelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CalcularSentidoGiro(float _RPM) {
|
||||||
|
if (_pinoHLA == -1 || _pinoHLB == -1 || _pinoHLC == -1) {
|
||||||
|
CalculaAceleracao(_RPM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LeituraHa = ultimaLeituraHallA == 1;
|
||||||
|
bool LeituraHb = digitalRead(_pinoHLB) == 1;
|
||||||
|
bool LeituraHc = digitalRead(_pinoHLC) == 1;
|
||||||
|
|
||||||
|
for (int i = 1; i < leituras; i++) {
|
||||||
|
Hall_arr[i - 1][0] = Hall_arr[i][0];
|
||||||
|
Hall_arr[i - 1][1] = Hall_arr[i][1];
|
||||||
|
Hall_arr[i - 1][2] = Hall_arr[i][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
Hall_arr[leituras - 1][0] = LeituraHa;
|
||||||
|
Hall_arr[leituras - 1][1] = LeituraHb;
|
||||||
|
Hall_arr[leituras - 1][2] = LeituraHc;
|
||||||
|
|
||||||
|
// Leituras dos sensores Hall nas leituras anteriores
|
||||||
|
bool LeituraAnteriorHa = Hall_arr[leituras - 2][0];
|
||||||
|
bool LeituraAnteriorHb = Hall_arr[leituras - 2][1];
|
||||||
|
bool LeituraAnteriorHc = Hall_arr[leituras - 2][2];
|
||||||
|
|
||||||
|
|
||||||
|
// Comparação das leituras atuais com as leituras anteriores
|
||||||
|
if (LeituraHa == LeituraAnteriorHc && LeituraHc == LeituraAnteriorHa) {
|
||||||
|
_Sentido = Antihorario;
|
||||||
|
}
|
||||||
|
else if (LeituraHa == LeituraAnteriorHb && LeituraHb == LeituraAnteriorHa) {
|
||||||
|
_Sentido = Horario;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Outros casos (não determinados)
|
||||||
|
}
|
||||||
|
|
||||||
|
CalculaAceleracao(_RPM);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CalculaAceleracao(float _RPM) {
|
||||||
|
float RPM_total = _RPM;
|
||||||
|
int Desconsiderar = 0;
|
||||||
|
// Salvar as ultimas leituras
|
||||||
|
for (int i = 1; i < leituras; i++) {
|
||||||
|
RPM_arr[i - 1] = RPM_arr[i];
|
||||||
|
|
||||||
|
RPM_total += RPM_arr[i - 1] < 0 ? 0 : RPM_arr[i - 1];
|
||||||
|
Desconsiderar += RPM_arr[i - 1] < 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
RPM_arr[leituras - 1] = _RPM;
|
||||||
|
|
||||||
|
float RPM_medio = RPM_total / (leituras - Desconsiderar);
|
||||||
|
|
||||||
|
AceleracaoA = Aceleracao;
|
||||||
|
|
||||||
|
if (_SentidoSP == Parado && _RPM == 0) {
|
||||||
|
Aceleracao = Estavel;
|
||||||
|
} else if (RPM_arr[leituras - 3] < (RPM_arr[leituras - 2] - _Margem) && RPM_arr[leituras - 2] < (_RPM - _Margem)) {
|
||||||
|
Aceleracao = Acelerando;
|
||||||
|
} else if (RPM_arr[leituras - 3] > (RPM_arr[leituras - 2] + _Margem) && RPM_arr[leituras - 2] > (_RPM + _Margem)) {
|
||||||
|
Aceleracao = Desacelerando;
|
||||||
|
} else {
|
||||||
|
Aceleracao = Estavel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CorrigirPotenciaMotor() {
|
||||||
|
if (_MalhaFechada && !Revertendo && _SentidoSP != Parado) {
|
||||||
|
if (_pinoHLA > -1 && _pinoHLB > -1 && _pinoHLC > -1) {
|
||||||
|
SentidoContrario = _Sentido != _SentidoSP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SentidoContrario) {
|
||||||
|
RPM = RPM * -1;
|
||||||
|
}
|
||||||
|
/*else if (Aceleracao == Desacelerando && AceleracaoA == Estavel) {
|
||||||
|
RPM = 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
float _rpmA = RPM;
|
||||||
|
if (RPM_Estavel) {
|
||||||
|
RPM = RPM + _RPM_Offset;
|
||||||
|
}
|
||||||
|
_PID->Compute();
|
||||||
|
RPM = _rpmA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskHandle_t RampaTaskHandle = NULL;
|
||||||
|
static void RampaTaskWrapper(void *pvParameters) {
|
||||||
|
Motor *motor = static_cast<Motor*>(pvParameters);
|
||||||
|
motor->RampaTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RampaTask() {
|
||||||
|
unsigned long firstMilis = millis();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (!Conectado) {
|
||||||
|
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||||
|
vTaskDelay(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Atualizar();
|
||||||
|
|
||||||
|
vTaskDelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Atualizar() {
|
||||||
|
|
||||||
|
/*bool Travado = _PotMap > ZeroRampa && RPM_arr[leituras - 1] == 0 && RPM_arr[leituras - 2] > 0 && RPM_arr[leituras - 3] > 0 && _Sentido != Parado;
|
||||||
|
|
||||||
|
if (_pinoPWM > -1 && Travado) {
|
||||||
|
_PotMap = ZeroRampa;
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
vTaskDelay(400);
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (_pinoDIR > -1) {
|
||||||
|
bool ReleAtuado = _SentidoSP == Horario;
|
||||||
|
|
||||||
|
if (_SentidoSP != _SentidoU && ReleAtuado) {
|
||||||
|
digitalWrite(_pinoDIR, ReleAtuado);
|
||||||
|
vTaskDelay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(_pinoDIR, ReleAtuado);
|
||||||
|
|
||||||
|
_SentidoU = _SentidoSP;
|
||||||
|
}
|
||||||
|
if (_pinoBRK > -1) {
|
||||||
|
digitalWrite(_pinoBRK, _Freio);
|
||||||
|
}
|
||||||
|
if (_pinoSTP > -1) {
|
||||||
|
//digitalWrite(_pinoSTP, HIGH);
|
||||||
|
}
|
||||||
|
if (_pinoPWM > -1) {
|
||||||
|
if (_SentidoSP == Parado) {
|
||||||
|
_PotMap = ZeroRampa;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_PotMap = PotenciaAtual;
|
||||||
|
}
|
||||||
|
ledcWrite(_canal, _PotMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Motor M1("ET");
|
||||||
|
Motor M2("EF");
|
||||||
|
Motor M3("DT");
|
||||||
|
Motor M4("DF");
|
||||||
|
|
||||||
|
Motor* MotorPorID(String ID) {
|
||||||
|
Motor* _motor =
|
||||||
|
ID == "ET" ? &M1 :
|
||||||
|
ID == "EF" ? &M2 :
|
||||||
|
ID == "DT" ? &M3 :
|
||||||
|
ID == "DF" ? &M4 :
|
||||||
|
nullptr;
|
||||||
|
return _motor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BalanceamentoTask(void *pvParameters);
|
||||||
|
TaskHandle_t BalanceamentoTaskHandle = NULL;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(_baudRate);
|
||||||
|
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
if (_pinoReleGeral > -1) {
|
||||||
|
pinMode(_pinoReleGeral, OUTPUT);
|
||||||
|
digitalWrite(_pinoReleGeral, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(BalanceamentoTask, "BalanceamentoTask", 8000, NULL, 5, &BalanceamentoTaskHandle, tskNO_AFFINITY);
|
||||||
|
|
||||||
|
RecalcularRelacaoPPR();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (Serial.available() > 3) {
|
||||||
|
String Protocolo = "";
|
||||||
|
F_Code _funcao = Nda;
|
||||||
|
while (Serial.available()) {
|
||||||
|
char Entrada = (char)Serial.read();
|
||||||
|
if (Entrada == EndLine) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Protocolo += Entrada;
|
||||||
|
if (Protocolo.length() == 3) {
|
||||||
|
if (_funcao == Nda) {
|
||||||
|
_funcao = (F_Code)((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2]).toInt();
|
||||||
|
Protocolo = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EnviarDadosSerial("OK");
|
||||||
|
|
||||||
|
if (_funcao == Chk) {
|
||||||
|
EnviarDadosSerial(MontarProtocoloVerificacao(D_Code));
|
||||||
|
}
|
||||||
|
else if (_funcao == Cfg) {
|
||||||
|
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||||
|
bool Conectar = (String)Protocolo[3] == "1";
|
||||||
|
if (ID == "MD") {
|
||||||
|
_TaxaAmostragem = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7] + (String)Protocolo[8] + (String)Protocolo[9]).toInt();
|
||||||
|
int pinoReleGeral = ((String)Protocolo[11] + (String)Protocolo[12]).toInt();
|
||||||
|
int _RampaMin = ((String)Protocolo[14] + (String)Protocolo[15] + (String)Protocolo[16] + (String)Protocolo[17]).toInt();
|
||||||
|
int _RampaMax = ((String)Protocolo[19] + (String)Protocolo[20] + (String)Protocolo[21] + (String)Protocolo[22]).toInt();
|
||||||
|
int _PPR = ((String)Protocolo[24] + (String)Protocolo[25] + (String)Protocolo[26]).toInt();
|
||||||
|
int _delayBalanceamento = ((String)Protocolo[28] + (String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31] + (String)Protocolo[32]).toInt();
|
||||||
|
int _margemRPM = ((String)Protocolo[34] + (String)Protocolo[35]).toInt();
|
||||||
|
|
||||||
|
RampaMin = _RampaMin;
|
||||||
|
RampaMax = _RampaMax;
|
||||||
|
PPR = _PPR;
|
||||||
|
delayBalanceamento = _delayBalanceamento;
|
||||||
|
RPM_Margem = _margemRPM;
|
||||||
|
|
||||||
|
if (pinoReleGeral > -1) {
|
||||||
|
pinMode(_pinoReleGeral, INPUT);
|
||||||
|
_pinoReleGeral = pinoReleGeral;
|
||||||
|
pinMode(_pinoReleGeral, OUTPUT);
|
||||||
|
digitalWrite(_pinoReleGeral, Conectar);
|
||||||
|
}
|
||||||
|
|
||||||
|
RecalcularRelacaoPPR();
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
Conectado = Conectar;
|
||||||
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int canal = ((String)Protocolo[5]).toInt();
|
||||||
|
bool _foc = (String)Protocolo[7] == "1";
|
||||||
|
bool motor_ativado = (String)Protocolo[9] == "1";
|
||||||
|
double _Kp = ((String)Protocolo[11] + (String)Protocolo[12] + (String)Protocolo[13] + (String)Protocolo[14] + (String)Protocolo[15]).toDouble();
|
||||||
|
double _Ki = ((String)Protocolo[17] + (String)Protocolo[18] + (String)Protocolo[19] + (String)Protocolo[20] + (String)Protocolo[21]).toDouble();
|
||||||
|
double _Kd = ((String)Protocolo[23] + (String)Protocolo[24] + (String)Protocolo[25] + (String)Protocolo[26] + (String)Protocolo[27]).toDouble();
|
||||||
|
int pwm = ((String)Protocolo[29] + (String)Protocolo[30]).toInt();
|
||||||
|
int dir = ((String)Protocolo[32] + (String)Protocolo[33]).toInt();
|
||||||
|
int brk = ((String)Protocolo[35] + (String)Protocolo[36]).toInt();
|
||||||
|
int stp = ((String)Protocolo[38] + (String)Protocolo[39]).toInt();
|
||||||
|
int hallA = ((String)Protocolo[41] + (String)Protocolo[42]).toInt();
|
||||||
|
int hallB = ((String)Protocolo[44] + (String)Protocolo[45]).toInt();
|
||||||
|
int hallC = ((String)Protocolo[47] + (String)Protocolo[48]).toInt();
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
if (motor_ativado) {
|
||||||
|
if (Conectar) {
|
||||||
|
_motor->_canal = canal;
|
||||||
|
_motor->_pinoPWM = pwm;
|
||||||
|
_motor->_pinoDIR = dir;
|
||||||
|
_motor->_pinoBRK = brk;
|
||||||
|
_motor->_pinoSTP = stp;
|
||||||
|
_motor->_pinoHLA = hallA;
|
||||||
|
_motor->_pinoHLB = hallB;
|
||||||
|
_motor->_pinoHLC = hallC;
|
||||||
|
_motor->_MalhaFechada = _foc;
|
||||||
|
_motor->_Kp = _Kp;
|
||||||
|
_motor->_Ki = _Ki;
|
||||||
|
_motor->_Kd = _Kd;
|
||||||
|
|
||||||
|
_motor->Inicializar();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_motor->Desligar();
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_funcao == Cmd) {
|
||||||
|
//canal;potencia;sentido;rampa;precisao;rpm
|
||||||
|
//0;000;0;000;000;000
|
||||||
|
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
|
||||||
|
_motor->_SentidoSP = (Sentido)((String)Protocolo[3]).toInt();
|
||||||
|
_motor->_RPM_SP = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7]).toInt();
|
||||||
|
_motor->_MalhaFechada = (String)Protocolo[9] == "1";
|
||||||
|
_motor->ReiniciarAceleracaoArr();
|
||||||
|
|
||||||
|
bool reverter = ((String)Protocolo[11]) == "1";
|
||||||
|
if (reverter) {
|
||||||
|
_motor->ReverterSentidoGiro();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_funcao == Tst) {
|
||||||
|
String ID = ((String)Protocolo[0] +(String)Protocolo[1]);
|
||||||
|
|
||||||
|
Motor* _motor = MotorPorID(ID);
|
||||||
|
|
||||||
|
bool EmTeste = _motor->Testando;
|
||||||
|
if (!EmTeste) {
|
||||||
|
//_motor->Testar();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RecalcularRelacaoPPR() {
|
||||||
|
RelacaoPPR = (60 / PPR) * 1000; // Multiplicador do cálculo de RPM (período em ms)
|
||||||
|
MenorPeriodo = RelacaoPPR / RpmMax; // Tempo mínimo de leitura
|
||||||
|
}
|
||||||
|
|
||||||
|
void BalanceamentoTask(void *pvParameters) {
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int _delay = delayBalanceamento > 0 ? delayBalanceamento : 5000;
|
||||||
|
|
||||||
|
if (Conectado && delayBalanceamento > 0) {
|
||||||
|
BalancearCargasMotores();
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(_delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BalancearCargasMotores() {
|
||||||
|
RPM_Medio = (M1.RPM + M2.RPM + M3.RPM + M4.RPM) / 4.0;
|
||||||
|
RPM_SetPoint = (M1._RPM_SP + M2._RPM_SP + M3._RPM_SP + M4._RPM_SP) / 4.0;
|
||||||
|
RPM_Estavel = (RPM_Medio >= (RPM_SetPoint - RPM_Margem)) && (RPM_Medio <= (RPM_SetPoint + RPM_Margem));
|
||||||
|
|
||||||
|
double M1_Pot = M1.PotenciaAtual;
|
||||||
|
double M2_Pot = M2.PotenciaAtual;
|
||||||
|
double M3_Pot = M3.PotenciaAtual;
|
||||||
|
double M4_Pot = M4.PotenciaAtual;
|
||||||
|
|
||||||
|
double mediaPotencia = (M1_Pot + M2_Pot + M3_Pot + M4_Pot) / 4.0;
|
||||||
|
|
||||||
|
// Certifique-se de verificar se a potência atual não é zero antes de dividir
|
||||||
|
double offsetM1_RPM = M1_Pot != 0 ? (M1.RPM * (mediaPotencia - M1_Pot)) / M1_Pot : 0;
|
||||||
|
double offsetM2_RPM = M2_Pot != 0 ? (M2.RPM * (mediaPotencia - M2_Pot)) / M2_Pot : 0;
|
||||||
|
double offsetM3_RPM = M3_Pot != 0 ? (M3.RPM * (mediaPotencia - M3_Pot)) / M3_Pot : 0;
|
||||||
|
double offsetM4_RPM = M4_Pot != 0 ? (M4.RPM * (mediaPotencia - M4_Pot)) / M4_Pot : 0;
|
||||||
|
|
||||||
|
const double maxOffset = 10.0; // Valor máximo de offset para RPM, ajuste conforme necessário
|
||||||
|
|
||||||
|
// Aplica o offset com limitação
|
||||||
|
M1._RPM_Offset = fmin(fmax(offsetM1_RPM, -maxOffset), maxOffset);
|
||||||
|
M2._RPM_Offset = fmin(fmax(offsetM2_RPM, -maxOffset), maxOffset);
|
||||||
|
M3._RPM_Offset = fmin(fmax(offsetM3_RPM, -maxOffset), maxOffset);
|
||||||
|
M4._RPM_Offset = fmin(fmax(offsetM4_RPM, -maxOffset), maxOffset);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -30,6 +30,8 @@ class SensorTemperatura {
|
||||||
|
|
||||||
bool Iniciado = false;
|
bool Iniciado = false;
|
||||||
|
|
||||||
|
SimpleKalmanFilter* tempKalman;
|
||||||
|
|
||||||
void Inicializar() {
|
void Inicializar() {
|
||||||
if (Iniciado) {
|
if (Iniciado) {
|
||||||
EnviarDadosSerial(_ID + " ja inicializado");
|
EnviarDadosSerial(_ID + " ja inicializado");
|
||||||
|
|
@ -47,6 +49,8 @@ class SensorTemperatura {
|
||||||
|
|
||||||
Iniciado = true;
|
Iniciado = true;
|
||||||
|
|
||||||
|
tempKalman = new SimpleKalmanFilter(2, 2, 0.01);
|
||||||
|
|
||||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,6 +64,8 @@ class SensorTemperatura {
|
||||||
// Parar a execução das tarefas
|
// Parar a execução das tarefas
|
||||||
vTaskDelete(STTaskHandle);
|
vTaskDelete(STTaskHandle);
|
||||||
|
|
||||||
|
delete tempKalman;
|
||||||
|
|
||||||
// Redefinir as configurações para os valores iniciais
|
// Redefinir as configurações para os valores iniciais
|
||||||
pinMode(_pino, INPUT);
|
pinMode(_pino, INPUT);
|
||||||
|
|
||||||
|
|
@ -114,8 +120,7 @@ class SensorTemperatura {
|
||||||
double Vout, Rt = 0;
|
double Vout, Rt = 0;
|
||||||
double T, Tc, Tf, adc = 0;
|
double T, Tc, Tf, adc = 0;
|
||||||
adc = analogRead(_pino); // VARIÁVEL QUE RECEBE A LEITURA DO NTC10K
|
adc = analogRead(_pino); // VARIÁVEL QUE RECEBE A LEITURA DO NTC10K
|
||||||
//float adcValue = tempKalman->updateEstimate(adc);
|
float adcValue = tempKalman->updateEstimate(adc);
|
||||||
float adcValue = adc;
|
|
||||||
//CALCULOS PARA CONVERSÃO DA LEITURA RECEBIDA PELO ESP32 EM TEMPERATURA EM °C
|
//CALCULOS PARA CONVERSÃO DA LEITURA RECEBIDA PELO ESP32 EM TEMPERATURA EM °C
|
||||||
Vout = (adcValue * Vs / adcMax) + Voffset;
|
Vout = (adcValue * Vs / adcMax) + Voffset;
|
||||||
Rt = R1 * Vout / (Vs - Vout);
|
Rt = R1 * Vout / (Vs - Vout);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue