Rev 1178 | Rev 1379 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1178 | Rev 1366 | ||
|---|---|---|---|
| Line 21... | Line 21... | ||
| 21 | struct eeprom_act_PID EEMEM eeprom_act_PID = |
21 | struct eeprom_act_PID EEMEM eeprom_act_PID = |
| 22 | { |
22 | { |
| 23 | { |
23 | { |
| 24 | ///TODO: Define initialization values on the EEPROM variables here, this will generate a *.eep file that can be used to store this values to the node, can in future be done with a EEPROM module and the make-scrips. Write the values in the exact same order as the struct is defined in the *.h file. |
24 | ///TODO: Define initialization values on the EEPROM variables here, this will generate a *.eep file that can be used to store this values to the node, can in future be done with a EEPROM module and the make-scrips. Write the values in the exact same order as the struct is defined in the *.h file. |
| 25 | 0x0200, // referenceValue |
25 | 0x0200, // referenceValue |
| 26 |
|
26 | CAN_MODULE_TYPE_SNS_DS18X20, //SensorModuleType |
| 27 | 0x00, //SensorModuleId |
27 | 0x00, //SensorModuleId |
| 28 | 0x00 |
28 | 0x00, //SensorId |
| - | 29 | 0x0000, //uint16_t K_P; |
|
| - | 30 | 0x0000, //uint16_t K_I; |
|
| - | 31 | 0x0000, //uint16_t K_D; |
|
| - | 32 | 0x00, //uint8_t TimeMsOrS; |
|
| - | 33 | 0x0000, //uint16_t Time; |
|
| - | 34 | CAN_MODULE_TYPE_ACT_SOFTPWM, //ActuatorModuleType |
|
| - | 35 | 0x00, //ActuatorModuleId |
|
| - | 36 | 0x00, //ActuatorId |
|
| - | 37 | 10, //SendPeriod |
|
| - | 38 | ||
| 29 | }, |
39 | }, |
| 30 | 0 // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts |
40 | 0 // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts |
| 31 | }; |
41 | }; |
| 32 | 42 | ||
| 33 | void calculatePID(void) { |
43 | void calculatePID(void) { |
| 34 | if (PID_Status == PID_OFF){ |
44 | if (PID_Status == PID_OFF){ |
| 35 | ;// use current PWMvalue |
45 | ;// use current PWMvalue |
| 36 | } else { |
46 | } else { |
| 37 | pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
47 | pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
| 38 | - | ||
| - | 48 | printf("InOut: ref: %d, meas: %d\n",(int16_t) (referenceValue*10), (int16_t) (measurementValue*10)); |
|
| 39 | if (pwmValue < MIN_PWM_VALUE) { |
49 | if (pwmValue < MIN_PWM_VALUE) { |
| 40 | pwmValue = MIN_PWM_VALUE; |
50 | pwmValue = MIN_PWM_VALUE; |
| 41 | } |
51 | } |
| 42 | else if (pwmValue > MAX_PWM_VALUE) { |
52 | else if (pwmValue > MAX_PWM_VALUE) { |
| 43 | pwmValue = MAX_PWM_VALUE-1; |
53 | pwmValue = MAX_PWM_VALUE-1; |
| 44 | } |
54 | } |
| 45 | //send current PWM value as soon as possible |
55 | //send current PWM value as soon as possible |
| 46 | sendPID_flag=1; |
56 | sendPID_flag=1; |
| 47 | } |
57 | } |
| - | 58 | printf("PWM: %d\n",pwmValue); |
|
| 48 | } |
59 | } |
| 49 | 60 | ||
| 50 | 61 | ||
| 51 | void calculatePID_callback(uint8_t timer) |
62 | void calculatePID_callback(uint8_t timer) |
| 52 | { |
63 | { |
| - | 64 | ||
| 53 | |
65 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) { |
| 54 | static uint8_t seconds = 0; |
66 | static uint8_t seconds = 0; |
| 55 | seconds++; |
67 | seconds++; |
| 56 | if |
68 | if (seconds >= eeprom_read_word(EEDATA16.Time)) |
| 57 | { |
69 | { |
| 58 | seconds = 0; |
70 | seconds = 0; |
| 59 | calculatePID_flag = 1; |
71 | calculatePID_flag = 1; |
| 60 | } |
72 | } |
| 61 |
|
73 | } else { |
| 62 | calculatePID_flag = 1; |
74 | calculatePID_flag = 1; |
| 63 |
|
75 | } |
| 64 | } |
76 | } |
| 65 | 77 | ||
| 66 | void sendPID(void) |
78 | void sendPID(void) |
| 67 | { |
79 | { |
| - | 80 | if (eeprom_read_byte(EEDATA.actuatorModuleType) != 0) { |
|
| 68 | StdCan_Msg_t txMsg; |
81 | StdCan_Msg_t txMsg; |
| 69 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type |
82 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type |
| 70 | StdCan_Set_direction(txMsg.Header, |
83 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER); |
| 71 | txMsg |
84 | txMsg.Header.ModuleType = eeprom_read_byte(EEDATA.actuatorModuleType); ///TODO: Change this to the actual module type |
| 72 | txMsg |
85 | txMsg.Header.ModuleId = eeprom_read_byte(EEDATA.actuatorModuleId); |
| 73 | txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PWM; |
86 | txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PWM; |
| 74 | txMsg.Length = 3; |
87 | txMsg.Length = 3; |
| 75 | txMsg |
88 | txMsg.Data[0] = eeprom_read_byte(EEDATA.actuatorId); |
| - | 89 | int16_t tempPWM =(int16_t) (((int32_t)pwmValue)*64/100); |
|
| 76 | txMsg.Data[1] = |
90 | txMsg.Data[1] = ( (tempPWM)>>8)&0xff; |
| 77 | txMsg.Data[2] = |
91 | txMsg.Data[2] = ( (tempPWM))&0xff; |
| - | 92 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
|
| 78 | 93 | } |
|
| 79 |
|
94 | StdCan_Msg_t txMsg; |
| - | 95 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type |
|
| - | 96 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
|
| - | 97 | txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_PID; ///TODO: Change this to the actual module type |
|
| - | 98 | txMsg.Header.ModuleId = act_PID_ID; |
|
| - | 99 | txMsg.Header.Command = CAN_MODULE_CMD_PID_PID_STATUS; |
|
| - | 100 | txMsg.Length = 8; |
|
| - | 101 | txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8); |
|
| - | 102 | txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)measurementValue*64); |
|
| - | 103 | txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
|
| - | 104 | txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64); |
|
| - | 105 | int16_t tempPWM =(int16_t) (((int32_t)pwmValue)*64/100); |
|
| - | 106 | txMsg.Data[4] = ( (tempPWM)>>8)&0xff; |
|
| - | 107 | txMsg.Data[5] = ( (tempPWM))&0xff; |
|
| - | 108 | txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff; |
|
| - | 109 | txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff; |
|
| - | 110 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
|
| 80 | } |
111 | } |
| 81 | 112 | ||
| 82 | void sendPID_callback(uint8_t timer) { |
113 | void sendPID_callback(uint8_t timer) { |
| 83 | sendPID_flag=1; |
114 | sendPID_flag=1; |
| 84 | } |
115 | } |
| Line 100... | Line 131... | ||
| 100 | txMsg.Data[3] = ((int16_t) (pidDebugData.I_term))&0xff; |
131 | txMsg.Data[3] = ((int16_t) (pidDebugData.I_term))&0xff; |
| 101 | txMsg.Data[4] = ((int16_t) (pidDebugData.D_term)>>8)&0xff; |
132 | txMsg.Data[4] = ((int16_t) (pidDebugData.D_term)>>8)&0xff; |
| 102 | txMsg.Data[5] = ((int16_t) (pidDebugData.D_term))&0xff; |
133 | txMsg.Data[5] = ((int16_t) (pidDebugData.D_term))&0xff; |
| 103 | txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff; |
134 | txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff; |
| 104 | txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff; |
135 | txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff; |
| 105 | StdCan_Put |
136 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
| - | 137 | printf("PID: P:%d, I:%d, D:%d, S:%d\n",(int16_t)pidDebugData.P_term,(int16_t)pidDebugData.I_term,(int16_t)pidDebugData.D_term,(int16_t)pidDebugData.Sum); |
|
| 106 | } |
138 | } |
| 107 | #endif |
139 | #endif |
| 108 | 140 | ||
| 109 | void act_PID_Init(void) |
141 | void act_PID_Init(void) |
| 110 | { |
142 | { |
| 111 | if (EEDATA_OK) |
143 | if (EEDATA_OK) |
| 112 | { |
144 | { |
| 113 | } else |
145 | } else |
| 114 | { //The CRC of the EEPROM is not correct, store default values and update CRC |
146 | { //The CRC of the EEPROM is not correct, store default values and update CRC |
| 115 | eeprom_write_word_crc(EEDATA16.referenceValue, |
147 | eeprom_write_word_crc(EEDATA16.referenceValue, 0x0520, WITHOUT_CRC); |
| 116 | eeprom_write_byte_crc(EEDATA.sensorModuleType, PID_TEMPERATURE_SENSOR_MODULE_TYPE, WITHOUT_CRC); |
148 | eeprom_write_byte_crc(EEDATA.sensorModuleType, PID_TEMPERATURE_SENSOR_MODULE_TYPE, WITHOUT_CRC); |
| 117 | eeprom_write_byte_crc(EEDATA.sensorModuleId, PID_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC); |
149 | eeprom_write_byte_crc(EEDATA.sensorModuleId, PID_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC); |
| 118 | eeprom_write_byte_crc(EEDATA.sensorId, PID_TEMPERATURE_SENSOR, |
150 | eeprom_write_byte_crc(EEDATA.sensorId, PID_TEMPERATURE_SENSOR, WITHOUT_CRC); |
| - | 151 | eeprom_write_word_crc(EEDATA16.K_P, (int16_t)(DEFAULT_K_P*64), WITHOUT_CRC); |
|
| - | 152 | eeprom_write_word_crc(EEDATA16.K_I, (int16_t)(DEFAULT_K_I*64), WITHOUT_CRC); |
|
| - | 153 | eeprom_write_word_crc(EEDATA16.K_D, (int16_t)(DEFAULT_K_D*64), WITHOUT_CRC); |
|
| - | 154 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, DEFAULT_PID_CALC_PERIOD_UNIT, WITHOUT_CRC); |
|
| - | 155 | eeprom_write_word_crc(EEDATA16.Time, DEFAULT_PID_CALC_PERIOD, WITHOUT_CRC); |
|
| - | 156 | eeprom_write_byte_crc(EEDATA.actuatorModuleType, PID_PWM_ACTUATOR_MODULE_TYPE, WITHOUT_CRC); |
|
| - | 157 | eeprom_write_byte_crc(EEDATA.actuatorModuleId, PID_PWM_ACTUATOR_MODULE_ID, WITHOUT_CRC); |
|
| - | 158 | eeprom_write_byte_crc(EEDATA.actuatorId, PID_PWM_ACTUATOR, WITHOUT_CRC); |
|
| - | 159 | eeprom_write_byte_crc(EEDATA.sendPeriod, 10, WITH_CRC); |
|
| 119 | } |
160 | } |
| 120 | referenceValue = (float) eeprom_read_word(EEDATA16.referenceValue)/64; |
161 | referenceValue = (float) eeprom_read_word(EEDATA16.referenceValue)/64; |
| 121 | sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType); |
162 | sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType); |
| 122 | sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId); |
163 | sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId); |
| 123 | sensorId = eeprom_read_byte(EEDATA.sensorId); |
164 | sensorId = eeprom_read_byte(EEDATA.sensorId); |
| 124 | 165 | ||
| - | 166 | ||
| 125 | |
167 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) { |
| 126 | Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback); |
168 | Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback); |
| 127 |
|
169 | } else { |
| 128 | Timer_SetTimeout |
170 | Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback); |
| 129 |
|
171 | } |
| 130 | 172 | ||
| 131 | pid_Init(K_P * |
173 | 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); |
| 132 | pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
174 | pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
| 133 | PID_Status = PID_ON; |
175 | PID_Status = PID_ON; |
| 134 | pwmValue = DEFAULT_PWM_VALUE; |
176 | pwmValue = DEFAULT_PWM_VALUE; |
| 135 | Timer_SetTimeout(act_PID_SEND_TIMER, |
177 | Timer_SetTimeout(act_PID_SEND_TIMER, eeprom_read_byte(EEDATA.sendPeriod)*1000, TimerTypeFreeRunning, &sendPID_callback); |
| 136 | #ifdef act_PID_SEND_DEBUG_TIMER |
178 | #ifdef act_PID_SEND_DEBUG_TIMER |
| 137 | Timer_SetTimeout(act_PID_SEND_DEBUG_TIMER, PID_SEND_DEBUG_PERIOD, TimerTypeFreeRunning, &sendPID_debug_callback); |
179 | Timer_SetTimeout(act_PID_SEND_DEBUG_TIMER, PID_SEND_DEBUG_PERIOD, TimerTypeFreeRunning, &sendPID_debug_callback); |
| 138 | #endif |
180 | #endif |
| 139 | } |
181 | } |
| 140 | 182 | ||
| Line 144... | Line 186... | ||
| 144 | calculatePID(); |
186 | calculatePID(); |
| 145 | calculatePID_flag = 0; |
187 | calculatePID_flag = 0; |
| 146 | } |
188 | } |
| 147 | if (sendPID_flag) { |
189 | if (sendPID_flag) { |
| 148 | sendPID(); |
190 | sendPID(); |
| - | 191 | sendPID_flag= 0; |
|
| 149 | } |
192 | } |
| 150 | } |
193 | } |
| 151 | 194 | ||
| 152 | void act_PID_HandleMessage(StdCan_Msg_t *rxMsg) |
195 | void act_PID_HandleMessage(StdCan_Msg_t *rxMsg) |
| 153 | { |
196 | { |
| Line 177... | Line 220... | ||
| 177 | } |
220 | } |
| 178 | } else |
221 | } else |
| 179 | { |
222 | { |
| 180 | rxMsg->Data[1] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
223 | rxMsg->Data[1] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8); |
| 181 | rxMsg->Data[2] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64); |
224 | rxMsg->Data[2] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64); |
| 182 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
225 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
| 183 | rxMsg->Length = 3; |
226 | rxMsg->Length = 3; |
| 184 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
227 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
| 185 | } |
228 | } |
| 186 | 229 | ||
| 187 | } |
230 | } |
| 188 | break; |
231 | break; |
| 189 | case |
232 | case CAN_MODULE_CMD_PID_CONFIG_SENSOR: |
| 190 | if (rxMsg->Length == 3) |
233 | if (rxMsg->Length == 3) |
| 191 | { |
234 | { |
| 192 | eeprom_write_byte_crc(EEDATA.sensorModuleType, rxMsg->Data[0] , WITHOUT_CRC); |
235 | eeprom_write_byte_crc(EEDATA.sensorModuleType, rxMsg->Data[0] , WITHOUT_CRC); |
| 193 | eeprom_write_byte_crc(EEDATA.sensorModuleId, rxMsg->Data[1] , WITHOUT_CRC); |
236 | eeprom_write_byte_crc(EEDATA.sensorModuleId, rxMsg->Data[1] , WITHOUT_CRC); |
| 194 | eeprom_write_byte_crc(EEDATA.sensorId, rxMsg->Data[2] , WITH_CRC); |
237 | eeprom_write_byte_crc(EEDATA.sensorId, rxMsg->Data[2] , WITH_CRC); |
| 195 | sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType); |
238 | sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType); |
| 196 | sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId); |
239 | sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId); |
| 197 | sensorId = eeprom_read_byte(EEDATA.sensorId); |
240 | sensorId = eeprom_read_byte(EEDATA.sensorId); |
| 198 | } else |
- | |
| 199 | |
241 | } |
| 200 | rxMsg->Data[0] = eeprom_read_byte(EEDATA.sensorModuleType); |
242 | rxMsg->Data[0] = eeprom_read_byte(EEDATA.sensorModuleType); |
| 201 | rxMsg->Data[1] = eeprom_read_byte(EEDATA.sensorModuleId); |
243 | rxMsg->Data[1] = eeprom_read_byte(EEDATA.sensorModuleId); |
| 202 | rxMsg->Data[2] = eeprom_read_byte(EEDATA.sensorId); |
244 | rxMsg->Data[2] = eeprom_read_byte(EEDATA.sensorId); |
| 203 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
245 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
| 204 | rxMsg->Length = 3; |
246 | rxMsg->Length = 3; |
| - | 247 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
|
| - | 248 | break; |
|
| - | 249 | case CAN_MODULE_CMD_PID_CONFIG_ACTUATOR: |
|
| - | 250 | if (rxMsg->Length == 3) |
|
| - | 251 | { |
|
| - | 252 | eeprom_write_byte_crc(EEDATA.actuatorModuleType, rxMsg->Data[0] , WITHOUT_CRC); |
|
| - | 253 | eeprom_write_byte_crc(EEDATA.actuatorModuleId, rxMsg->Data[1] , WITHOUT_CRC); |
|
| - | 254 | eeprom_write_byte_crc(EEDATA.actuatorId, rxMsg->Data[2] , WITH_CRC); |
|
| - | 255 | } |
|
| - | 256 | rxMsg->Data[0] = eeprom_read_byte(EEDATA.actuatorModuleType); |
|
| - | 257 | rxMsg->Data[1] = eeprom_read_byte(EEDATA.actuatorModuleId); |
|
| - | 258 | rxMsg->Data[2] = eeprom_read_byte(EEDATA.actuatorId); |
|
| - | 259 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
|
| - | 260 | rxMsg->Length = 3; |
|
| - | 261 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
|
| - | 262 | break; |
|
| - | 263 | case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL: |
|
| - | 264 | if (rxMsg->Length == 1) { |
|
| - | 265 | if (65 <= rxMsg->Data[0]) |
|
| - | 266 | rxMsg->Data[0]=65; |
|
| - | 267 | if (0 == rxMsg->Data[0]) |
|
| - | 268 | rxMsg->Data[0]=1; |
|
| - | 269 | eeprom_write_byte_crc(EEDATA.sendPeriod, rxMsg->Data[0], WITH_CRC); |
|
| - | 270 | Timer_SetTimeout(act_PID_SEND_TIMER, rxMsg->Data[0]*1000, TimerTypeFreeRunning, &sendPID_callback); |
|
| - | 271 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
|
| - | 272 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
|
| - | 273 | } |
|
| - | 274 | break; |
|
| - | 275 | ||
| - | 276 | case CAN_MODULE_CMD_PID_CONFIG_PARAMETER: |
|
| - | 277 | if (rxMsg->Length == 8) |
|
| - | 278 | { |
|
| - | 279 | eeprom_write_word_crc(EEDATA16.K_P, rxMsg->Data[1]+(rxMsg->Data[0]<<8), WITHOUT_CRC); |
|
| - | 280 | eeprom_write_word_crc(EEDATA16.K_I, rxMsg->Data[3]+(rxMsg->Data[2]<<8), WITHOUT_CRC); |
|
| - | 281 | eeprom_write_word_crc(EEDATA16.K_D, rxMsg->Data[5]+(rxMsg->Data[4]<<8), WITHOUT_CRC); |
|
| - | 282 | eeprom_write_byte_crc(EEDATA.TimeMsOrS, ((rxMsg->Data[6]&0x80)>>7), WITHOUT_CRC); |
|
| - | 283 | eeprom_write_word_crc(EEDATA16.Time, rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC); |
|
| - | 284 | if (eeprom_read_byte(EEDATA.TimeMsOrS) == 0) { |
|
| - | 285 | Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback); |
|
| - | 286 | } else { |
|
| - | 287 | Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback); |
|
| - | 288 | } |
|
| - | 289 | ||
| - | 290 | 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); |
|
| - | 291 | pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData); |
|
| - | 292 | PID_Status = PID_ON; |
|
| - | 293 | pwmValue = DEFAULT_PWM_VALUE; |
|
| - | 294 | } else |
|
| - | 295 | { |
|
| - | 296 | rxMsg->Data[0] = (0xff00&(eeprom_read_word(EEDATA16.K_P))>>8); |
|
| - | 297 | rxMsg->Data[1] = (0x00ff&(eeprom_read_word(EEDATA16.K_P))); |
|
| - | 298 | rxMsg->Data[2] = (0xff00&(eeprom_read_word(EEDATA16.K_I))>>8); |
|
| - | 299 | rxMsg->Data[3] = (0x00ff&(eeprom_read_word(EEDATA16.K_I))); |
|
| - | 300 | rxMsg->Data[4] = (0xff00&(eeprom_read_word(EEDATA16.K_D))>>8); |
|
| - | 301 | rxMsg->Data[5] = (0x00ff&(eeprom_read_word(EEDATA16.K_D))); |
|
| - | 302 | rxMsg->Data[6] = (0xff00&(eeprom_read_word(EEDATA16.Time))>>8); |
|
| - | 303 | rxMsg->Data[7] = (0x00ff&(eeprom_read_word(EEDATA16.Time))); |
|
| - | 304 | rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7); |
|
| - | 305 | StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); |
|
| - | 306 | rxMsg->Length = 8; |
|
| 205 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
307 | while (StdCan_Put(rxMsg) != StdCan_Ret_OK); |
| 206 | } |
308 | } |
| 207 | break; |
309 | break; |
| 208 | } |
310 | } |
| 209 | } |
311 | } |
| Line 220... | Line 322... | ||
| 220 | { |
322 | { |
| 221 | //Error on the temperature signal, do something |
323 | //Error on the temperature signal, do something |
| 222 | } |
324 | } |
| 223 | else |
325 | else |
| 224 | { |
326 | { |
| 225 | measurementValue = (( |
327 | measurementValue = ((float)((rxMsg->Data[1]<<8) + rxMsg->Data[2]))/64; |
| 226 | } |
328 | } |
| 227 | 329 | ||
| 228 | } |
330 | } |
| 229 | 331 | ||
| 230 | } |
332 | } |