Subversion Repositories HomeAutomation

Rev

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, 0, WITHOUT_CRC);
119
      eeprom_write_dword_crc(EEDATA32.K_P, 850.0, WITHOUT_CRC);
163
      eeprom_write_dword_crc(EEDATA32.K_I, 0, WITHOUT_CRC);
120
      eeprom_write_dword_crc(EEDATA32.K_I, 0.5, WITHOUT_CRC);
164
      eeprom_write_dword_crc(EEDATA32.K_D, 0, WITHOUT_CRC);
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(act_PIDv1_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
270
                    //Timer_SetTimeout(act_PIDv1_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
314
                } else {
271
                } else {
315
                    Timer_SetTimeout(act_PIDv1_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback);
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;