Subversion Repositories HomeAutomation

Rev

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
                rxMsg->Header.ModuleId == sensorModuleId &&
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
{