Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TextLCD.h"
00003 // included in libmbed rev14
00004 #include "CAN.h"
00005 
00006 //enable additional serial debug messages
00007 //#define DEBUG_CAN_TX 1
00008 #define DEBUG_IR_RAW 1
00009 
00010 AnalogIn ain(p20);
00011 DigitalOut led1(LED1);
00012 DigitalOut led2(LED2);
00013 DigitalOut led3(LED3);
00014 DigitalOut led4(LED4);
00015 TextLCD lcd(p14, p15, p16, p17, p18, p19, p21, 8);
00016 
00017 Ticker TickerSerialTx;
00018 Ticker TickerLcdUpdate;
00019 Ticker TickerCanTx;
00020 
00021 // conversion from IR sensor input voltage to nominal gas value
00022 #define CAN_GAS_MAX  4000
00023 #define CAN_GAS_MIN  700
00024 #define IR_MIN  0.28
00025 #define IR_MAX  0.76
00026 // 0.12 - 0.13   idle   update: seen 0.02 ..
00027 // 0.76          max
00028 
00029 // CAN defines
00030 #define CAN_ID_EGAS_CTRL   0x700
00031 #define CAN_DLC_EGAS_CTRL  1
00032 #define CAN_ID_EGAS_NOMINAL_VALUE   0x701
00033 #define CAN_DLC_EGAS_NOMINAL_VALUE  2
00034 #define CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE  1
00035 #define CAN_BYTE_LOW_EGAS_NOMINAL_VALUE   0
00036 
00037 // CAN_RS pin at Philips PCA82C250 can bus controller.
00038 // activate transceiver by pulling this pin to GND.
00039 // (Rise and fall slope controlled by resistor R_s)
00040 // (+5V result in tranceiver standby mode)
00041 // For further information see datasheet page 4
00042 DigitalOut can_Pca82c250SlopePin(p28);
00043 // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD).
00044 CAN can2(p30, p29);
00045 
00046 // value which will be sent via can
00047 unsigned short u16_CanGasNominal = CAN_GAS_MIN;
00048 // IR sensor value
00049 float f_IrDistance = 0.0;
00050 // 2 can objects for TX
00051 CANMessage can_MsgTx_EgasCtrl;
00052 CANMessage can_MsgTx_EgasNominalValue;
00053 
00054 
00055 void CanSendEgas() {
00056     // idle
00057     if ( (f_IrDistance > IR_MAX) || (f_IrDistance < IR_MIN) ) {
00058         u16_CanGasNominal = CAN_GAS_MIN;
00059     }
00060     // valid input range
00061     else {
00062         u16_CanGasNominal = (unsigned short)( (((CAN_GAS_MAX-CAN_GAS_MIN)*(f_IrDistance-IR_MIN))/(IR_MAX-IR_MIN))+CAN_GAS_MIN );
00063     }
00064     // debug
00065     //printf("u16_CanGasNominal: %d\n\r", u16_CanGasNominal);
00066 
00067     if (can2.write(can_MsgTx_EgasCtrl)) {
00068 #ifdef DEBUG_CAN_TX
00069         printf("CanTx--> id: 0x%x  dlc: %d  data: ", can_MsgTx_EgasCtrl.id, can_MsgTx_EgasCtrl.len);
00070         for (char i=0; i<can_MsgTx_EgasCtrl.len; i++) {
00071             printf("%x ", can_MsgTx_EgasCtrl.data[i]);
00072         }
00073         printf("\n\r");
00074 #endif
00075     }
00076 
00077     can_MsgTx_EgasNominalValue.data[CAN_BYTE_LOW_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal);
00078     can_MsgTx_EgasNominalValue.data[CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal>>8);
00079     if (can2.write(can_MsgTx_EgasNominalValue)) {
00080 #ifdef DEBUG_CAN_TX
00081         printf("CanTx--> id: 0x%x  dlc: %d  data: ", can_MsgTx_EgasNominalValue.id, can_MsgTx_EgasNominalValue.len);
00082         for (char i=0; i<can_MsgTx_EgasNominalValue.len; i++) {
00083             printf("%x ", can_MsgTx_EgasNominalValue.data[i]);
00084         }
00085         printf("\n\r");
00086 #endif
00087     }
00088 
00089 }
00090 
00091 void SerialSendIrDistance() {
00092     printf("f_IrDistance: %f\r\n", f_IrDistance);
00093 }
00094 
00095 void LcdPrintIrDistance() {
00096     lcd.printf("IrDist: %f", f_IrDistance);
00097 }
00098 
00099 int main() {
00100     // 500kbit/s
00101     can2.frequency(500000);
00102     // activate external can transceiver
00103     can_Pca82c250SlopePin = 0;
00104     // init everything
00105     can_MsgTx_EgasCtrl.id = CAN_ID_EGAS_CTRL;
00106     can_MsgTx_EgasCtrl.len = CAN_DLC_EGAS_CTRL;
00107     can_MsgTx_EgasCtrl.data[0] = 1;
00108     can_MsgTx_EgasNominalValue.data[CAN_BYTE_LOW_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal);
00109     can_MsgTx_EgasNominalValue.data[CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal>>8);
00110     can_MsgTx_EgasNominalValue.id = CAN_ID_EGAS_NOMINAL_VALUE;
00111     can_MsgTx_EgasNominalValue.len = CAN_DLC_EGAS_NOMINAL_VALUE;
00112 
00113 #ifdef DEBUG_IR_RAW
00114     TickerSerialTx.attach(&SerialSendIrDistance, 0.35);
00115 #endif
00116     TickerLcdUpdate.attach(&LcdPrintIrDistance, 0.75);
00117     TickerCanTx.attach(&CanSendEgas, 0.1);
00118 
00119     while (1) {
00120         // get new distance from sensor
00121         f_IrDistance = ain.read();
00122 
00123         // show distance with the 4 leds
00124         led1 = (f_IrDistance > 0.11) ? 1 : 0;
00125         led2 = (f_IrDistance > 0.30) ? 1 : 0;
00126         led3 = (f_IrDistance > 0.47) ? 1 : 0;
00127         led4 = (f_IrDistance > 0.74) ? 1 : 0;
00128     }
00129 }
00130 
00131 // TODO: no global variables