예제 #1
0
        public static void Main()
        {
            int min = 0;

            // watchdog enable with 5 second timeout
            GHI.Processor.Watchdog.Enable(5 * 1000);

            // PWM
            PWMControl.InitModule();

            // state machine
            //StateM();

            // num. battery (serial)
            battIdx = 0;

            // init thread
            ThreadShowParam = new Thread(Program.ShowValues);
            //ledThread.Start();

            // init Timer (http://blog.mark-stevens.co.uk/2013/01/netmf-timers/)
            tmrCallBack = new TimerCallback(TimerIRQ);
            autoEvent   = new AutoResetEvent(false);
            ledTimer    = new Timer(tmrCallBack, null, 0, 1000);
            //ledTimer = new Timer(tmrCallBack, autoEvent,Timeout.Infinite, 1000);

            // init LCD
            Bitmap LCD  = new Bitmap(SystemMetrics.ScreenWidth, SystemMetrics.ScreenHeight);
            Font   font = Resources.GetFont(Resources.FontResources.NinaB);

            // debug
            Debug.Print("Program Started");

            // clear display
            LCD.Clear();
            LCD.Flush();

            // init state machine ctrl
            StateM.Set(StateM.STATE.CHECK_ERR);


            // loop
            while (true)
            {
                // reset watchdog
                GHI.Processor.Watchdog.ResetCounter();

                // param read
                MeasureBattery();

                switch (StateM.Get())
                {
                // vbatt < 1V
                case StateM.STATE.CHECK_ERR:
                    if (vBatt[battIdx] < VBATT_MIN)
                    {
                        LCD.DrawText("ERROR BATTERY n° " + (battIdx + 1), font, Colors.White, 10, 50);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 80);
                        LCD.Flush();

                        PWMControl.SetDuty(0);
                        StateM.Set(StateM.STATE.ERROR_CHARGE);
                        break;
                    }
                    StateM.Set(StateM.STATE.CHECK_ALREADYCHG);
                    break;

                // vbatt > 4.6V
                case StateM.STATE.CHECK_ALREADYCHG:     // battery charged
                    if (vBatt[battIdx] > VBATT_ALM)
                    {
                        LCD.Clear();
                        LCD.DrawText("BATTERY n° " + (battIdx + 1) + " CHARGED!", font, Colors.White, 10, 50);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 80);
                        LCD.Flush();

                        PWMControl.SetDuty(0);
                        ledTimer.Change(Timeout.Infinite, 1000);
                        StateM.Set(StateM.STATE.FINISH);
                        break;
                    }
                    StateM.Set(StateM.STATE.PRE_CHARGE);
                    break;

                // vbatt < 3V ==> precharge 65mA
                case StateM.STATE.PRE_CHARGE:

                    if (vBatt[battIdx] < VBATT_PRECHG)
                    {
                        if (StateM.stsflg)
                        {
                            LCD.Clear();
                            LCD.DrawText("BATTERY PRE-CHARGE...", font, Colors.White, 10, 20);
                            LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                            LCD.Flush();

                            ledTimer.Change(0, 1000);
                            PWMControl.SetDuty(0);
                            StateM.stsflg = false;
                        }

                        PWMControl.IncDirDuty(iBatt[battIdx] < PRECURR);
                        break;
                    }
                    StateM.Set(StateM.STATE.FAST_CHARGE);
                    break;

                // CONSTANT CURRENT: vbatt > 3V && vbatt < 4.2V ==> charge 350mA
                case StateM.STATE.FAST_CHARGE:
                    if (vBatt[battIdx] < VBATT_NOM || iBatt[battIdx] < (3 * CHGCURR) / 4)
                    {
                        if (StateM.stsflg)
                        {
                            LCD.Clear();
                            LCD.DrawText("BATTERY FAST CHARGING: CONST. CURRENT", font, Colors.White, 10, 20);
                            LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                            LCD.Flush();

                            ledTimer.Change(0, 500);
                            StateM.stsflg = false;
                        }

                        if (iBatt[battIdx] < (CHGCURR - OFFSCURR))
                        {
                            if (PWMControl.IncrDuty())
                            {
                                break;
                            }
                        }
                        else if (iBatt[battIdx] > (CHGCURR + OFFSCURR))
                        {
                            if (PWMControl.DecrDuty())
                            {
                                break;
                            }
                        }

                        LCD.Clear();
                        LCD.DrawText("BATTERY FAST CHARGING: CONST. CURRENT", font, Colors.White, 10, 20);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                        LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80);
                        LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110);
                        LCD.Flush();

                        Thread.Sleep(500);
                        break;
                    }
                    StateM.Set(StateM.STATE.MANT1);
                    break;


                // CONSTANT VOLTAGE: vbatt >= 4.2 && Ibatt >= 50mA ==> cont. voltage charging vout=4.2V
                case StateM.STATE.MANT1:
                    if (StateM.stsflg)
                    {
                        LCD.Clear();
                        LCD.DrawText("BATTERY MANT1: CONST. VOLTAGE", font, Colors.White, 10, 20);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                        LCD.Flush();

                        ledTimer.Change(0, 100);
                        StateM.stsflg = false;
                    }

                    if (iBatt[battIdx] > MANTCURR)
                    {
                        if (vBatt[battIdx] < (VBATT_NOM - OFFSVOLT))
                        {
                            if (PWMControl.IncrDuty())
                            {
                                break;
                            }
                        }
                        else if (vBatt[battIdx] > (VBATT_NOM + OFFSVOLT))
                        {
                            if (PWMControl.DecrDuty())
                            {
                                break;
                            }
                        }

                        LCD.Clear();
                        LCD.DrawText("BATTERY MANT1: CONST. VOLTAGE", font, Colors.White, 10, 20);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                        LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80);
                        LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110);
                        LCD.Flush();

                        Thread.Sleep(500);
                        break;
                    }
                    //StateM.Set(StateM.STATE.MANT2);
                    StateM.Set(StateM.STATE.FINISH);
                    break;

                // vbatt >= 4.2 && Ibatt < 50mA ==> set vout=4.2V for 50min.
                case StateM.STATE.MANT2:
                    if (vBatt[battIdx] >= VBATT_NOM)
                    {
                        if (StateM.stsflg)
                        {
                            LCD.Clear();
                            LCD.DrawText("BATTERY MANT2... wait 50min", font, Colors.White, 10, 20);
                            LCD.Flush();

                            min = 50 * 60 * 2;

                            StateM.stsflg = false;
                        }

                        PWMControl.IncDirDuty(iBatt[battIdx] <= MANTCURR);

                        LCD.Clear();
                        LCD.DrawText("BATTERY MANT2", font, Colors.White, 10, 20);
                        LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                        LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80);
                        LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110);
                        LCD.DrawText("Minutes... " + (min / 120), font, Colors.White, 10, 110);
                        LCD.Flush();

                        min--;
                        Thread.Sleep(500);
                        break;
                    }
                    StateM.Set(StateM.STATE.FINISH);
                    break;

                // charge complete
                case StateM.STATE.FINISH:
                    if (battIdx == 0)
                    {
                        if (StateM.stsflg)
                        {
                            LCD.Clear();
                            LCD.DrawText("BATTERY 1 CHARGED!", font, Colors.White, 10, 20);
                            LCD.Flush();

                            StateM.stsflg = false;
                        }

                        RELE.Write(true);
                        LED1.Write(true);
                        StateM.Set(StateM.STATE.CHECK_ERR);
                        battIdx = 1;
                    }
                    else
                    {
                        if (StateM.stsflg)
                        {
                            LCD.Clear();
                            LCD.DrawText("BATTERY FULL CHARGED!!!", font, Colors.White, 10, 20);
                            LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50);
                            LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80);
                            LCD.Flush();

                            RELE.Write(false);
                            LED2.Write(true);
                            StateM.stsflg = false;
                        }

                        Thread.Sleep(2000);
                    }
                    break;

                default:
                    break;
                }
            }

            // Sleep forever
            //Thread.Sleep(Timeout.Infinite);
            //Debug.Print(Resources.GetString(Resources.StringResources.String1));
        }
예제 #2
0
 public void ChangeState(StateM newState)
 {
     currentState.Exit(this);
     currentState = newState;
     currentState.Enter(this);
 }