![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Fri Jul 15 2022 01:16:10 by
![doxygen](doxygen.png)