Subversion Repositories HomeAutomation

Rev

Rev 2273 | Rev 2281 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 2273 Rev 2278
Line 20... Line 20...
20
        0x00,   //uint8_t TimeMsOrS;
20
        0x00,   //uint8_t TimeMsOrS;
21
        0x0000, //uint16_t Time;
21
        0x0000, //uint16_t Time;
22
        CAN_MODULE_TYPE_ACT_SOFTPWM,    //ActuatorModuleType
22
        CAN_MODULE_TYPE_ACT_SOFTPWM,    //ActuatorModuleType
23
        0x00,   //ActuatorModuleId
23
        0x00,   //ActuatorModuleId
24
        0x00,   //ActuatorId
24
        0x00,   //ActuatorId
-
 
25
        0x00000000, //uint32_t MAX; (float)
-
 
26
        0x00000000, //uint32_t MIN; (float)
25
    },
27
    },
26
    0   // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts
28
    0   // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts
27
};
29
};
28
#endif
30
#endif
29
#define PID_ON 1
31
#define PID_ON 1
Line 136... Line 138...
136
      eeprom_write_byte_crc(EEDATA.sensorModuleId, PIDv1_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC);
138
      eeprom_write_byte_crc(EEDATA.sensorModuleId, PIDv1_TEMPERATURE_SENSOR_MODULE_ID, WITHOUT_CRC);
137
      eeprom_write_byte_crc(EEDATA.sensorId, PIDv1_TEMPERATURE_SENSOR, WITHOUT_CRC);
139
      eeprom_write_byte_crc(EEDATA.sensorId, PIDv1_TEMPERATURE_SENSOR, WITHOUT_CRC);
138
      eeprom_write_dword_crc(EEDATA32.K_P, 850.0f, WITHOUT_CRC);
140
      eeprom_write_dword_crc(EEDATA32.K_P, 850.0f, WITHOUT_CRC);
139
      eeprom_write_dword_crc(EEDATA32.K_I, 0.5f, WITHOUT_CRC);
141
      eeprom_write_dword_crc(EEDATA32.K_I, 0.5f, WITHOUT_CRC);
140
      eeprom_write_dword_crc(EEDATA32.K_D, 0.1f, WITHOUT_CRC);
142
      eeprom_write_dword_crc(EEDATA32.K_D, 0.1f, WITHOUT_CRC);
-
 
143
      eeprom_write_dword_crc(EEDATA32.MIN, 0, WITHOUT_CRC);
-
 
144
      eeprom_write_dword_crc(EEDATA32.MAX, 0, WITHOUT_CRC);
141
      eeprom_write_byte_crc(EEDATA.TimeMsOrS, DEFAULT_PIDv1_CALC_PERIOD_UNIT, WITHOUT_CRC);
145
      eeprom_write_byte_crc(EEDATA.TimeMsOrS, DEFAULT_PIDv1_CALC_PERIOD_UNIT, WITHOUT_CRC);
142
      eeprom_write_word_crc(EEDATA16.Time, DEFAULT_PIDv1_CALC_PERIOD, WITHOUT_CRC);
146
      eeprom_write_word_crc(EEDATA16.Time, DEFAULT_PIDv1_CALC_PERIOD, WITHOUT_CRC);
143
      eeprom_write_byte_crc(EEDATA.actuatorModuleType, PIDv1_PWM_ACTUATOR_MODULE_TYPE, WITHOUT_CRC);
147
      eeprom_write_byte_crc(EEDATA.actuatorModuleType, PIDv1_PWM_ACTUATOR_MODULE_TYPE, WITHOUT_CRC);
144
      eeprom_write_byte_crc(EEDATA.actuatorModuleId, PIDv1_PWM_ACTUATOR_MODULE_ID, WITHOUT_CRC);
148
      eeprom_write_byte_crc(EEDATA.actuatorModuleId, PIDv1_PWM_ACTUATOR_MODULE_ID, WITHOUT_CRC);
145
      eeprom_write_byte_crc(EEDATA.actuatorId, PIDv1_PWM_ACTUATOR, WITHOUT_CRC);
