System Management code

Dependencies:   CANBuffer mbed SystemManagement mbed-rtos

Dependents:   SystemManagement

System Management code for Penn Electric Racing

Functions:

Controls Fans and Pumps via instruction from CAN Messages, ramps them up over time to prevent damage

Turns on/off DC-DC converter via instruction from CAN Messages

Committer:
martydd3
Date:
Wed Oct 01 12:52:26 2014 +0000
Revision:
0:e516fcccccda
Child:
1:e02eb179aed3
Added LPCDigitalOut, LPCDigitalIn, and CANBuffer Libaries; Comments on code in SysMngmt.cpp involving register and pin access; Note: LPCDigitalOut.h defines a void mode(PinMode) which isn't in LPCDigitalOut.cpp, causes a linking error if used

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martydd3 0:e516fcccccda 1 /*
martydd3 0:e516fcccccda 2 Reads CAN Messages and various data inputs, outputs using Xbee radio modules
martydd3 0:e516fcccccda 3
martydd3 0:e516fcccccda 4 Revised Sept 30, 2014: Began analyzing and commenting program, trying to figure out what the hell it does (Martin Deng)
martydd3 0:e516fcccccda 5 */
martydd3 0:e516fcccccda 6
martydd3 0:e516fcccccda 7 #include"SysMngmt.h"
martydd3 0:e516fcccccda 8 #include"Get_IMD.h"
martydd3 0:e516fcccccda 9 #include"PollSwitch.h"
martydd3 0:e516fcccccda 10 #include"TemperatureRead.h"
martydd3 0:e516fcccccda 11 #include"Store_RTC.h"
martydd3 0:e516fcccccda 12 #include"XBee_Lib.h"
martydd3 0:e516fcccccda 13 #include"CANBuffer.h"
martydd3 0:e516fcccccda 14
martydd3 0:e516fcccccda 15
martydd3 0:e516fcccccda 16 RTCStore store;
martydd3 0:e516fcccccda 17 CANBuffer RecieveBuffer(CAN1, MEDIUM);
martydd3 0:e516fcccccda 18 XBee250x XbeeTx;
martydd3 0:e516fcccccda 19
martydd3 0:e516fcccccda 20 //Possible problems in IMD coz change of counter
martydd3 0:e516fcccccda 21 //Possible problems in BatteryStatus coz change in library
martydd3 0:e516fcccccda 22
martydd3 0:e516fcccccda 23 /*
martydd3 0:e516fcccccda 24
martydd3 0:e516fcccccda 25 Attach Ticker every 10msec to
martydd3 0:e516fcccccda 26 Get IMD
martydd3 0:e516fcccccda 27 Poll Switches
martydd3 0:e516fcccccda 28 Temperature Read
martydd3 0:e516fcccccda 29 Get Battery State
martydd3 0:e516fcccccda 30 End Ticker Send message through CAN
martydd3 0:e516fcccccda 31
martydd3 0:e516fcccccda 32 CAN interrupt Rx Interrupt
martydd3 0:e516fcccccda 33 Recieve CAN message into a buffer. Return
martydd3 0:e516fcccccda 34 Buffer values(as long as !empty) -> SD Card, Xbee -> remove element
martydd3 0:e516fcccccda 35 */
martydd3 0:e516fcccccda 36
martydd3 0:e516fcccccda 37 /*
martydd3 0:e516fcccccda 38 extern "C" void CAN_IRQHandler(void)
martydd3 0:e516fcccccda 39 {
martydd3 0:e516fcccccda 40 CANMessage Rxmsg;
martydd3 0:e516fcccccda 41 CAN_SysM.read(Rxmsg);
martydd3 0:e516fcccccda 42 RecieveBuffer.add(Rxmsg);
martydd3 0:e516fcccccda 43 }
martydd3 0:e516fcccccda 44 */
martydd3 0:e516fcccccda 45
martydd3 0:e516fcccccda 46 extern "C" void TIMER2_IRQHandler(void)
martydd3 0:e516fcccccda 47 {
martydd3 0:e516fcccccda 48 if((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt
martydd3 0:e516fcccccda 49 {
martydd3 0:e516fcccccda 50 //printf("Every 1ms\n\r");
martydd3 0:e516fcccccda 51 LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag
martydd3 0:e516fcccccda 52
martydd3 0:e516fcccccda 53 Bat_I_Ratio=BatISense.read();
martydd3 0:e516fcccccda 54 BATA_msec=(((Bat_I_Ratio*3.3) - BAT_ISENSE_OFFSET_V)/BAT_ISENSE_INCREMENT);
martydd3 0:e516fcccccda 55 BATmA_Hr+=(BATA_msec*MSEC_HRS);
martydd3 0:e516fcccccda 56 store.write(BATmA_Hr,0);
martydd3 0:e516fcccccda 57
martydd3 0:e516fcccccda 58 DC_I_Ratio=DCSense.read();
martydd3 0:e516fcccccda 59 DCA_msec=(((DC_I_Ratio*3.3) - DC_DC_ISENSE_OFFSET_V)/DC_DC_ISENSE_INCREMENT);
martydd3 0:e516fcccccda 60 store.write(DCA_msec,1);
martydd3 0:e516fcccccda 61
martydd3 0:e516fcccccda 62 LPC_TIM2->TCR |= (1<<1); //Reset Timer1
martydd3 0:e516fcccccda 63 LPC_TIM2->TCR &= ~(1<<1); //Re Enable Timer1
martydd3 0:e516fcccccda 64 }
martydd3 0:e516fcccccda 65 }
martydd3 0:e516fcccccda 66
martydd3 0:e516fcccccda 67
martydd3 0:e516fcccccda 68 void Poll()
martydd3 0:e516fcccccda 69 {
martydd3 0:e516fcccccda 70 uint16_t Rxpoll;
martydd3 0:e516fcccccda 71 uint16_t recv,temp,i=0; //Test
martydd3 0:e516fcccccda 72 char Result[4]={0};
martydd3 0:e516fcccccda 73 Rxpoll=PollSwitch();
martydd3 0:e516fcccccda 74
martydd3 0:e516fcccccda 75 Result[0]=(char)(Rxpoll&0x00ff);
martydd3 0:e516fcccccda 76 Result[1]=(char)((Rxpoll&0xff00)>>8);
martydd3 0:e516fcccccda 77 CANMessage Txmsg(410,Result,sizeof(Result));
martydd3 0:e516fcccccda 78 CAN_SysM.write(Txmsg);
martydd3 0:e516fcccccda 79
martydd3 0:e516fcccccda 80 //Test
martydd3 0:e516fcccccda 81 recv=(((uint16_t)Txmsg.data[1]<<8) | (0x00ff&(uint16_t)Txmsg.data[0]));
martydd3 0:e516fcccccda 82 printf("Recv:%d\n\r",recv);
martydd3 0:e516fcccccda 83
martydd3 0:e516fcccccda 84 while(i <= 12)
martydd3 0:e516fcccccda 85 {
martydd3 0:e516fcccccda 86 temp=recv;
martydd3 0:e516fcccccda 87 if(((temp & (1 << i))>>i)==1)
martydd3 0:e516fcccccda 88 pc.printf("Switch OFF:%d\n\r",i);
martydd3 0:e516fcccccda 89 ++i;
martydd3 0:e516fcccccda 90 }
martydd3 0:e516fcccccda 91 }
martydd3 0:e516fcccccda 92
martydd3 0:e516fcccccda 93
martydd3 0:e516fcccccda 94 void Temp()
martydd3 0:e516fcccccda 95 {
martydd3 0:e516fcccccda 96 float DC_DC_Temperature, Coolant1_Temperature, Coolant2_Temperature, ChargerFET_Temperature;
martydd3 0:e516fcccccda 97 float Resistance;
martydd3 0:e516fcccccda 98 float Vadc;
martydd3 0:e516fcccccda 99 int i;
martydd3 0:e516fcccccda 100 ftc send, recv;
martydd3 0:e516fcccccda 101 recv.FLOAT=0.0;
martydd3 0:e516fcccccda 102 send.FLOAT=0.0;
martydd3 0:e516fcccccda 103
martydd3 0:e516fcccccda 104 Vadc=DC_DC.read()*VDD;
martydd3 0:e516fcccccda 105 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 106 DC_DC_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA);
martydd3 0:e516fcccccda 107 send.FLOAT=DC_DC_Temperature;
martydd3 0:e516fcccccda 108 CANMessage Txmsg_DC_DC(450,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 109 CAN_SysM.write(Txmsg_DC_DC);
martydd3 0:e516fcccccda 110
martydd3 0:e516fcccccda 111 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 112 recv.C_FLOAT[i]=Txmsg_DC_DC.data[i];
martydd3 0:e516fcccccda 113 pc.printf("DC_DC:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 114
martydd3 0:e516fcccccda 115 Vadc=ChargerFET.read()*VDD;
martydd3 0:e516fcccccda 116 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 117 ChargerFET_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA);
martydd3 0:e516fcccccda 118 send.FLOAT=ChargerFET_Temperature;
martydd3 0:e516fcccccda 119 CANMessage Txmsg_ChargerFET(451,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 120 CAN_SysM.write(Txmsg_ChargerFET);
martydd3 0:e516fcccccda 121
martydd3 0:e516fcccccda 122 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 123 recv.C_FLOAT[i]=Txmsg_ChargerFET.data[i];
martydd3 0:e516fcccccda 124 pc.printf("ChargerFET:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 125
martydd3 0:e516fcccccda 126 Vadc=Coolant1.read()*VDD;
martydd3 0:e516fcccccda 127 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 128 Coolant1_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H);
martydd3 0:e516fcccccda 129 send.FLOAT=Coolant1_Temperature;
martydd3 0:e516fcccccda 130 CANMessage Txmsg_Coolant1(452,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 131 CAN_SysM.write(Txmsg_Coolant1);
martydd3 0:e516fcccccda 132 //Control Fans
martydd3 0:e516fcccccda 133
martydd3 0:e516fcccccda 134 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 135 recv.C_FLOAT[i]=Txmsg_Coolant1.data[i];
martydd3 0:e516fcccccda 136 pc.printf("Coolant1:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 137
martydd3 0:e516fcccccda 138 Vadc=Coolant2.read()*VDD;
martydd3 0:e516fcccccda 139 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 140 Coolant2_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H);
martydd3 0:e516fcccccda 141 send.FLOAT=Coolant2_Temperature;
martydd3 0:e516fcccccda 142 CANMessage Txmsg_Coolant2(453,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 143 CAN_SysM.write(Txmsg_Coolant2);
martydd3 0:e516fcccccda 144 //Control Fans
martydd3 0:e516fcccccda 145
martydd3 0:e516fcccccda 146 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 147 recv.C_FLOAT[i]=Txmsg_Coolant2.data[i];
martydd3 0:e516fcccccda 148 pc.printf("Coolant2:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 149 }
martydd3 0:e516fcccccda 150
martydd3 0:e516fcccccda 151 void IMD()
martydd3 0:e516fcccccda 152 {
martydd3 0:e516fcccccda 153 IMD_Measurement_Output IMD_Signal;
martydd3 0:e516fcccccda 154 char status[4];
martydd3 0:e516fcccccda 155 ftc send;
martydd3 0:e516fcccccda 156
martydd3 0:e516fcccccda 157 IMD_Signal=Get_Measurement();
martydd3 0:e516fcccccda 158 send.FLOAT=IMD_Signal.Frequency;
martydd3 0:e516fcccccda 159 CANMessage Txmsg_Frequency(421,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 160 CAN_SysM.write(Txmsg_Frequency);
martydd3 0:e516fcccccda 161
martydd3 0:e516fcccccda 162 send.FLOAT=IMD_Signal.Duty_Cycle;
martydd3 0:e516fcccccda 163 CANMessage Txmsg_DutyCycle(422,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 164 CAN_SysM.write(Txmsg_DutyCycle);
martydd3 0:e516fcccccda 165
martydd3 0:e516fcccccda 166 status[0]=Result.Encoded_Status;
martydd3 0:e516fcccccda 167 CANMessage Txmsg_Status(423,status,sizeof(status));
martydd3 0:e516fcccccda 168 CAN_SysM.write(Txmsg_Status);
martydd3 0:e516fcccccda 169 }
martydd3 0:e516fcccccda 170
martydd3 0:e516fcccccda 171 void Battery()
martydd3 0:e516fcccccda 172 {
martydd3 0:e516fcccccda 173 RTCStore reg;
martydd3 0:e516fcccccda 174 ftc send;
martydd3 0:e516fcccccda 175
martydd3 0:e516fcccccda 176 send.FLOAT=reg.read(0);
martydd3 0:e516fcccccda 177 CANMessage Txmsg_BATmA_Hr(440,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 178 CAN_SysM.write(Txmsg_BATmA_Hr);
martydd3 0:e516fcccccda 179
martydd3 0:e516fcccccda 180 send.FLOAT=reg.read(1);
martydd3 0:e516fcccccda 181 CANMessage Txmsg_DCA_msec(442,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 182 CAN_SysM.write(Txmsg_DCA_msec);
martydd3 0:e516fcccccda 183 }
martydd3 0:e516fcccccda 184
martydd3 0:e516fcccccda 185 /*
martydd3 0:e516fcccccda 186 Activates a whole crapload of functions and pins on the chip
martydd3 0:e516fcccccda 187 */
martydd3 0:e516fcccccda 188 void Init()
martydd3 0:e516fcccccda 189 {
martydd3 0:e516fcccccda 190 /*
martydd3 0:e516fcccccda 191 Timers to call various functions at different intervals
martydd3 0:e516fcccccda 192 These things behave weirdly when wait(ms) is involved. Probably have to rewrite
martydd3 0:e516fcccccda 193 */
martydd3 0:e516fcccccda 194
martydd3 0:e516fcccccda 195 //ReadIMD.attach(&IMD,0.1);
martydd3 0:e516fcccccda 196 //PollSDSwitch.attach(&Poll,0.1);
martydd3 0:e516fcccccda 197
martydd3 0:e516fcccccda 198 //ReadTemperature.attach(&Temp,0.1);
martydd3 0:e516fcccccda 199 //ReadBatteryState.attach(&Battery,0.1);
martydd3 0:e516fcccccda 200
martydd3 0:e516fcccccda 201 /*
martydd3 0:e516fcccccda 202 Initialize Timer2 for Battery State
martydd3 0:e516fcccccda 203
martydd3 0:e516fcccccda 204 LPC_SC 0x400F C000 (System Control)
martydd3 0:e516fcccccda 205 ->PCONP 0x400F C0C4 (Power Control for Peripherals Register)
martydd3 0:e516fcccccda 206 |= (1<<22) 22 Bit (Timer 2 power/clock control bit)
martydd3 0:e516fcccccda 207
martydd3 0:e516fcccccda 208 ->PCLKSEL1 Peripheral Clock Selection register 1 (controls rate of clock signal supplied to peripheral)
martydd3 0:e516fcccccda 209 |= ((1<<12) | (1<<13)); 12:13 Bits (Peripheral Clock Selection for TIMER2)
martydd3 0:e516fcccccda 210
martydd3 0:e516fcccccda 211 LPC_TIM2 0x4009 0000 (Timer 2)
martydd3 0:e516fcccccda 212 ->TCR 0x4009 0004 (Timer Control Register)
martydd3 0:e516fcccccda 213 |= (1<<0); 0 Bit (Counter Enable)
martydd3 0:e516fcccccda 214
martydd3 0:e516fcccccda 215 ->MR0 0x4009 0018 (Match Register)
martydd3 0:e516fcccccda 216
martydd3 0:e516fcccccda 217 ->MCR 0x4009 0014 (Match Control Register)
martydd3 0:e516fcccccda 218
martydd3 0:e516fcccccda 219 */
martydd3 0:e516fcccccda 220 LPC_SC->PCONP |= (1<<22); //PoewerOn Timer/Counter2
martydd3 0:e516fcccccda 221 LPC_SC->PCLKSEL1 |= ((1<<12) | (1<<13)); //Prescale Timer2 CCLK/8
martydd3 0:e516fcccccda 222 LPC_TIM2->TCR |= (1<<0); //Enable Timer2
martydd3 0:e516fcccccda 223 LPC_TIM2->MR0 = 11999; // 1msec
martydd3 0:e516fcccccda 224 LPC_TIM2->MCR |= (1<<0);
martydd3 0:e516fcccccda 225
martydd3 0:e516fcccccda 226 NVIC_SetPriority(TIMER0_IRQn,200); //IMD Capture Interrupt
martydd3 0:e516fcccccda 227 NVIC_SetPriority(TIMER1_IRQn,200); //IMD 1msec sampling Interrupt
martydd3 0:e516fcccccda 228 NVIC_SetPriority(TIMER2_IRQn,1); //Battery 1msec sampling Interrupt
martydd3 0:e516fcccccda 229 NVIC_SetPriority(TIMER3_IRQn,255); //mbed Timer/Ticker/Wait Interrupt
martydd3 0:e516fcccccda 230 NVIC_SetPriority(CAN_IRQn,2);
martydd3 0:e516fcccccda 231
martydd3 0:e516fcccccda 232 NVIC_EnableIRQ(TIMER2_IRQn); //Enable TIMER2 IRQ
martydd3 0:e516fcccccda 233
martydd3 0:e516fcccccda 234 CAN_SysM.mode(CAN::GlobalTest);
martydd3 0:e516fcccccda 235 //NVIC_EnableIRQ(CAN_IRQn);
martydd3 0:e516fcccccda 236 //NVIC_EnableIRQ(CANActivity_IRQn);
martydd3 0:e516fcccccda 237 }
martydd3 0:e516fcccccda 238
martydd3 0:e516fcccccda 239 /*
martydd3 0:e516fcccccda 240 Main Loop: Currently reads CANMessages from Can interface (Pins: rd = p30, td = p29)
martydd3 0:e516fcccccda 241 Send CANMessage data through XBee radio transmitters
martydd3 0:e516fcccccda 242
martydd3 0:e516fcccccda 243 */
martydd3 0:e516fcccccda 244 int main() {
martydd3 0:e516fcccccda 245 CANMessage Rxmsg;
martydd3 0:e516fcccccda 246
martydd3 0:e516fcccccda 247 Init();
martydd3 0:e516fcccccda 248
martydd3 0:e516fcccccda 249 while(1)
martydd3 0:e516fcccccda 250 {
martydd3 0:e516fcccccda 251 if(CAN_SysM.read(Rxmsg))
martydd3 0:e516fcccccda 252 RecieveBuffer.txWrite(Rxmsg);
martydd3 0:e516fcccccda 253 while(RecieveBuffer.rxRead(Rxmsg))
martydd3 0:e516fcccccda 254 {
martydd3 0:e516fcccccda 255 XbeeTx.send(Rxmsg);
martydd3 0:e516fcccccda 256 }
martydd3 0:e516fcccccda 257
martydd3 0:e516fcccccda 258 //Poll();
martydd3 0:e516fcccccda 259 //Temp();
martydd3 0:e516fcccccda 260 //Battery();
martydd3 0:e516fcccccda 261 }
martydd3 0:e516fcccccda 262 //Temp();
martydd3 0:e516fcccccda 263 //IMD();
martydd3 0:e516fcccccda 264 //Battery();
martydd3 0:e516fcccccda 265 }