Rev 2282 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 2282 | Rev 2283 | ||
|---|---|---|---|
| Line 37... | Line 37... | ||
| 37 | PidType pid; |
37 | PidType pid; |
| 38 | 38 | ||
| 39 | //struct PID_DATA pidData; |
39 | //struct PID_DATA pidData; |
| 40 | //struct PIDv1_DEBUG_DATA pidDebugData; |
40 | //struct PIDv1_DEBUG_DATA pidDebugData; |
| 41 | 41 | ||
| 42 | uint8_t sensorModuleType, sensorModuleId,sensorId; |
42 | uint8_t sensorModuleType, sensorModuleId,sensorId, sensorReportIntervall; |
| 43 | uint8_t PID_Status; |
43 | uint8_t PID_Status; |
| 44 | uint8_t sendDebug_flag = 0; |
44 | uint8_t sendDebug_flag = 0; |
| 45 | uint16_t pwmValue=0; |
45 | uint16_t pwmValue=0; |
| 46 | float referenceValue, measurementValue, outputValue; |
46 | float referenceValue, measurementValue, outputValue; |
| 47 | 47 | ||
| Line 70... | Line 70... | ||
| 70 | txMsg.Length = 8; |
70 | txMsg.Length = 8; |
| 71 | txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8); |
71 | txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8); |
| 72 | txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)(measurementValue*64)); |
72 | txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)(measurementValue*64)); |
| 73 | txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
73 | txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
| 74 | txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)(referenceValue*64)); |
74 | txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)(referenceValue*64)); |
| 75 | //uint16_t tempPWM =(uint16_t) (pwmValue*10000); |
- | |
| 76 | txMsg.Data[4] = (uint8_t)( ((uint16_t)outputValue)>>8)&0xff; |
75 | txMsg.Data[4] = (uint8_t)( ((uint16_t)outputValue)>>8)&0xff; |
| 77 | txMsg.Data[5] = (uint8_t)( ((uint16_t)outputValue))&0xff; |
76 | txMsg.Data[5] = (uint8_t)( ((uint16_t)outputValue))&0xff; |
| 78 | txMsg.Data[6] = ((int16_t) (PID_GetITerm(&pid))>>8)&0xff; |
77 | txMsg.Data[6] = ((int16_t) (PID_GetITerm(&pid))>>8)&0xff; |
| 79 | txMsg.Data[7] = ((int16_t) (PID_GetITerm(&pid)))&0xff; |
78 | txMsg.Data[7] = ((int16_t) (PID_GetITerm(&pid)))&0xff; |
| 80 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
79 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
| Line 185... | Line 184... | ||
| 185 | } |
184 | } |
| 186 | PID_SetOutputLimits(&pid, Min_out_f, Max_out_f); |
185 | PID_SetOutputLimits(&pid, Min_out_f, Max_out_f); |
| 187 | outputValue = DEFAULT_PWM_VALUE; |
186 | outputValue = DEFAULT_PWM_VALUE; |
| 188 | 187 | ||
| 189 | PID_SetMode(&pid, PID_Mode_Automatic); |
188 | PID_SetMode(&pid, PID_Mode_Automatic); |
| - | 189 | ||
| - | 190 | /* Send request for sensor report intervall */ |
|
| - | 191 | StdCan_Msg_t txMsg; |
|
| - | 192 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
|
| - | 193 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER); |
|
| - | 194 | txMsg.Header.ModuleType = sensorModuleType; |
|
| - | 195 | txMsg.Header.ModuleId = sensorModuleId; |
|
| - | 196 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL; |
|
| - | 197 | txMsg.Length = 0; |
|
| - | 198 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
|
| - | 199 | ||
| 190 | } |
200 | } |
| 191 | 201 | ||
| 192 | void act_PIDv1_Process(void) |
202 | void act_PIDv1_Process(void) |
| 193 | { |
203 | { |
| 194 | uint8_t newValueCalculated = PID_Compute(&pid); |
204 | uint8_t newValueCalculated = PID_Compute(&pid); |
| Line 274... | Line 284... | ||
| 274 | rxMsg->Data[0] = eeprom_read_byte(EEDATA.actuatorModuleType); |
284 | rxMsg->Data[0] = eeprom_read_byte(EEDATA.actuatorModuleType); |
| 275 | rxMsg->Data[1] = eeprom_read_byte(EEDATA.actuatorModuleId); |
285 | rxMsg->Data[1] = eeprom_read_byte(EEDATA.actuatorModuleId); |
| 276 | rxMsg->Data[2] = eeprom_read_byte(EEDATA.actuatorId); |
286 | rxMsg->Data[2] = eeprom_read_byte(EEDATA.actuatorId); |
| 277 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
287 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
| 278 | rxMsg->Length = 3; |
288 | rxMsg->Length = 3; |
| 279 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
289 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
| 280 | break; |
290 | break; |
| 281 | 291 | ||
| 282 | case CAN_MODULE_CMD_PID_CONFIG_PARAMETER_D_T: |
292 | case CAN_MODULE_CMD_PID_CONFIG_PARAMETER_D_T: |
| 283 | if (rxMsg->Length == 8) |
293 | if (rxMsg->Length == 8) |
| 284 | { |
294 | { |
| Line 290... | Line 300... | ||
| 290 | eeprom_write_byte_crc(EEDATA.ControllerDirection, ((rxMsg->Data[5]&0x80)>>7), WITHOUT_CRC); |
300 | eeprom_write_byte_crc(EEDATA.ControllerDirection, ((rxMsg->Data[5]&0x80)>>7), WITHOUT_CRC); |
| 291 | eeprom_write_word_crc(EEDATA16.Time, (uint16_t)rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC); |
301 | eeprom_write_word_crc(EEDATA16.Time, (uint16_t)rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC); |
| 292 | PID_SetTunings(&pid, PID_GetKp(&pid), PID_GetKi(&pid), *data); |
302 | PID_SetTunings(&pid, PID_GetKp(&pid), PID_GetKi(&pid), *data); |
| 293 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_S) { |
303 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_S) { |
| 294 | PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))*1000); |
304 | PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))*1000); |
| 295 | 305 | ||
| 296 | } else { |
306 | } else { |
| 297 | PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))); |
307 | PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))); |
| 298 | } |
308 | } |
| 299 | 309 | ||
| 300 | PID_SetControllerDirection(&pid, eeprom_read_byte(EEDATA.ControllerDirection)); |
310 | PID_SetControllerDirection(&pid, eeprom_read_byte(EEDATA.ControllerDirection)); |
| 301 | 311 | ||
| 302 | PID_Status = PID_ON; |
312 | PID_Status = PID_ON; |
| 303 | pwmValue = DEFAULT_PWM_VALUE; |
313 | pwmValue = DEFAULT_PWM_VALUE; |
| - | 314 | /* Send request for sensor report intervall */ |
|
| - | 315 | ||
| - | 316 | StdCan_Msg_t txMsg; |
|
| - | 317 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
|
| - | 318 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER); |
|
| - | 319 | txMsg.Header.ModuleType = sensorModuleType; |
|
| - | 320 | txMsg.Header.ModuleId = sensorModuleId; |
|
| - | 321 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL; |
|
| - | 322 | txMsg.Length = 0; |
|
| - | 323 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
|
| 304 | } |
324 | } |
| 305 | data2 = PID_GetKd(&pid); |
325 | data2 = PID_GetKd(&pid); |
| 306 | ptr = (uint8_t*)&data2; |
326 | ptr = (uint8_t*)&data2; |
| 307 | rxMsg->Data[0] = ptr[0]; |
327 | rxMsg->Data[0] = ptr[0]; |
| 308 | rxMsg->Data[1] = ptr[1]; |
328 | rxMsg->Data[1] = ptr[1]; |
| Line 311... | Line 331... | ||
| 311 | rxMsg->Data[4] = 0u; |
331 | rxMsg->Data[4] = 0u; |
| 312 | rxMsg->Data[5] = (0x80&(eeprom_read_byte(EEDATA.ControllerDirection))<<7); |
332 | rxMsg->Data[5] = (0x80&(eeprom_read_byte(EEDATA.ControllerDirection))<<7); |
| 313 | rxMsg->Data[6] = (0x7f&(eeprom_read_word(EEDATA16.Time)>>8)); |
333 | rxMsg->Data[6] = (0x7f&(eeprom_read_word(EEDATA16.Time)>>8)); |
| 314 | rxMsg->Data[7] = (0xff&(eeprom_read_word(EEDATA16.Time))); |
334 | rxMsg->Data[7] = (0xff&(eeprom_read_word(EEDATA16.Time))); |
| 315 | rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7); |
335 | rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7); |
| 316 | 336 | ||
| 317 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
337 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
| 318 | rxMsg->Length = 8; |
338 | rxMsg->Length = 8; |
| 319 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
339 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
| 320 | break; |
340 | break; |
| 321 | case CAN_MODULE_CMD_PID_CONFIG_PARAMETER_P_I: |
341 | case CAN_MODULE_CMD_PID_CONFIG_PARAMETER_P_I: |
| 322 | if (rxMsg->Length == 8) |
342 | if (rxMsg->Length == 8) |
| 323 | { |
343 | { |
| 324 | uint32_t* data_32; |
344 | uint32_t* data_32; |
| 325 | float* data = (float*)&rxMsg->Data[0]; |
345 | float* data = (float*)&rxMsg->Data[0]; |
| Line 387... | Line 407... | ||
| 387 | } |
407 | } |
| 388 | 408 | ||
| 389 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
409 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
| 390 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER && |
410 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_FROM_OWNER && |
| 391 | rxMsg->Header.ModuleType == sensorModuleType && |
411 | rxMsg->Header.ModuleType == sensorModuleType && |
| 392 |
|
412 | rxMsg->Header.ModuleId == sensorModuleId) |
| 393 | rxMsg->Header.Command == CAN_MODULE_CMD_PHYSICAL_TEMPERATURE_CELSIUS && |
- | |
| 394 | rxMsg->Data[0] == sensorId) |
- | |
| 395 | { |
413 | { |
| - | 414 | switch (rxMsg->Header.Command) |
|
| - | 415 | { |
|
| - | 416 | case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL: |
|
| - | 417 | sensorReportIntervall = rxMsg->Data[0]; |
|
| - | 418 | ||
| - | 419 | if (sensorReportIntervall*1000 > PID_GetSampleTime(&pid)) |
|
| - | 420 | { |
|
| - | 421 | uint8_t newReportTime = 20; |
|
| - | 422 | if (PID_GetSampleTime(&pid) < 2000) |
|
| - | 423 | { |
|
| - | 424 | newReportTime = 1; |
|
| - | 425 | } else if (PID_GetSampleTime(&pid) > 20000) |
|
| - | 426 | { |
|
| - | 427 | newReportTime = 20; |
|
| - | 428 | } else |
|
| - | 429 | { |
|
| - | 430 | newReportTime = (uint8_t)(PID_GetSampleTime(&pid)/1000) - 1; |
|
| - | 431 | } |
|
| - | 432 | StdCan_Msg_t txMsg; |
|
| - | 433 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
|
| - | 434 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER); |
|
| - | 435 | txMsg.Header.ModuleType = sensorModuleType; |
|
| - | 436 | txMsg.Header.ModuleId = sensorModuleId; |
|
| - | 437 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL; |
|
| - | 438 | txMsg.Length = 1; |
|
| - | 439 | txMsg.Data[0] = newReportTime; |
|
| - | 440 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
|
| - | 441 | } |
|
| - | 442 | ||
| - | 443 | ||
| - | 444 | break; |
|
| - | 445 | case CAN_MODULE_CMD_PHYSICAL_TEMPERATURE_CELSIUS: |
|
| - | 446 | if (rxMsg->Data[0] == sensorId) |
|
| - | 447 | { |
|
| 396 | if (0x80 == rxMsg->Data[1] && 0x00 == rxMsg->Data[2]) |
448 | if (0x80 == rxMsg->Data[1] && 0x00 == rxMsg->Data[2]) |
| 397 | { |
449 | { |
| 398 | //Error on the temperature signal, do something |
450 | //Error on the temperature signal, do something |
| 399 | } |
451 | } |
| 400 | else |
452 | else |
| 401 | { |
453 | { |
| 402 | measurementValue = ((float)((rxMsg->Data[1]<<8) + rxMsg->Data[2]))/64; |
454 | measurementValue = ((float)((rxMsg->Data[1]<<8) + rxMsg->Data[2]))/64; |
| - | 455 | } |
|
| 403 | } |
456 | } |
| - | 457 | break; |
|
| 404 | 458 | ||
| - | 459 | } |
|
| 405 | } |
460 | } |
| 406 | } |
461 | } |
| 407 | 462 | ||
| 408 | void act_PIDv1_List(uint8_t ModuleSequenceNumber) |
463 | void act_PIDv1_List(uint8_t ModuleSequenceNumber) |
| 409 | { |
464 | { |