149
      eeprom_write_byte_crc(EEDATA.actuatorId, PIDv1_PWM_ACTUATOR, WITHOUT_CRC);
Line 155... Line 159...
155
    sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
159
    sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
156
    sensorId = eeprom_read_byte(EEDATA.sensorId);
160
    sensorId = eeprom_read_byte(EEDATA.sensorId);
157
    uint32_t data_P = eeprom_read_dword(EEDATA32.K_P);
161
    uint32_t data_P = eeprom_read_dword(EEDATA32.K_P);
158
    uint32_t data_I = eeprom_read_dword(EEDATA32.K_I);
162
    uint32_t data_I = eeprom_read_dword(EEDATA32.K_I);
159
    uint32_t data_D = eeprom_read_dword(EEDATA32.K_D);
163
    uint32_t data_D = eeprom_read_dword(EEDATA32.K_D);
-
 
164
    uint32_t Max_D = eeprom_read_dword(EEDATA32.MAX);
-
 
165
    uint32_t Min_D = eeprom_read_dword(EEDATA32.MIN);
160
    float data_P_f;// = *((float*)((&data_P)));
166
    float data_P_f;// = *((float*)((&data_P)));
161
    float data_I_f;// = *((float*)((&data_I)));
167
    float data_I_f;// = *((float*)((&data_I)));
162
    float data_D_f;// = *((float*)(&data_D));
168
    float data_D_f;// = *((float*)(&data_D));
-
 
169
    float Max_out_f;// = *((float*)((&data_I)));
-
 
170
    float Min_out_f;// = *((float*)(&data_D));
163
    memcpy(&data_P_f, &data_P, sizeof(data_P));
171
    memcpy(&data_P_f, &data_P, sizeof(data_P));
164
    memcpy(&data_I_f, &data_I, sizeof(data_I));
172
    memcpy(&data_I_f, &data_I, sizeof(data_I));
165
    memcpy(&data_D_f, &data_D, sizeof(data_D));
173
    memcpy(&data_D_f, &data_D, sizeof(data_D));
-
 
174
    memcpy(&Min_out_f, &Min_D, sizeof(Min_D));
-
 
175
    memcpy(&Max_out_f, &Max_D, sizeof(Max_D));
166
    PID_init(&pid, &measurementValue, &outputValue, &referenceValue, data_P_f, data_I_f, data_D_f, PID_Direction_Direct);
176
    PID_init(&pid, &measurementValue, &outputValue, &referenceValue, data_P_f, data_I_f, data_D_f, PID_Direction_Direct);
167
 
177
 
168
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_S) {
178
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_S) {
169
        PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))*1000);
179
        PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time))*1000);
170
 
180
 
171
    } else {
181
    } else {
172
        PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time)));
182
        PID_SetSampleTime(&pid, (uint32_t)(eeprom_read_word(EEDATA16.Time)));
173
    }
183
    }
174
 
-
 
-
 
184
    PID_SetOutputLimits(&pid, Min_out_f, Max_out_f);
175
    outputValue = DEFAULT_PWM_VALUE;
185
    outputValue = DEFAULT_PWM_VALUE;
176
 
186
 
177
    PID_SetMode(&pid, PID_Mode_Automatic);
187
    PID_SetMode(&pid, PID_Mode_Automatic);
178
}
188
}
179
 
189
 
