Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
SysMngmt.cpp@5:9258b685fea6, 2014-10-08 (annotated)
- Committer:
- martydd3
- Date:
- Wed Oct 08 20:56:41 2014 +0000
- Revision:
- 5:9258b685fea6
- Parent:
- 4:e31528929150
- Child:
- 6:6a04210a3f4f
Added 10 Hz update threads for DC-DC and fans/pumps
Who changed what in which revision?
| User | Revision | Line number | New 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 | 2:baeb80c778f7 | 15 | #include"mbed.h" |
| martydd3 | 2:baeb80c778f7 | 16 | #include"rtos.h" |
| martydd3 | 0:e516fcccccda | 17 | |
| martydd3 | 0:e516fcccccda | 18 | //Possible problems in IMD coz change of counter |
| martydd3 | 0:e516fcccccda | 19 | //Possible problems in BatteryStatus coz change in library |
| martydd3 | 0:e516fcccccda | 20 | |
| martydd3 | 0:e516fcccccda | 21 | /* |
| martydd3 | 0:e516fcccccda | 22 | |
| martydd3 | 0:e516fcccccda | 23 | Attach Ticker every 10msec to |
| martydd3 | 0:e516fcccccda | 24 | Get IMD |
| martydd3 | 0:e516fcccccda | 25 | Poll Switches |
| martydd3 | 0:e516fcccccda | 26 | Temperature Read |
| martydd3 | 0:e516fcccccda | 27 | Get Battery State |
| martydd3 | 0:e516fcccccda | 28 | End Ticker Send message through CAN |
| martydd3 | 0:e516fcccccda | 29 | |
| martydd3 | 0:e516fcccccda | 30 | CAN interrupt Rx Interrupt |
| martydd3 | 0:e516fcccccda | 31 | Recieve CAN message into a buffer. Return |
| martydd3 | 0:e516fcccccda | 32 | Buffer values(as long as !empty) -> SD Card, Xbee -> remove element |
| martydd3 | 0:e516fcccccda | 33 | |
| martydd3 | 0:e516fcccccda | 34 | extern "C" void CAN_IRQHandler(void) |
| martydd3 | 0:e516fcccccda | 35 | { |
| martydd3 | 0:e516fcccccda | 36 | CANMessage Rxmsg; |
| martydd3 | 0:e516fcccccda | 37 | CAN_SysM.read(Rxmsg); |
| martydd3 | 0:e516fcccccda | 38 | RecieveBuffer.add(Rxmsg); |
| martydd3 | 0:e516fcccccda | 39 | } |
| martydd3 | 0:e516fcccccda | 40 | |
| martydd3 | 1:e02eb179aed3 | 41 | http://developer.mbed.org/users/AjK/notebook/getting-closer-to-the-hardware/ |
| martydd3 | 1:e02eb179aed3 | 42 | |
| martydd3 | 1:e02eb179aed3 | 43 | extern "C" means this is linked assuming it's C code |
| martydd3 | 1:e02eb179aed3 | 44 | C++ linker appearently adds extra crap with the function arguments keeping functions of this kind from linking properly |
| martydd3 | 1:e02eb179aed3 | 45 | |
| martydd3 | 1:e02eb179aed3 | 46 | Interrupt handler, This is probably linked to the Timer 2 interrupt request somewhere by the libraries |
| martydd3 | 2:baeb80c778f7 | 47 | |
| martydd3 | 0:e516fcccccda | 48 | extern "C" void TIMER2_IRQHandler(void) |
| martydd3 | 0:e516fcccccda | 49 | { |
| martydd3 | 0:e516fcccccda | 50 | if((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt |
| martydd3 | 0:e516fcccccda | 51 | { |
| martydd3 | 1:e02eb179aed3 | 52 | // This probably shouldn't be here, never have a printf() in an interrupt, locks up the main thread |
| martydd3 | 1:e02eb179aed3 | 53 | // printf("Every 1ms\n\r"); |
| martydd3 | 1:e02eb179aed3 | 54 | |
| martydd3 | 0:e516fcccccda | 55 | LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag |
| martydd3 | 0:e516fcccccda | 56 | |
| martydd3 | 1:e02eb179aed3 | 57 | // gonna hope all these calculations are correct |
| martydd3 | 1:e02eb179aed3 | 58 | // writes to RTC store, but there's no read code here |
| martydd3 | 1:e02eb179aed3 | 59 | // 2 misleading things. First, RTC store writes to a general purpose register |
| martydd3 | 1:e02eb179aed3 | 60 | // secondly, no code reads from this register in this .cpp, but maybe some other code does |
| martydd3 | 1:e02eb179aed3 | 61 | |
| martydd3 | 0:e516fcccccda | 62 | Bat_I_Ratio=BatISense.read(); |
| martydd3 | 0:e516fcccccda | 63 | BATA_msec=(((Bat_I_Ratio*3.3) - BAT_ISENSE_OFFSET_V)/BAT_ISENSE_INCREMENT); |
| martydd3 | 0:e516fcccccda | 64 | BATmA_Hr+=(BATA_msec*MSEC_HRS); |
| martydd3 | 0:e516fcccccda | 65 | store.write(BATmA_Hr,0); |
| martydd3 | 0:e516fcccccda | 66 | |
| martydd3 | 0:e516fcccccda | 67 | DC_I_Ratio=DCSense.read(); |
| martydd3 | 0:e516fcccccda | 68 | DCA_msec=(((DC_I_Ratio*3.3) - DC_DC_ISENSE_OFFSET_V)/DC_DC_ISENSE_INCREMENT); |
| martydd3 | 0:e516fcccccda | 69 | store.write(DCA_msec,1); |
| martydd3 | 0:e516fcccccda | 70 | |
| martydd3 | 0:e516fcccccda | 71 | LPC_TIM2->TCR |= (1<<1); //Reset Timer1 |
| martydd3 | 1:e02eb179aed3 | 72 | LPC_TIM2->TCR &= ~(1<<1); //Re Enable Timer1 |
| martydd3 | 0:e516fcccccda | 73 | } |
| martydd3 | 0:e516fcccccda | 74 | } |
| martydd3 | 0:e516fcccccda | 75 | |
| martydd3 | 1:e02eb179aed3 | 76 | Appears to read a whole bunch of DigitalOut pins in void PollSwitch(), store the value in uint16_t Rxpoll, |
| martydd3 | 1:e02eb179aed3 | 77 | and write the result to the CAN bus |
| martydd3 | 2:baeb80c778f7 | 78 | |
| martydd3 | 0:e516fcccccda | 79 | void Poll() |
| martydd3 | 0:e516fcccccda | 80 | { |
| martydd3 | 0:e516fcccccda | 81 | uint16_t Rxpoll; |
| martydd3 | 0:e516fcccccda | 82 | uint16_t recv,temp,i=0; //Test |
| martydd3 | 0:e516fcccccda | 83 | char Result[4]={0}; |
| martydd3 | 0:e516fcccccda | 84 | Rxpoll=PollSwitch(); |
| martydd3 | 0:e516fcccccda | 85 | |
| martydd3 | 0:e516fcccccda | 86 | Result[0]=(char)(Rxpoll&0x00ff); |
| martydd3 | 0:e516fcccccda | 87 | Result[1]=(char)((Rxpoll&0xff00)>>8); |
| martydd3 | 0:e516fcccccda | 88 | CANMessage Txmsg(410,Result,sizeof(Result)); |
| martydd3 | 0:e516fcccccda | 89 | CAN_SysM.write(Txmsg); |
| martydd3 | 0:e516fcccccda | 90 | |
| martydd3 | 0:e516fcccccda | 91 | //Test |
| martydd3 | 0:e516fcccccda | 92 | recv=(((uint16_t)Txmsg.data[1]<<8) | (0x00ff&(uint16_t)Txmsg.data[0])); |
| martydd3 | 0:e516fcccccda | 93 | printf("Recv:%d\n\r",recv); |
| martydd3 | 0:e516fcccccda | 94 | |
| martydd3 | 0:e516fcccccda | 95 | while(i <= 12) |
| martydd3 | 0:e516fcccccda | 96 | { |
| martydd3 | 0:e516fcccccda | 97 | temp=recv; |
| martydd3 | 0:e516fcccccda | 98 | if(((temp & (1 << i))>>i)==1) |
| martydd3 | 0:e516fcccccda | 99 | pc.printf("Switch OFF:%d\n\r",i); |
| martydd3 | 0:e516fcccccda | 100 | ++i; |
| martydd3 | 0:e516fcccccda | 101 | } |
| martydd3 | 0:e516fcccccda | 102 | } |
| martydd3 | 0:e516fcccccda | 103 | |
| martydd3 | 0:e516fcccccda | 104 | |
| martydd3 | 0:e516fcccccda | 105 | void Temp() |
| martydd3 | 0:e516fcccccda | 106 | { |
| martydd3 | 0:e516fcccccda | 107 | float DC_DC_Temperature, Coolant1_Temperature, Coolant2_Temperature, ChargerFET_Temperature; |
| martydd3 | 0:e516fcccccda | 108 | float Resistance; |
| martydd3 | 0:e516fcccccda | 109 | float Vadc; |
| martydd3 | 0:e516fcccccda | 110 | int i; |
| martydd3 | 0:e516fcccccda | 111 | ftc send, recv; |
| martydd3 | 0:e516fcccccda | 112 | recv.FLOAT=0.0; |
| martydd3 | 0:e516fcccccda | 113 | send.FLOAT=0.0; |
| martydd3 | 0:e516fcccccda | 114 | |
| martydd3 | 0:e516fcccccda | 115 | Vadc=DC_DC.read()*VDD; |
| martydd3 | 0:e516fcccccda | 116 | Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); |
| martydd3 | 0:e516fcccccda | 117 | DC_DC_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA); |
| martydd3 | 0:e516fcccccda | 118 | send.FLOAT=DC_DC_Temperature; |
| martydd3 | 0:e516fcccccda | 119 | CANMessage Txmsg_DC_DC(450,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 120 | CAN_SysM.write(Txmsg_DC_DC); |
| martydd3 | 0:e516fcccccda | 121 | |
| martydd3 | 0:e516fcccccda | 122 | for(i=0; i<4;i++) |
| martydd3 | 0:e516fcccccda | 123 | recv.C_FLOAT[i]=Txmsg_DC_DC.data[i]; |
| martydd3 | 0:e516fcccccda | 124 | pc.printf("DC_DC:%f\n\r",recv.FLOAT); |
| martydd3 | 0:e516fcccccda | 125 | |
| martydd3 | 0:e516fcccccda | 126 | Vadc=ChargerFET.read()*VDD; |
| martydd3 | 0:e516fcccccda | 127 | Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); |
| martydd3 | 0:e516fcccccda | 128 | ChargerFET_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA); |
| martydd3 | 0:e516fcccccda | 129 | send.FLOAT=ChargerFET_Temperature; |
| martydd3 | 0:e516fcccccda | 130 | CANMessage Txmsg_ChargerFET(451,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 131 | CAN_SysM.write(Txmsg_ChargerFET); |
| martydd3 | 0:e516fcccccda | 132 | |
| martydd3 | 0:e516fcccccda | 133 | for(i=0; i<4;i++) |
| martydd3 | 0:e516fcccccda | 134 | recv.C_FLOAT[i]=Txmsg_ChargerFET.data[i]; |
| martydd3 | 0:e516fcccccda | 135 | pc.printf("ChargerFET:%f\n\r",recv.FLOAT); |
| martydd3 | 0:e516fcccccda | 136 | |
| martydd3 | 0:e516fcccccda | 137 | Vadc=Coolant1.read()*VDD; |
| martydd3 | 0:e516fcccccda | 138 | Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); |
| martydd3 | 0:e516fcccccda | 139 | Coolant1_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H); |
| martydd3 | 0:e516fcccccda | 140 | send.FLOAT=Coolant1_Temperature; |
| martydd3 | 0:e516fcccccda | 141 | CANMessage Txmsg_Coolant1(452,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 142 | CAN_SysM.write(Txmsg_Coolant1); |
| martydd3 | 0:e516fcccccda | 143 | //Control Fans |
| martydd3 | 0:e516fcccccda | 144 | |
| martydd3 | 0:e516fcccccda | 145 | for(i=0; i<4;i++) |
| martydd3 | 0:e516fcccccda | 146 | recv.C_FLOAT[i]=Txmsg_Coolant1.data[i]; |
| martydd3 | 0:e516fcccccda | 147 | pc.printf("Coolant1:%f\n\r",recv.FLOAT); |
| martydd3 | 0:e516fcccccda | 148 | |
| martydd3 | 0:e516fcccccda | 149 | Vadc=Coolant2.read()*VDD; |
| martydd3 | 0:e516fcccccda | 150 | Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); |
| martydd3 | 0:e516fcccccda | 151 | Coolant2_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H); |
| martydd3 | 0:e516fcccccda | 152 | send.FLOAT=Coolant2_Temperature; |
| martydd3 | 0:e516fcccccda | 153 | CANMessage Txmsg_Coolant2(453,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 154 | CAN_SysM.write(Txmsg_Coolant2); |
| martydd3 | 0:e516fcccccda | 155 | //Control Fans |
| martydd3 | 0:e516fcccccda | 156 | |
| martydd3 | 0:e516fcccccda | 157 | for(i=0; i<4;i++) |
| martydd3 | 0:e516fcccccda | 158 | recv.C_FLOAT[i]=Txmsg_Coolant2.data[i]; |
| martydd3 | 0:e516fcccccda | 159 | pc.printf("Coolant2:%f\n\r",recv.FLOAT); |
| martydd3 | 0:e516fcccccda | 160 | } |
| martydd3 | 0:e516fcccccda | 161 | |
| martydd3 | 0:e516fcccccda | 162 | void IMD() |
| martydd3 | 0:e516fcccccda | 163 | { |
| martydd3 | 0:e516fcccccda | 164 | IMD_Measurement_Output IMD_Signal; |
| martydd3 | 0:e516fcccccda | 165 | char status[4]; |
| martydd3 | 0:e516fcccccda | 166 | ftc send; |
| martydd3 | 0:e516fcccccda | 167 | |
| martydd3 | 0:e516fcccccda | 168 | IMD_Signal=Get_Measurement(); |
| martydd3 | 0:e516fcccccda | 169 | send.FLOAT=IMD_Signal.Frequency; |
| martydd3 | 0:e516fcccccda | 170 | CANMessage Txmsg_Frequency(421,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 171 | CAN_SysM.write(Txmsg_Frequency); |
| martydd3 | 0:e516fcccccda | 172 | |
| martydd3 | 0:e516fcccccda | 173 | send.FLOAT=IMD_Signal.Duty_Cycle; |
| martydd3 | 0:e516fcccccda | 174 | CANMessage Txmsg_DutyCycle(422,send.C_FLOAT,sizeof(send.C_FLOAT)); |
| martydd3 | 0:e516fcccccda | 175 | CAN_SysM.write(Txmsg_DutyCycle); |
| martydd3 | 0:e516fcccccda | 176 | |
| martydd3 | 0:e516fcccccda | 177 | status[0]=Result.Encoded_Status; |
| martydd3 | 0:e516fcccccda | 178 | CANMessage Txmsg_Status(423,status,sizeof(status)); |
| martydd3 | 0:e516fcccccda | 179 | CAN_SysM.write(Txmsg_Status); |
| martydd3 | 0:e516fcccccda | 180 | } |
| martydd3 | 5:9258b685fea6 | 181 | */ |
| martydd3 | 0:e516fcccccda | 182 | |
| martydd3 | 5:9258b685fea6 | 183 | /* |
| martydd3 | 0:e516fcccccda | 184 | Activates a whole crapload of functions and pins on the chip |
| martydd3 | 2:baeb80c778f7 | 185 | |
| martydd3 | 0:e516fcccccda | 186 | void Init() |
| martydd3 | 0:e516fcccccda | 187 | { |
| martydd3 | 2:baeb80c778f7 | 188 | |
| martydd3 | 0:e516fcccccda | 189 | Timers to call various functions at different intervals |
| martydd3 | 0:e516fcccccda | 190 | These things behave weirdly when wait(ms) is involved. Probably have to rewrite |
| martydd3 | 2:baeb80c778f7 | 191 | |
| martydd3 | 0:e516fcccccda | 192 | |
| martydd3 | 0:e516fcccccda | 193 | //ReadIMD.attach(&IMD,0.1); |
| martydd3 | 0:e516fcccccda | 194 | //PollSDSwitch.attach(&Poll,0.1); |
| martydd3 | 0:e516fcccccda | 195 | |
| martydd3 | 0:e516fcccccda | 196 | //ReadTemperature.attach(&Temp,0.1); |
| martydd3 | 0:e516fcccccda | 197 | //ReadBatteryState.attach(&Battery,0.1); |
| martydd3 | 0:e516fcccccda | 198 | |
| martydd3 | 2:baeb80c778f7 | 199 | |
| martydd3 | 0:e516fcccccda | 200 | Initialize Timer2 for Battery State |
| martydd3 | 0:e516fcccccda | 201 | |
| martydd3 | 0:e516fcccccda | 202 | LPC_SC 0x400F C000 (System Control) |
| martydd3 | 0:e516fcccccda | 203 | ->PCONP 0x400F C0C4 (Power Control for Peripherals Register) |
| martydd3 | 0:e516fcccccda | 204 | |= (1<<22) 22 Bit (Timer 2 power/clock control bit) |
| martydd3 | 0:e516fcccccda | 205 | |
| martydd3 | 0:e516fcccccda | 206 | ->PCLKSEL1 Peripheral Clock Selection register 1 (controls rate of clock signal supplied to peripheral) |
| martydd3 | 0:e516fcccccda | 207 | |= ((1<<12) | (1<<13)); 12:13 Bits (Peripheral Clock Selection for TIMER2) |
| martydd3 | 0:e516fcccccda | 208 | |
| martydd3 | 0:e516fcccccda | 209 | LPC_TIM2 0x4009 0000 (Timer 2) |
| martydd3 | 0:e516fcccccda | 210 | ->TCR 0x4009 0004 (Timer Control Register) |
| martydd3 | 0:e516fcccccda | 211 | |= (1<<0); 0 Bit (Counter Enable) |
| martydd3 | 0:e516fcccccda | 212 | |
| martydd3 | 0:e516fcccccda | 213 | ->MR0 0x4009 0018 (Match Register) |
| martydd3 | 0:e516fcccccda | 214 | |
| martydd3 | 1:e02eb179aed3 | 215 | ->MCR 0x4009 0014 (Match Control Register) What to do when Match Register matches the Timer Counter |
| martydd3 | 1:e02eb179aed3 | 216 | |= (1<<0); 0 Bit (Interrupt on MR0, interrupt generated when MR0 matches the value in TC) |
| martydd3 | 0:e516fcccccda | 217 | |
| martydd3 | 2:baeb80c778f7 | 218 | |
| martydd3 | 0:e516fcccccda | 219 | LPC_SC->PCONP |= (1<<22); //PoewerOn Timer/Counter2 |
| martydd3 | 0:e516fcccccda | 220 | LPC_SC->PCLKSEL1 |= ((1<<12) | (1<<13)); //Prescale Timer2 CCLK/8 |
| martydd3 | 0:e516fcccccda | 221 | LPC_TIM2->TCR |= (1<<0); //Enable Timer2 |
| martydd3 | 0:e516fcccccda | 222 | LPC_TIM2->MR0 = 11999; // 1msec |
| martydd3 | 0:e516fcccccda | 223 | LPC_TIM2->MCR |= (1<<0); |
| martydd3 | 2:baeb80c778f7 | 224 | |
| martydd3 | 1:e02eb179aed3 | 225 | Nested Vectored Interrupt Controller (NVIC) |
| martydd3 | 1:e02eb179aed3 | 226 | |
| martydd3 | 1:e02eb179aed3 | 227 | NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) |
| martydd3 | 1:e02eb179aed3 | 228 | sets priority of an interrupt |
| martydd3 | 1:e02eb179aed3 | 229 | |
| martydd3 | 1:e02eb179aed3 | 230 | IRQn_Type |
| martydd3 | 1:e02eb179aed3 | 231 | Interrupt number definitions |
| martydd3 | 1:e02eb179aed3 | 232 | Interrupt Request (IRQ) |
| martydd3 | 1:e02eb179aed3 | 233 | |
| martydd3 | 1:e02eb179aed3 | 234 | NVIC_EnableIRQ(IRQn_Type IRQn) |
| martydd3 | 1:e02eb179aed3 | 235 | Enable external interrupt (in this case, the TIMER2_IRQHandler(void) function above gets called every time |
| martydd3 | 1:e02eb179aed3 | 236 | Timer2 generates an interrupt signal) |
| martydd3 | 1:e02eb179aed3 | 237 | |
| martydd3 | 2:baeb80c778f7 | 238 | |
| martydd3 | 0:e516fcccccda | 239 | NVIC_SetPriority(TIMER0_IRQn,200); //IMD Capture Interrupt |
| martydd3 | 0:e516fcccccda | 240 | NVIC_SetPriority(TIMER1_IRQn,200); //IMD 1msec sampling Interrupt |
| martydd3 | 0:e516fcccccda | 241 | NVIC_SetPriority(TIMER2_IRQn,1); //Battery 1msec sampling Interrupt |
| martydd3 | 0:e516fcccccda | 242 | NVIC_SetPriority(TIMER3_IRQn,255); //mbed Timer/Ticker/Wait Interrupt |
| martydd3 | 0:e516fcccccda | 243 | NVIC_SetPriority(CAN_IRQn,2); |
| martydd3 | 0:e516fcccccda | 244 | |
| martydd3 | 0:e516fcccccda | 245 | NVIC_EnableIRQ(TIMER2_IRQn); //Enable TIMER2 IRQ |
| martydd3 | 0:e516fcccccda | 246 | |
| martydd3 | 0:e516fcccccda | 247 | CAN_SysM.mode(CAN::GlobalTest); |
| martydd3 | 2:baeb80c778f7 | 248 | |
| martydd3 | 2:baeb80c778f7 | 249 | |
| martydd3 | 0:e516fcccccda | 250 | //NVIC_EnableIRQ(CAN_IRQn); |
| martydd3 | 0:e516fcccccda | 251 | //NVIC_EnableIRQ(CANActivity_IRQn); |
| martydd3 | 0:e516fcccccda | 252 | } |
| martydd3 | 0:e516fcccccda | 253 | |
| martydd3 | 2:baeb80c778f7 | 254 | |
| martydd3 | 0:e516fcccccda | 255 | Main Loop: Currently reads CANMessages from Can interface (Pins: rd = p30, td = p29) |
| martydd3 | 0:e516fcccccda | 256 | Send CANMessage data through XBee radio transmitters |
| martydd3 | 2:baeb80c778f7 | 257 | */ |
| martydd3 | 2:baeb80c778f7 | 258 | |
| martydd3 | 2:baeb80c778f7 | 259 | |
| martydd3 | 2:baeb80c778f7 | 260 | CANBuffer rxBuffer(CAN1, MEDIUM); |
| martydd3 | 2:baeb80c778f7 | 261 | XBee250x XbeeTx; |
| martydd3 | 2:baeb80c778f7 | 262 | |
| martydd3 | 4:e31528929150 | 263 | char sys_src_id = 4; // source address of system management |
| martydd3 | 2:baeb80c778f7 | 264 | |
| martydd3 | 4:e31528929150 | 265 | char fan_id = 1; // first byte of CANData, last byte states the duty cycle, second-last states which fan to control |
| martydd3 | 2:baeb80c778f7 | 266 | |
| martydd3 | 4:e31528929150 | 267 | Thread *fan_threads[4] = {NULL, NULL, NULL, NULL}; // Threads currently running on the 4 output pins |
| martydd3 | 2:baeb80c778f7 | 268 | |
| martydd3 | 2:baeb80c778f7 | 269 | /* |
| martydd3 | 2:baeb80c778f7 | 270 | Pins for Fans and Pumps |
| martydd3 | 2:baeb80c778f7 | 271 | PUMP_PWM = p2.0 |
| martydd3 | 2:baeb80c778f7 | 272 | FAN1_PWM = p2.1 |
| martydd3 | 2:baeb80c778f7 | 273 | FAN2_PWM = p2.2 |
| martydd3 | 2:baeb80c778f7 | 274 | FAN3_PWM = p2.3 |
| martydd3 | 2:baeb80c778f7 | 275 | */ |
| martydd3 | 2:baeb80c778f7 | 276 | |
| martydd3 | 2:baeb80c778f7 | 277 | PwmOut pump_pwm(P2_0); |
| martydd3 | 2:baeb80c778f7 | 278 | PwmOut fan1_pwm(P2_1); |
| martydd3 | 2:baeb80c778f7 | 279 | PwmOut fan2_pwm(P2_2); |
| martydd3 | 2:baeb80c778f7 | 280 | PwmOut fan3_pwm(P2_3); |
| martydd3 | 2:baeb80c778f7 | 281 | |
| martydd3 | 5:9258b685fea6 | 282 | char fan1_duty = 0; |
| martydd3 | 5:9258b685fea6 | 283 | char fan2_duty = 0; |
| martydd3 | 5:9258b685fea6 | 284 | char fan3_duty = 0; |
| martydd3 | 5:9258b685fea6 | 285 | char pump_duty = 0; |
| martydd3 | 5:9258b685fea6 | 286 | |
| martydd3 | 5:9258b685fea6 | 287 | int tx_fan_id = ((int)sys_src_id << 8)&((int)fan_id); |
| martydd3 | 5:9258b685fea6 | 288 | |
| martydd3 | 2:baeb80c778f7 | 289 | // duty goes from 0 to 100 |
| martydd3 | 2:baeb80c778f7 | 290 | void rampFans(void const *arg){ |
| martydd3 | 0:e516fcccccda | 291 | |
| martydd3 | 4:e31528929150 | 292 | char *data = (char *)arg; |
| martydd3 | 2:baeb80c778f7 | 293 | |
| martydd3 | 4:e31528929150 | 294 | // bounds checking |
| martydd3 | 4:e31528929150 | 295 | char duty = data[1]; |
| martydd3 | 4:e31528929150 | 296 | if(duty > 100) |
| martydd3 | 2:baeb80c778f7 | 297 | return; |
| martydd3 | 2:baeb80c778f7 | 298 | |
| martydd3 | 4:e31528929150 | 299 | char pin_id = data[0]; |
| martydd3 | 4:e31528929150 | 300 | if(pin_id > 3) |
| martydd3 | 4:e31528929150 | 301 | return; |
| martydd3 | 4:e31528929150 | 302 | |
| martydd3 | 4:e31528929150 | 303 | char *cur_duty; |
| martydd3 | 2:baeb80c778f7 | 304 | PwmOut *out_pin; |
| martydd3 | 2:baeb80c778f7 | 305 | |
| martydd3 | 4:e31528929150 | 306 | switch(pin_id){ |
| martydd3 | 2:baeb80c778f7 | 307 | case 0: cur_duty = &pump_duty; |
| martydd3 | 2:baeb80c778f7 | 308 | out_pin = &pump_pwm; |
| martydd3 | 2:baeb80c778f7 | 309 | break; |
| martydd3 | 2:baeb80c778f7 | 310 | case 1: cur_duty = &fan1_duty; |
| martydd3 | 2:baeb80c778f7 | 311 | out_pin = &fan1_pwm; |
| martydd3 | 2:baeb80c778f7 | 312 | break; |
| martydd3 | 2:baeb80c778f7 | 313 | case 2: cur_duty = &fan2_duty; |
| martydd3 | 2:baeb80c778f7 | 314 | out_pin = &fan2_pwm; |
| martydd3 | 2:baeb80c778f7 | 315 | break; |
| martydd3 | 2:baeb80c778f7 | 316 | case 3: cur_duty = &fan3_duty; |
| martydd3 | 2:baeb80c778f7 | 317 | out_pin = &fan3_pwm; |
| martydd3 | 2:baeb80c778f7 | 318 | break; |
| martydd3 | 2:baeb80c778f7 | 319 | default: |
| martydd3 | 2:baeb80c778f7 | 320 | return; |
| martydd3 | 2:baeb80c778f7 | 321 | } |
| martydd3 | 2:baeb80c778f7 | 322 | |
| martydd3 | 2:baeb80c778f7 | 323 | while(*cur_duty != duty){ |
| martydd3 | 2:baeb80c778f7 | 324 | |
| martydd3 | 2:baeb80c778f7 | 325 | if(duty > *cur_duty){ |
| martydd3 | 2:baeb80c778f7 | 326 | *cur_duty += 10; |
| martydd3 | 2:baeb80c778f7 | 327 | |
| martydd3 | 2:baeb80c778f7 | 328 | if(*cur_duty > duty) |
| martydd3 | 2:baeb80c778f7 | 329 | *cur_duty = duty; |
| martydd3 | 2:baeb80c778f7 | 330 | } else if(duty < *cur_duty){ |
| martydd3 | 2:baeb80c778f7 | 331 | *cur_duty -= 10; |
| martydd3 | 2:baeb80c778f7 | 332 | |
| martydd3 | 2:baeb80c778f7 | 333 | if(*cur_duty < duty) |
| martydd3 | 2:baeb80c778f7 | 334 | *cur_duty = duty; |
| martydd3 | 2:baeb80c778f7 | 335 | } |
| martydd3 | 2:baeb80c778f7 | 336 | |
| martydd3 | 2:baeb80c778f7 | 337 | out_pin->write((*cur_duty)*0.01); |
| martydd3 | 2:baeb80c778f7 | 338 | |
| martydd3 | 2:baeb80c778f7 | 339 | Thread::wait(10); |
| martydd3 | 2:baeb80c778f7 | 340 | } |
| martydd3 | 2:baeb80c778f7 | 341 | } |
| martydd3 | 2:baeb80c778f7 | 342 | |
| martydd3 | 5:9258b685fea6 | 343 | void updateFans(void const *arg){ |
| martydd3 | 5:9258b685fea6 | 344 | char data[4] = {0, 0, 0, 0}; |
| martydd3 | 5:9258b685fea6 | 345 | while(1){ |
| martydd3 | 5:9258b685fea6 | 346 | data[0] = pump_duty; |
| martydd3 | 5:9258b685fea6 | 347 | data[1] = fan1_duty; |
| martydd3 | 5:9258b685fea6 | 348 | data[2] = fan2_duty; |
| martydd3 | 5:9258b685fea6 | 349 | data[3] = fan3_duty; |
| martydd3 | 5:9258b685fea6 | 350 | CANMessage txMessage(tx_fan_id, data, 4); |
| martydd3 | 5:9258b685fea6 | 351 | rxBuffer.txWrite(txMessage); |
| martydd3 | 5:9258b685fea6 | 352 | Thread::wait(100); |
| martydd3 | 5:9258b685fea6 | 353 | } |
| martydd3 | 5:9258b685fea6 | 354 | } |
| martydd3 | 5:9258b685fea6 | 355 | |
| martydd3 | 5:9258b685fea6 | 356 | char dc_id = 0; // first byte of CANData, last byte states whether to toggle on (1) or off (0) |
| martydd3 | 3:1345f882d8f3 | 357 | DigitalOut dcPin(p20); |
| martydd3 | 4:e31528929150 | 358 | bool dc_on = false; |
| martydd3 | 3:1345f882d8f3 | 359 | |
| martydd3 | 5:9258b685fea6 | 360 | int tx_dc_id = ((int)sys_src_id << 8)&((int)dc_id); |
| martydd3 | 5:9258b685fea6 | 361 | |
| martydd3 | 3:1345f882d8f3 | 362 | void toggleDC_DC(bool toggle){ |
| martydd3 | 3:1345f882d8f3 | 363 | |
| martydd3 | 3:1345f882d8f3 | 364 | //dcPin turns on DC_DC converter when 0, off when 1 |
| martydd3 | 3:1345f882d8f3 | 365 | |
| martydd3 | 3:1345f882d8f3 | 366 | if(toggle && !dc_on){ |
| martydd3 | 3:1345f882d8f3 | 367 | dcPin = 0; |
| martydd3 | 3:1345f882d8f3 | 368 | dc_on = true; |
| martydd3 | 3:1345f882d8f3 | 369 | } else if(!toggle && dc_on){ |
| martydd3 | 3:1345f882d8f3 | 370 | dcPin = 1; |
| martydd3 | 3:1345f882d8f3 | 371 | dc_on = false; |
| martydd3 | 3:1345f882d8f3 | 372 | } |
| martydd3 | 3:1345f882d8f3 | 373 | } |
| martydd3 | 3:1345f882d8f3 | 374 | |
| martydd3 | 5:9258b685fea6 | 375 | void updateDC(void const *arg){ |
| martydd3 | 5:9258b685fea6 | 376 | char data[4] = {0, 0, 0, 0}; |
| martydd3 | 5:9258b685fea6 | 377 | while(1){ |
| martydd3 | 5:9258b685fea6 | 378 | data[0] = dc_on; |
| martydd3 | 5:9258b685fea6 | 379 | CANMessage txMessage(tx_dc_id, data, 4); |
| martydd3 | 5:9258b685fea6 | 380 | rxBuffer.txWrite(txMessage); |
| martydd3 | 5:9258b685fea6 | 381 | Thread::wait(100); |
| martydd3 | 5:9258b685fea6 | 382 | } |
| martydd3 | 5:9258b685fea6 | 383 | } |
| martydd3 | 5:9258b685fea6 | 384 | |
| martydd3 | 0:e516fcccccda | 385 | int main() { |
| martydd3 | 2:baeb80c778f7 | 386 | CANMessage rx_msg; |
| martydd3 | 2:baeb80c778f7 | 387 | |
| martydd3 | 3:1345f882d8f3 | 388 | //turn off DC-DC converter on startup |
| martydd3 | 3:1345f882d8f3 | 389 | toggleDC_DC(false); |
| martydd3 | 3:1345f882d8f3 | 390 | |
| martydd3 | 5:9258b685fea6 | 391 | //CANMessage update threads |
| martydd3 | 5:9258b685fea6 | 392 | Thread fan_update(updateFans); |
| martydd3 | 5:9258b685fea6 | 393 | Thread dc_update(updateDC); |
| martydd3 | 5:9258b685fea6 | 394 | |
| martydd3 | 0:e516fcccccda | 395 | while(1) |
| martydd3 | 0:e516fcccccda | 396 | { |
| martydd3 | 4:e31528929150 | 397 | if(rxBuffer.rxRead(rx_msg)){ |
| martydd3 | 4:e31528929150 | 398 | char src_addr = (rx_msg.id & 0x0700) >> 8; // get bits 10:8 |
| martydd3 | 4:e31528929150 | 399 | |
| martydd3 | 4:e31528929150 | 400 | if(src_addr == sys_src_id){ |
| martydd3 | 4:e31528929150 | 401 | char cont_id = (rx_msg.id & 0x00FF); // get bits 7:0 |
| martydd3 | 2:baeb80c778f7 | 402 | |
| martydd3 | 4:e31528929150 | 403 | // only control fans of dc_dc converter is on |
| martydd3 | 4:e31528929150 | 404 | if(cont_id == fan_id && dc_on) |
| martydd3 | 4:e31528929150 | 405 | { |
| martydd3 | 4:e31528929150 | 406 | char duty = rx_msg.data[1]; |
| martydd3 | 4:e31528929150 | 407 | if(duty > 100) |
| martydd3 | 4:e31528929150 | 408 | break; |
| martydd3 | 4:e31528929150 | 409 | |
| martydd3 | 4:e31528929150 | 410 | char pin_id = rx_msg.data[0]; |
| martydd3 | 4:e31528929150 | 411 | if(pin_id > 3) |
| martydd3 | 4:e31528929150 | 412 | break; |
| martydd3 | 2:baeb80c778f7 | 413 | |
| martydd3 | 4:e31528929150 | 414 | if(fan_threads[pin_id] != NULL){ |
| martydd3 | 4:e31528929150 | 415 | fan_threads[pin_id]->terminate(); |
| martydd3 | 4:e31528929150 | 416 | free(fan_threads[pin_id]); |
| martydd3 | 4:e31528929150 | 417 | } |
| martydd3 | 4:e31528929150 | 418 | |
| martydd3 | 4:e31528929150 | 419 | fan_threads[pin_id] = new Thread(rampFans, rx_msg.data); |
| martydd3 | 2:baeb80c778f7 | 420 | } |
| martydd3 | 2:baeb80c778f7 | 421 | |
| martydd3 | 5:9258b685fea6 | 422 | if(cont_id == dc_id){ |
| martydd3 | 4:e31528929150 | 423 | toggleDC_DC(rx_msg.data[0]); |
| martydd3 | 4:e31528929150 | 424 | } |
| martydd3 | 4:e31528929150 | 425 | |
| martydd3 | 4:e31528929150 | 426 | } // check for correct src_addr |
| martydd3 | 4:e31528929150 | 427 | } // check CANBuffer |
| martydd3 | 4:e31528929150 | 428 | } // main while loop |
| martydd3 | 0:e516fcccccda | 429 | } |
