elixys periphreal system firmware library
Dependencies: MAX31855 MCP23S18 MCP3202 MCP3208 MCP482x ShiftRegister1
Fork of elixys by
Diff: elixys.cpp
- Revision:
- 1:b0f7c49b67f8
- Parent:
- 0:542583a6f6bb
- Child:
- 3:1b20a56e4457
--- a/elixys.cpp Wed Oct 30 18:17:06 2013 +0000 +++ b/elixys.cpp Sun Dec 15 02:43:07 2013 +0000 @@ -1,6 +1,305 @@ #include "elixys.h" namespace Elixys { + // SPI Communication Bus SPI spibus(P0_9,P0_8,P0_7); + + // Fan Subsystem + PwmOut fan1(P2_4); + PwmOut fan2(P2_5); + DigitalOut fan0(P2_8); + DigitalOut misc0(P0_19); + + // Heater Subsystem + unsigned int heater_state; + mcp23s18 htriomux(spibus, selectheater, unselect); + + void setup_heater() { + htriomux.initialize(); + htriomux.set_all_output(); + heater_state = ALLHEATERSOFF; + } + + void turn_on_heater(unsigned int pins) { + heater_state &= ~(pins); + htriomux.write_port(heater_state); + } + + void turn_off_heater(unsigned int pins) { + heater_state |= (pins); + htriomux.write_port(heater_state); + } + + // Mixer Subsystem + PwmOut mtr0(P2_0); + PwmOut mtr1(P2_1); + PwmOut mtr2(P2_2); + PwmOut mtr3(P2_3); + + // SMCInteface Subsystem + MCP3202 smcadc(spibus, selectsmcadc, unselect); + MCP482X smcdac(spibus, selectsmcdac, unselect); + + // Thermocouple Interface + max31855 tcintf0(spibus, selecttc0, unselect); + max31855 tcintf1(spibus, selecttc1, unselect); + max31855 tcintf2(spibus, selecttc2, unselect); + max31855 tcintf3(spibus, selecttc3, unselect); + max31855 tcintf4(spibus, selecttc4, unselect); + max31855 tcintf5(spibus, selecttc5, unselect); + max31855 tcintf6(spibus, selecttc6, unselect); + max31855 tcintf7(spibus, selecttc7, unselect); + max31855 tcintf8(spibus, selecttc8, unselect); + + + // Valve Subsystem + DigitalOut valvrst(P2_7); + + mcp23s18 val0iomux(spibus, selectvalve0, unselect); + mcp23s18 val1iomux(spibus, selectvalve1, unselect); + mcp23s18 val2iomux(spibus, selectvalve2, unselect); + + void setup_valves() { + valvrst = 0; + valvrst = 1; + val0iomux.initialize(); + val1iomux.initialize(); + val2iomux.initialize(); + + val0iomux.set_all_output(); + val1iomux.set_all_output(); + val2iomux.set_all_output(); + + val0iomux.write_port(0); + val1iomux.write_port(0); + val2iomux.write_port(0); + } + + void set_valves(int id, int value) { + if(id == 0) { + val0iomux.write_port(value); + } else if(id == 1) { + val1iomux.write_port(value); + } else if(id == 2) { + val2iomux.write_port(value); + } + } + + + // Position Sensors Subsystem + mcp23s18 posiomux(spibus, selectpos, unselect); + DigitalOut posrst(P2_12); + + void setup_position_sensors() { + posrst = 0; + posrst = 1; + posiomux.initialize(); + posiomux.set_none_pullups(); + posiomux.set_all_input(); + } + + unsigned int read_poisition_sensors() { + return posiomux.read_port(); + } + + // Liquid Sensor Subsystem + mcp3208 liqadc(spibus, selectliq, unselect); + + void setup_elixys() { + setup_heater(); + setup_valves(); + setup_position_sensors(); + } + +#ifdef SYSTEMTEST + // System Tests + void fan_test() { + + fan1 = 1.0; + fan2 = 1.0; + fan0 = 1; + misc0 = 1; + + for(int i=0;i<5;i++) { + printf("FANTEST:%d\r\n", i); + for(float val=0.05;val<1.0;val=val+0.1) { + printf("FANVALUE:%f\r\n",val); + fan1 = val; + fan2 = val; + fan0 = !fan0; + misc0 = !misc0; + wait(0.05); + } + } + fan0 = 0; + misc0 = 0; + fan1 = 0.0; + fan2 = 0.0; + } + + void heater_test() { + setup_heater(); + printf("HEATERTEST\r\n"); + turn_on_heater(HEATER0); + wait(0.1); + turn_off_heater(HEATER0); + turn_on_heater(HEATER1); + wait(0.1); + turn_off_heater(HEATER1); + turn_on_heater(HEATER2); + wait(0.1); + turn_off_heater(HEATER2); + turn_on_heater(HEATER3); + wait(0.1); + turn_off_heater(HEATER3); + turn_on_heater(HEATER4); + wait(0.1); + turn_off_heater(HEATER4); + turn_on_heater(HEATER5); + wait(0.1); + turn_off_heater(HEATER5); + turn_on_heater(HEATER6); + wait(0.1); + turn_off_heater(HEATER6); + turn_on_heater(HEATER7); + wait(0.1); + turn_off_heater(HEATER7); + turn_on_heater(HEATER8); + wait(0.1); + turn_off_heater(HEATER8); + turn_on_heater(HTRLED0); + wait(0.1); + turn_off_heater(HTRLED0); + turn_on_heater(HTRLED1); + wait(0.1); + turn_off_heater(HTRLED2); + turn_on_heater(VAC); + wait(0.1); + turn_off_heater(VAC); + } + + void mixer_test() { + mtr0 = 1.0; + mtr1 = 1.0; + mtr2 = 1.0; + mtr3 = 1.0; + + for(int i=0;i<5;i++) { + printf("MIXERSTEST:%d\r\n", i); + for(float val=0.1;val<1.1;val=val+0.1) { + printf("MIXERVALUE:%f\r\n", val); + wait(0.05); + mtr0 = val; + mtr1 = val; + mtr2 = val; + mtr3 = val; + } + } + + mtr0 = 0.0; + mtr1 = 0.0; + mtr2 = 0.0; + mtr3 = 0.0; + } + + void smcadc_test() { + printf("SMCADCs|ADC0:0x%x,ADC1:0x%x\r\n", smcadc.readA(), smcadc.readB()); + } + + void smcdac_test() { + int ret; + smcdac.setGainA(2); + smcdac.setGainB(2); + for(int i = 0; i < 1024; i=i+16) { + ret = smcdac.writeA(i); + ret = smcdac.writeB(i); + wait(0.01); + printf("SMCDAC%d|ret%d\r\n", i, ret); + } + } + + int tc_test() { + float fvalue[9]; + fvalue[0] = tcintf0.read_temp(); + fvalue[1] = tcintf1.read_temp(); + fvalue[2] = tcintf2.read_temp(); + fvalue[3] = tcintf3.read_temp(); + fvalue[4] = tcintf4.read_temp(); + fvalue[5] = tcintf5.read_temp(); + fvalue[6] = tcintf6.read_temp(); + fvalue[7] = tcintf7.read_temp(); + fvalue[8] = tcintf8.read_temp(); + + stringstream res("THERMOCOUPLES|"); + for(int idx=0;idx<9;idx++) { + if (fvalue[idx] > 2000){ + if(fvalue[idx]==2001){ + res << "NoTC,"; + }else if(fvalue[idx]==2002){ + res << "ShrtGnd,"; + }else if(fvalue[idx]==2004){ + res << "ShrtVCC,"; + } + }else{ + res << fvalue[idx] << ","; + } + } + res << "\r\n"; + printf(res.str().c_str()); + return 0; + } + + void valve_test() { + setup_valves(); + for(int i=0;i<16;i++) { + printf("VALVEID:%d\r\n",i); + set_valves(0,(1<<i)); + set_valves(1,(1<<i)); + set_valves(2,(1<<i)); + wait(0.1); + } + + set_valves(0,0xFFFF); + set_valves(1,0xFFFF); + set_valves(2,0xFFFF); + printf("VALVES:AllOn\r\n"); + wait(0.1); + set_valves(0,0x0000); + set_valves(1,0x0000); + set_valves(2,0x0000); + printf("VALVESAllOff\r\n"); + wait(0.1); + } + + void position_sensor_test() { + printf("POSITIONSTATE:0x%x\r\n", posiomux.read_port()); + } + + void liquid_sensors_test() { + printf("LIQUIDSENSORS|ADC0:0x%x,ADC1:0x%x,ADC2:0x%x," + "ADC3:0x%x,ADC4:0x%x,ADC5:0x%x," + "ADC6:0x%x,ADC7:0x%x\r\n", + liqadc.read0(), + liqadc.read1(), + liqadc.read2(), + liqadc.read3(), + liqadc.read4(), + liqadc.read5(), + liqadc.read6(), + liqadc.read7()); + } + + void run_test() { + valve_test(); + tc_test(); + heater_test(); + mixer_test(); + fan_test(); + smcadc_test(); + smcdac_test(); + position_sensor_test(); + liquid_sensors_test(); + } +#endif }