Line 209... Line 219...
209
        {
219
        {
210
        case CAN_MODULE_CMD_PHYSICAL_TEMPERATURE_CELSIUS:
220
        case CAN_MODULE_CMD_PHYSICAL_TEMPERATURE_CELSIUS:
211
            if (rxMsg->Data[0]==0)  //sensor id shall be zero
221
            if (rxMsg->Data[0]==0)  //sensor id shall be zero
212
            {
222
            {
213
                //printf("New setpoint with: %X %X\n",rxMsg->Data[1],rxMsg->Data[2]);
223
                //printf("New setpoint with: %X %X\n",rxMsg->Data[1],rxMsg->Data[2]);
214
 
224
 
215
                if (rxMsg->Length == 3)
225
                if (rxMsg->Length == 3)
216
                {
226
                {
217
                    if (0x80 == rxMsg->Data[1] && 0x00 == rxMsg->Data[2]) //512 degrees
227
                    if (0x80 == rxMsg->Data[1] && 0x00 == rxMsg->Data[2]) //512 degrees
218
                    {
228
                    {
219
                        //pid_Reset_Integrator(&pidData);
229
                        //pid_Reset_Integrator(&pidData);
220
                        PID_Status = PID_AUTO;
230
                        PID_Status = PID_AUTO;
221
                    }
231
                    }
222
                    else
232
                    else
223
                    {
233
                    {
Line 226... Line 236...
226
                        eeprom_write_dword_crc(EEDATA32.referenceValue, referenceValue, WITH_CRC);
236
                        eeprom_write_dword_crc(EEDATA32.referenceValue, referenceValue, WITH_CRC);
227
                    }
237
                    }
228
                }
238
                }
229
                rxMsg->Data[1] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8);
239
                rxMsg->Data[1] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8);
230
                rxMsg->Data[2] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64);
240
                rxMsg->Data[2] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64);
231
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
241
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
232
                rxMsg->Length = 3;
242
                rxMsg->Length = 3;
233
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
243
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
234
            }
244
            }
235
        break;
245
        break;
236
        case CAN_MODULE_CMD_PID_CONFIG_SENSOR:
246
        case CAN_MODULE_CMD_PID_CONFIG_SENSOR:
-
 
247
            //printf("New sensor with: %X %X %X len: %d\n",rxMsg->Data[1],rxMsg->Data[2] ,rxMsg->Data[2],rxMsg->Length);
237
            if (rxMsg->Length == 3)
248
            if (rxMsg->Length == 3)
238
            {
249
            {
239
                eeprom_write_byte_crc(EEDATA.sensorModuleType, rxMsg->Data[0] , WITHOUT_CRC);
250
                eeprom_write_byte_crc(EEDATA.sensorModuleType, rxMsg->Data[0] , WITHOUT_CRC);
240
                eeprom_write_byte_crc(EEDATA.sensorModuleId, rxMsg->Data[1] , WITHOUT_CRC);
251
                eeprom_write_byte_crc(EEDATA.sensorModuleId, rxMsg->Data[1] , WITHOUT_CRC);
241
                eeprom_write_byte_crc(EEDATA.sensorId, rxMsg->Data[2] , WITH_CRC);
252
                eeprom_write_byte_crc(EEDATA.sensorId, rxMsg->Data[2] , WITH_CRC);
242
                sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType);
253
                sensorModuleType = eeprom_read_byte(EEDATA.sensorModuleType);
243
                sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
254
                sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
244
                sensorId = eeprom_read_byte(EEDATA.sensorId);
255
                sensorId = eeprom_read_byte(EEDATA.sensorId);
-
 
256
                //printf("Stored\n");
245
            }
257
            }
246
            rxMsg->Data[0] = eeprom_read_byte(EEDATA.sensorModuleType);
258
            rxMsg->Data[0] = eeprom_read_byte(EEDATA.sensorModuleType);
247
            rxMsg->Data[1] = eeprom_read_byte(EEDATA.sensorModuleId);
259
            rxMsg->Data[1] = eeprom_read_byte(EEDATA.sensorModuleId);
248
            rxMsg->Data[2] = eeprom_read_byte(EEDATA.sensorId);
260
            rxMsg->Data[2] = eeprom_read_byte(EEDATA.sensorId);
249
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
261
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
Line 310... Line 322...
310
                //data = (float*)&rxMsg->Data[4];
322
                //data = (float*)&rxMsg->Data[4];
311
                float* data1 = (float*)&rxMsg->Data[4];
323
                float* data1 = (float*)&rxMsg->Data[4];
312
                data_32 = (uint32_t*)data1;
324
                data_32 = (uint32_t*)data1;
