Joe Miller / Mbed 2 deprecated V8SolenoidEngine

Dependencies:   mbed

main_working1.cpp.txt

Committer:
JoeMiller
Date:
2015-03-17
Revision:
0:0d0af930b49a

File content as of revision 0:0d0af930b49a:

// Revision 4 PWM Added ----- WORK IN PROGRESS

#include "mbed.h"

 
#define EncRes      256
#define DefaultGap  1
#define Quad0       0
#define Quad1       EncRes/4
#define Quad2       EncRes/2
#define Quad3       Quad1 + Quad2
#define Quad4       EncRes
#define Quad5       EncRes + Quad1


#define OPENLOOP    0
#define CLOSEDLOOP  1
#define MODE        CLOSEDLOOP

//Ticker DebugDisplay;
//Serial pc(PTE0, PTE1);

DigitalOut LEDR(PTB18);
DigitalOut Cyl_1(PTD1);
DigitalOut Cyl_2(PTD3);
DigitalOut Cyl_3(PTD2);
DigitalOut Cyl_4(PTD0);
DigitalOut Cyl_5(PTD5);
DigitalOut Cyl_6(PTA13);
DigitalOut Cyl_7(PTC9);
DigitalOut Cyl_8(PTC8);

// User Rotary Encoder definition
/*
PwmOut          LEDRed(PTA5);
PwmOut          LEDGreen(PTA4);
PwmOut          LEDBlue(PTA12);
InterruptIn     UserEnc1A(PTD4);
DigitalIn       UserEnc1B(PTA12);
DigitalIn       PB1(PTC3); */
DigitalOut      ANODE(PTC6);
DigitalOut      COMMON(PTC5);

//---------------------------

InterruptIn  CrankAngleEncA(PTA1);
DigitalIn    CrankAngleEncB(PTC0);


Timer t;

char CylinderFired = 0;
uint8_t CrankAngle, CrankAngleChange;
uint8_t Gap = DefaultGap;
float Throttle;
// Max Speed is currently about 15RPS, 923RPM, 65ms/rev, 254uS/Encoder pulse
// 1000us interval = 3.9RPS.   0.5RPS = 7813uS encoder pulse interval 
uint16_t TargetInterval = 400; 
int elapseTime;

#define PWMPeriod 1000
#define DefaultPWMPercent 0.5

//Throttle = DefaultPWMPercent;
//Cyl_1.period_us = PWMPeriod ; Cyl_1 = Throttle;
//Cyl_2.period_us = PWMPeriod ; Cyl_2 = Throttle;
//Cyl_3.period_us = PWMPeriod ; Cyl_3 = Throttle;
//Cyl_4.period_us = PWMPeriod ; Cyl_4 = Throttle;
//Cyl_5.period_us = PWMPeriod ; Cyl_5 = Throttle;
//Cyl_6.period_us = PWMPeriod ; Cyl_6 = Throttle;
//Cyl_7.period_us = PWMPeriod ; Cyl_7 = Throttle;
//Cyl_8.period_us = PWMPeriod ; Cyl_8 = Throttle;

/*
void UserEnc1_pulse(void)
{
        if (UserEnc1B && (TargetInterval < 8000)) 
            TargetInterval += 100;
        else if (TargetInterval > 200)
            TargetInterval -= 100;              
     
}
*/

void CrankAngleEnc_pulse(void)
{
    if (CrankAngleEncB)
        CrankAngle++;
    else 
        CrankAngle--;
   //elapseTime = t.read_us(); t.reset();     
   CrankAngleChange = true;         
}


//void DispUpdate(void) {
//   pc.printf("%d : %d : %d\n\r",CrankAngle,CylindersFired1,CylindersFired2);}

int main() {
    ANODE = 1 ; COMMON = 0;
    LEDR = 0;
    CrankAngleChange = true;
//    pc.baud(57600);
 //   pc.printf("V8-Solenoid Engine...........");
  
   
    Cyl_1 = 0; Cyl_2 = 0; Cyl_3 = 0; Cyl_4 = 0; 
    Cyl_5 = 0; Cyl_6 = 1; Cyl_7 = 0; Cyl_8 = 0; 
    wait_ms(500);
    Cyl_2 = 1; Cyl_5 = 1;Cyl_6 = 0;
    wait_ms(1000);
    CrankAngle = 0;
    Cyl_2 = 0; Cyl_5 = 0;
   
//   DebugDisplay.attach(&DispUpdate,2.0);
    CrankAngleEncA.rise(&CrankAngleEnc_pulse);
//    UserEnc1A.rise(&UserEnc1_pulse);

//    pc.printf("Initialized!\n");

    while(true) {

        if(CrankAngleChange){

            // Pair#2     270 deg to 90 deg   
//            if      ( (CrankAngle < ((int8_t)Quad1-Gap-Taper) )  ||  ( (CrankAngle<(Quad5-Gap-Taper)) && (CrankAngle>(Quad3+Gap)) ) )
            if      ( (CrankAngle < (Quad1-Gap))  ||  (CrankAngle>(Quad3+Gap)) ) {
                Cyl_1 = 0; Cyl_4 = 0;
                Cyl_7 = 1; Cyl_6 = 1;
            }
                
            //Pair#4 90 deg to 270   
            else if ((CrankAngle>(Quad1+Gap))  &&  (CrankAngle<(Quad3-Gap)))  {
                Cyl_7 = 0; Cyl_6 = 0;
                Cyl_4 = 1; Cyl_1 = 1;
            }            
            else {  
                Cyl_1 = 0; 
                Cyl_4 = 0;
                Cyl_6 = 0; 
                Cyl_7 = 0;
            }
            
                
            //Pair#3 0-180 deg
            if      ((CrankAngle>Gap)   &&   (CrankAngle<(Quad2-Gap))) {    
                Cyl_2 = 0; Cyl_5 = 0;
                Cyl_8 = 1; Cyl_3 = 1;
            }
            // Pair#1 180-360 deg    
            else if ((CrankAngle>(Quad2+Gap))   &&   (CrankAngle<(Quad4-Gap))) {
                Cyl_3 = 0; Cyl_8 = 0;
                Cyl_2 = 1; Cyl_5 = 1;
            }             
            else {
                Cyl_3 = 0; 
                Cyl_8 = 0;
                Cyl_2 = 0; 
                Cyl_5 = 0;
            }
               
            CrankAngleChange = false;
              
            // Speed Control Section        
        
            if (MODE == CLOSEDLOOP) {
/*                       
                Error = TargetInterval - elapseTime;
                ErrorPrime = Error - PreviousError;
                CompensationSignal = pGain*Error + dGain*ErrorPrime;
                PreviousError = Error;
*/
            }
            else {

                Throttle = TargetInterval;
            
            } 
        }  //if crankAngleChange     
      

    }//main loop - while(true)
}//main