-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMpptOptimizer.cs
58 lines (49 loc) · 1.5 KB
/
MpptOptimizer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System.Threading;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace PowerReader
{
public static class MpptOptimizer
{
private static readonly Thread _worker = new Thread(Work);
private static double _previousPower, _currentPower;
private static bool _raiseDuty;
private static PWM _port;
private const double DutyStep = 0.05;
private const double MaxDuty = (100000 - 240) / 100000; //120us idle
public static void Start()
{
_port = new PWM(PWMChannels.PWM_PIN_D9, 100, 0.5, false);
_port.Frequency = 100;
_port.DutyCycle = 0.5;
_worker.Start();
_port.Start();
}
public static void Push(double current, double voltage)
{
lock (_worker)
{
_currentPower = current * voltage;
}
}
private static void Work()
{
double deltaPower;
while (true)
{
lock (_worker)
{
deltaPower = _currentPower - _previousPower;
_previousPower = _currentPower;
}
if (deltaPower < 0)
_raiseDuty = !_raiseDuty;
if (_raiseDuty)
_port.DutyCycle += DutyStep;
else
_port.DutyCycle -= DutyStep;
Thread.Sleep(100);
}
}
}
}