313
                eeprom_write_dword_crc(EEDATA32.K_I, *data_32, WITH_CRC);
325
                eeprom_write_dword_crc(EEDATA32.K_I, *data_32, WITH_CRC);
314
               
326
               
315
                PID_SetTunings(&pid, *data, *data1, PID_GetKd(&pid));
327
                PID_SetTunings(&pid, *data, *data1, PID_GetKd(&pid));
316
                PID_Status = PID_ON;
328
                PID_Status = PID_ON;
317
                pwmValue = DEFAULT_PWM_VALUE;
329
                pwmValue = DEFAULT_PWM_VALUE;
-
 
330
            }
-
 
331
            data2 = PID_GetKp(&pid);
-
 
332
            ptr = (uint8_t*)&data2;
-
 
333
            rxMsg->Data[0] = ptr[0];
-
 
334
            rxMsg->Data[1] = ptr[1];
-
 
335
            rxMsg->Data[2] = ptr[2];
-
 
336
            rxMsg->Data[3] = ptr[3];
-
 
337
            data2 = PID_GetKi(&pid);
-
 
338
            ptr = (uint8_t*)&data2;
-
 
339
            rxMsg->Data[4] = ptr[0];
-
 
340
            rxMsg->Data[5] = ptr[1];
-
 
341
            rxMsg->Data[6] = ptr[2];
-
 
342
            rxMsg->Data[7] = ptr[3];
-
 
343
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
-
 
344
            rxMsg->Length = 8;
-
 
345
            while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
-
 
346
        break;
-
 
347
        case CAN_MODULE_CMD_PID_OUTMINMAX:
-
 
348
            if (rxMsg->Length > 1)
-
 
349
            {
-
 
350
                uint32_t* data_32;
-
 
351
                float* data = (float*)&rxMsg->Data[0];
-
 
352
                data_32 = (uint32_t*)data;
-
 
353
                eeprom_write_dword_crc(EEDATA32.MIN, *data_32, WITHOUT_CRC);
-
 
354
                //data = (float*)&rxMsg->Data[4];
-
 
355
                float* data1 = (float*)&rxMsg->Data[4];
-
 
356
                data_32 = (uint32_t*)data1;
-
 
357
                eeprom_write_dword_crc(EEDATA32.MAX, *data_32, WITH_CRC);
-
 
358
                PID_SetOutputLimits(&pid, *data, *data1);
-
 
359
   
318
            }
360
            }
319
            data2 = PID_GetKp(&pid);
361
            data2 = PID_GetMin(&pid);
320
            ptr = (uint8_t*)&data2;
362
            ptr = (uint8_t*)&data2;
321
            rxMsg->Data[0] = ptr[0];
363
            rxMsg->Data[0] = ptr[0];
322
            rxMsg->Data[1] = ptr[1];
364
            rxMsg->Data[1] = ptr[1];
323
            rxMsg->Data[2] = ptr[2];
365
            rxMsg->Data[2] = ptr[2];
324
            rxMsg->Data[3] = ptr[3];
366
            rxMsg->Data[3] = ptr[3];
325
            data2 = PID_GetKi(&pid);
367
            data2 = PID_GetMax(&pid);
326
            ptr = (uint8_t*)&data2;
368
            ptr = (uint8_t*)&data2;
327
            rxMsg->Data[4] = ptr[0];
369
            rxMsg->Data[4] = ptr[0];
328
            rxMsg->Data[5] = ptr[1];
370
            rxMsg->Data[5] = ptr[1];
329
            rxMsg->Data[6] = ptr[2];
371
            rxMsg->Data[6] = ptr[2];
330
            rxMsg->Data[7] = ptr[3];
372
            rxMsg->Data[7] = ptr[3];
331
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
373
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
332
            rxMsg->Length = 8;
374
            rxMsg->Length = 8;
333
            while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
375
            while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
334
        break;
376
        break;
-
 
377
       
335
        }
378
        }
336
    }
379
    }
337
 
380
 
338
 
381
 
339
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS &&
382
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS &&