Rev 2263 | Rev 2269 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 2263 | Rev 2264 | ||
|---|---|---|---|
| Line 38... | Line 38... | ||
| 38 | uint8_t sensorModuleType, sensorModuleId,sensorId; |
38 | uint8_t sensorModuleType, sensorModuleId,sensorId; |
| 39 | uint8_t PID_Status; |
39 | uint8_t PID_Status; |
| 40 | uint8_t calculatePID_flag,sendPID_flag = 0; |
40 | uint8_t calculatePID_flag,sendPID_flag = 0; |
| 41 | uint16_t pwmValue=0; |
41 | uint16_t pwmValue=0; |
| 42 | float referenceValue, measurementValue, outputValue; |
42 | float referenceValue, measurementValue, outputValue; |
| 43 | - | ||
| 44 | void calculatePID(void) { |
- | |
| 45 | if (PID_Status == PID_OFF){ |
- | |
| 46 | ;// use current PWMvalue |
- | |
| 47 | } else { |
- | |
| 48 | //printf("PWM: %d\n",pwmValue); |
- | |
| 49 | uint16_t tempPwm = pwmValue; |
- | |
| 50 | //tempPwm += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
- | |
| 51 | //printf("InOut: ref: %d, meas: %d\n",(int16_t) (referenceValue*10), (int16_t) (measurementValue*10)); |
- | |
| 52 | //printf("PWM: %d\n",pwmValue); |
- | |
| 53 | - | ||
| 54 | if (tempPwm < MIN_PWM_VALUE) { |
- | |
| 55 | tempPwm = MIN_PWM_VALUE; |
- | |
| 56 | } |
- | |
| 57 | else if (tempPwm > MAX_PWM_VALUE) { |
- | |
| 58 | tempPwm = MAX_PWM_VALUE-1; |
- | |
| 59 | } |
- | |
| 60 | cli(); |
- | |
| 61 | pwmValue = tempPwm; |
- | |
| 62 | sei(); |
- | |
| 63 | //printf("PWM: %d\n",pwmValue); |
- | |
| 64 | //send current PWM value as soon as possible |
- | |
| 65 | sendPID_flag=1; |
- | |
| 66 | } |
- | |
| 67 | - | ||
| 68 | } |
- | |
| 69 | - | ||
| 70 | - | ||
| 71 | void calculatePID_callback(uint8_t timer) |
- | |
| 72 | { |
- | |
| 73 | - | ||
| 74 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_S) { |
- | |
| 75 | static uint8_t seconds = 0; |
- | |
| 76 | seconds++; |
- | |
| 77 | if (seconds >= eeprom_read_word(EEDATA16.Time)) |
- | |
| 78 | { |
- | |
| 79 | seconds = 0; |
- | |
| 80 | calculatePID_flag = 1; |
- | |
| 81 | } |
- | |
| 82 | } else { |
- | |
| 83 | calculatePID_flag = 1; |
- | |
| 84 | } |
- | |
| 85 | } |
- | |
| 86 | 43 | ||
| 87 | void sendPID(void) |
44 | void sendPID(void) |
| 88 | { |
45 | { |
| 89 | if (eeprom_read_byte(EEDATA.actuatorModuleType) != 0) { |
46 | if (eeprom_read_byte(EEDATA.actuatorModuleType) != 0) { |
| 90 | StdCan_Msg_t txMsg; |
47 | StdCan_Msg_t txMsg; |
| Line 110... | Line 67... | ||
| 110 | txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8); |
67 | txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8); |
| 111 | txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)(measurementValue*64)); |
68 | txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)(measurementValue*64)); |
| 112 | txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
69 | txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
| 113 | txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)(referenceValue*64)); |
70 | txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)(referenceValue*64)); |
| 114 | //uint16_t tempPWM =(uint16_t) (pwmValue*10000); |
71 | //uint16_t tempPWM =(uint16_t) (pwmValue*10000); |
| 115 | txMsg.Data[4] = ( ((uint16_t)outputValue)>>8)&0xff; |
72 | txMsg.Data[4] = (uint8_t)( ((uint16_t)outputValue)>>8)&0xff; |
| 116 | txMsg.Data[5] = ( ((uint16_t)outputValue))&0xff; |
73 | txMsg.Data[5] = (uint8_t)( ((uint16_t)outputValue))&0xff; |
| 117 | txMsg.Data[6] = ((int16_t) (PID_GetITerm(&pid))>>8)&0xff; |
74 | txMsg.Data[6] = ((int16_t) (PID_GetITerm(&pid))>>8)&0xff; |
| 118 | txMsg.Data[7] = ((int16_t) (PID_GetITerm(&pid)))&0xff; |
75 | txMsg.Data[7] = ((int16_t) (PID_GetITerm(&pid)))&0xff; |
| 119 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
76 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
| 120 | } |
77 | } |
| 121 | 78 | ||
| Line 157... | Line 114... | ||
| 157 | { //The CRC of the EEPROM is not correct, store default values and update CRC |
114 | { //The CRC of the EEPROM is not correct, store default values and update CRC |
| 158 | eeprom_write_dword_crc(EEDATA32.referenceValue, 20.0, WITHOUT_CRC); |
115 | eeprom_write_dword_crc(EEDATA32.referenceValue, 20.0, WITHOUT_CRC); |
| 159 | eeprom_write_byte_crc(EEDATA.sensorModuleType, PIDv1_TEMPERATURE_SENSOR_MODULE_TYPE, WITHOUT_CRC); |
116 | eeprom_write_byte_crc(EEDATA.sensorModuleType, PIDv1_TEMPERATURE_SENSOR_MODULE_TYPE, WITHOUT_CRC); |
| 160 | eeprom_write_byte_crc(EEDATA.sensorModuleId, PIDv1_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC); |
117 | eeprom_write_byte_crc(EEDATA.sensorModuleId, PIDv1_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC); |
| 161 | eeprom_write_byte_crc(EEDATA.sensorId, PIDv1_TEMPERATURE_SENSOR, WITHOUT_CRC); |
118 | eeprom_write_byte_crc(EEDATA.sensorId, PIDv1_TEMPERATURE_SENSOR, WITHOUT_CRC); |
| 162 | eeprom_write_dword_crc(EEDATA32.K_P, |
119 | eeprom_write_dword_crc(EEDATA32.K_P, 850.0, WITHOUT_CRC); |
| 163 | eeprom_write_dword_crc(EEDATA32.K_I, |
120 | eeprom_write_dword_crc(EEDATA32.K_I, 0.5, WITHOUT_CRC); |
| 164 | eeprom_write_dword_crc(EEDATA32.K_D, |
121 | eeprom_write_dword_crc(EEDATA32.K_D, 0.1, WITHOUT_CRC); |
| 165 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, DEFAULT_PIDv1_CALC_PERIOD_UNIT, WITHOUT_CRC); |
122 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, DEFAULT_PIDv1_CALC_PERIOD_UNIT, WITHOUT_CRC); |
| 166 | eeprom_write_word_crc(EEDATA16.Time, DEFAULT_PIDv1_CALC_PERIOD, WITHOUT_CRC); |
123 | eeprom_write_word_crc(EEDATA16.Time, DEFAULT_PIDv1_CALC_PERIOD, WITHOUT_CRC); |
| 167 | eeprom_write_byte_crc(EEDATA.actuatorModuleType, PIDv1_PWM_ACTUATOR_MODULE_TYPE, WITHOUT_CRC); |
124 | eeprom_write_byte_crc(EEDATA.actuatorModuleType, PIDv1_PWM_ACTUATOR_MODULE_TYPE, WITHOUT_CRC); |
| 168 | eeprom_write_byte_crc(EEDATA.actuatorModuleId, PIDv1_PWM_ACTUATOR_MODULE_ID, WITHOUT_CRC); |
125 | eeprom_write_byte_crc(EEDATA.actuatorModuleId, PIDv1_PWM_ACTUATOR_MODULE_ID, WITHOUT_CRC); |
| 169 | eeprom_write_byte_crc(EEDATA.actuatorId, PIDv1_PWM_ACTUATOR, WITHOUT_CRC); |
126 | eeprom_write_byte_crc(EEDATA.actuatorId, PIDv1_PWM_ACTUATOR, WITHOUT_CRC); |
| Line 308... | Line 265... | ||
| 308 | eeprom_write_word_crc(EEDATA16.K_I, (uint16_t)rxMsg->Data[3]+(rxMsg->Data[2]<<8), WITHOUT_CRC); |
265 | eeprom_write_word_crc(EEDATA16.K_I, (uint16_t)rxMsg->Data[3]+(rxMsg->Data[2]<<8), WITHOUT_CRC); |
| 309 | eeprom_write_word_crc(EEDATA16.K_D, (uint16_t)rxMsg->Data[5]+(rxMsg->Data[4]<<8), WITHOUT_CRC); |
266 | eeprom_write_word_crc(EEDATA16.K_D, (uint16_t)rxMsg->Data[5]+(rxMsg->Data[4]<<8), WITHOUT_CRC); |
| 310 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, ((rxMsg->Data[6]&0x80)>>7), WITHOUT_CRC); |
267 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, ((rxMsg->Data[6]&0x80)>>7), WITHOUT_CRC); |
| 311 | eeprom_write_word_crc(EEDATA16.Time, (uint16_t)rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC); |
268 | eeprom_write_word_crc(EEDATA16.Time, (uint16_t)rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC); |
| 312 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == 0) { |
269 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == 0) { |
| 313 | Timer_SetTimeout |
270 | //Timer_SetTimeout(act_PIDv1_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback); |
| 314 | } else { |
271 | } else { |
| 315 | Timer_SetTimeout |
272 | //Timer_SetTimeout(act_PIDv1_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback); |
| 316 | } |
273 | } |
| 317 | 274 | ||
| 318 | //pid_Init((float) eeprom_read_word(EEDATA16.K_P)/64 * SCALING_FACTOR, (float) eeprom_read_word(EEDATA16.K_I)/64 * SCALING_FACTOR , (float) eeprom_read_word(EEDATA16.K_D)/64 * SCALING_FACTOR , &pidData); |
275 | //pid_Init((float) eeprom_read_word(EEDATA16.K_P)/64 * SCALING_FACTOR, (float) eeprom_read_word(EEDATA16.K_I)/64 * SCALING_FACTOR , (float) eeprom_read_word(EEDATA16.K_D)/64 * SCALING_FACTOR , &pidData); |
| 319 | //pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
276 | //pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
| 320 | PID_Status = PID_ON; |
277 | PID_Status = PID_ON; |