Subversion Repositories HomeAutomation

Rev

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

Rev 1366 Rev 1379
Line 42... Line 42...
42
 
42
 
43
void calculatePID(void) {
43
void calculatePID(void) {
44
    if (PID_Status == PID_OFF){
44
    if (PID_Status == PID_OFF){
45
        ;// use current PWMvalue
45
        ;// use current PWMvalue
46
    } else {
46
    } else {
-
 
47
//printf("PWM: %d\n",pwmValue);
-
 
48
uint16_t tempPwm = pwmValue;
47
        pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData);
49
        tempPwm += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData);
48
        printf("InOut: ref: %d, meas: %d\n",(int16_t) (referenceValue*10), (int16_t) (measurementValue*10));
50
//printf("InOut: ref: %d, meas: %d\n",(int16_t) (referenceValue*10), (int16_t) (measurementValue*10));
-
 
51
//printf("PWM: %d\n",pwmValue);
-
 
52
 
49
        if (pwmValue < MIN_PWM_VALUE) {
53
        if (tempPwm < MIN_PWM_VALUE) {
50
            pwmValue = MIN_PWM_VALUE;
54
            tempPwm = MIN_PWM_VALUE;
51
        }
55
        }
52
        else if (pwmValue > MAX_PWM_VALUE) {
56
        else if (tempPwm > MAX_PWM_VALUE) {
53
            pwmValue = MAX_PWM_VALUE-1;
57
            tempPwm = MAX_PWM_VALUE-1;
54
        }
58
        }
-
 
59
        cli();
-
 
60
        pwmValue = tempPwm;
-
 
61
        sei();
-
 
62
//printf("PWM: %d\n",pwmValue);
55
        //send current PWM value as soon as possible
63
        //send current PWM value as soon as possible
56
        sendPID_flag=1;
64
        sendPID_flag=1;
57
    }
65
    }
58
printf("PWM: %d\n",pwmValue);
-
 
-
 
66
 
59
}
67
}
60
 
68
 
61
 
69
 
62
void calculatePID_callback(uint8_t timer)
70
void calculatePID_callback(uint8_t timer)
63
{
71
{
64
 
72
 
65
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) {
73
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) {
66
        static uint8_t seconds = 0;
74
        static uint8_t seconds = 0;
67
        seconds++;
75
        seconds++;
68
        if (seconds >= eeprom_read_word(EEDATA16.Time))
76
        if (seconds >= eeprom_read_word(EEDATA16.Time))
69
        {
77
        {
70
            seconds = 0;
78
            seconds = 0;
71
            calculatePID_flag = 1;
79
            calculatePID_flag = 1;
72
        }
80
        }
73
    } else {
81
    } else {
74
        calculatePID_flag = 1;
82
        calculatePID_flag = 1;
75
    }
83
    }
76
}
84
}
77
 
85
 
78
void sendPID(void)
86
void sendPID(void)
79
{
87
{
80
    if (eeprom_read_byte(EEDATA.actuatorModuleType) != 0) {
88
    if (eeprom_read_byte(EEDATA.actuatorModuleType) != 0) {
81
        StdCan_Msg_t txMsg;
89
        StdCan_Msg_t txMsg;
82
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
90
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
83
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER);
91
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_TO_OWNER);
84
        txMsg.Header.ModuleType = eeprom_read_byte(EEDATA.actuatorModuleType); ///TODO: Change this to the actual module type
92
        txMsg.Header.ModuleType = eeprom_read_byte(EEDATA.actuatorModuleType); ///TODO: Change this to the actual module type
85
        txMsg.Header.ModuleId = eeprom_read_byte(EEDATA.actuatorModuleId);
93
        txMsg.Header.ModuleId = eeprom_read_byte(EEDATA.actuatorModuleId);
86
        txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PWM;
94
        txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PWM;
87
        txMsg.Length = 3;
95
        txMsg.Length = 3;
88
        txMsg.Data[0] = eeprom_read_byte(EEDATA.actuatorId);
96
        txMsg.Data[0] = eeprom_read_byte(EEDATA.actuatorId);
89
        int16_t tempPWM =(int16_t) (((int32_t)pwmValue)*64/100);
97
        //uint16_t tempPWM =(uint16_t) (pwmValue*10000);
90
        txMsg.Data[1] = ( (tempPWM)>>8)&0xff;
98
        txMsg.Data[1] = ( (pwmValue)>>8)&0xff;
91
        txMsg.Data[2] = ( (tempPWM))&0xff;
99
        txMsg.Data[2] = ( (pwmValue))&0xff;
92
        while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
100
        while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
93
    }
101
    }
94
    StdCan_Msg_t txMsg;
102
    StdCan_Msg_t txMsg;
95
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
103
    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);
104
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
Line 100... Line 108...
100
    txMsg.Length = 8;
108
    txMsg.Length = 8;
101
    txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8);
109
    txMsg.Data[0] = (uint8_t)0x00ff & (((uint32_t)(measurementValue*64))>>8);
102
    txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)measurementValue*64);
110
    txMsg.Data[1] = (uint8_t)0x00ff & ((uint32_t)measurementValue*64);
103
    txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8);
111
    txMsg.Data[2] = (uint8_t)0x00ff & (((uint32_t)(referenceValue*64))>>8);
104
    txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64);
112
    txMsg.Data[3] = (uint8_t)0x00ff & ((uint32_t)referenceValue*64);
105
    int16_t tempPWM =(int16_t) (((int32_t)pwmValue)*64/100);
113
    //uint16_t tempPWM =(uint16_t) (pwmValue*10000);
106
    txMsg.Data[4] = ( (tempPWM)>>8)&0xff;
114
        txMsg.Data[4] = ( (pwmValue)>>8)&0xff;
107
    txMsg.Data[5] = ( (tempPWM))&0xff;
115
        txMsg.Data[5] = ( (pwmValue))&0xff;
108
    txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff;
116
    txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff;
109
    txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff;
117
    txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff;
110
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
118
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
111
}
119
}
112
 
120
 
113
void sendPID_callback(uint8_t timer) {
121
void sendPID_callback(uint8_t timer) {
114
  sendPID_flag=1;
122
  sendPID_flag=1;
115
}
123
}
116
 
124
 
117
#ifdef act_PID_SEND_DEBUG_TIMER
125
#ifdef act_PID_SEND_DEBUG_TIMER
118
void sendPID_debug_callback(uint8_t timer)
126
void sendPID_debug_callback(uint8_t timer)
119
{
127
{
120
    StdCan_Msg_t txMsg;
128
    StdCan_Msg_t txMsg;
121
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
129
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
Line 132... Line 140...
132
    txMsg.Data[4] = ((int16_t) (pidDebugData.D_term)>>8)&0xff;
140
    txMsg.Data[4] = ((int16_t) (pidDebugData.D_term)>>8)&0xff;
133
    txMsg.Data[5] = ((int16_t) (pidDebugData.D_term))&0xff;
141
    txMsg.Data[5] = ((int16_t) (pidDebugData.D_term))&0xff;
134
    txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff;
142
    txMsg.Data[6] = ((int16_t) (pidDebugData.Sum)>>8)&0xff;
135
    txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff;
143
    txMsg.Data[7] = ((int16_t) (pidDebugData.Sum))&0xff;
136
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
144
    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);
145
//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);
138
}
146
}
139
#endif
147
#endif
140
 
148
 
141
void act_PID_Init(void)
149
void act_PID_Init(void)
142
{
150
{
Line 163... Line 171...
163
    sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
171
    sensorModuleId = eeprom_read_byte(EEDATA.sensorModuleId);
164
    sensorId = eeprom_read_byte(EEDATA.sensorId);
172
    sensorId = eeprom_read_byte(EEDATA.sensorId);
165
 
173
 
166
 
174
 
167
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) {
175
    if (eeprom_read_byte(EEDATA.TimeMsOrS) == CAN_MODULE_ENUM_PID_CONFIG_PARAMETER_TIMEUNIT_SECONDS) {
168
        Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
176
        Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
169
    } else {
177
    } else {
170
        Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback);
178
        Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback);
171
    }
179
    }
172
 
180
 
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);
181
    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);
174
    pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData);
182
    pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData);
175
    PID_Status = PID_ON;
183
    PID_Status = PID_ON;
176
    pwmValue = DEFAULT_PWM_VALUE;
184
    pwmValue = DEFAULT_PWM_VALUE;
177
    Timer_SetTimeout(act_PID_SEND_TIMER, eeprom_read_byte(EEDATA.sendPeriod)*1000, TimerTypeFreeRunning, &sendPID_callback);
185
    Timer_SetTimeout(act_PID_SEND_TIMER, eeprom_read_byte(EEDATA.sendPeriod)*1000, TimerTypeFreeRunning, &sendPID_callback);
178
    #ifdef act_PID_SEND_DEBUG_TIMER
186
    #ifdef act_PID_SEND_DEBUG_TIMER
179
      Timer_SetTimeout(act_PID_SEND_DEBUG_TIMER, PID_SEND_DEBUG_PERIOD, TimerTypeFreeRunning, &sendPID_debug_callback);
187
      Timer_SetTimeout(act_PID_SEND_DEBUG_TIMER, PID_SEND_DEBUG_PERIOD, TimerTypeFreeRunning, &sendPID_debug_callback);
Line 256... Line 264...
256
            rxMsg->Data[0] = eeprom_read_byte(EEDATA.actuatorModuleType);
264
            rxMsg->Data[0] = eeprom_read_byte(EEDATA.actuatorModuleType);
257
            rxMsg->Data[1] = eeprom_read_byte(EEDATA.actuatorModuleId);
265
            rxMsg->Data[1] = eeprom_read_byte(EEDATA.actuatorModuleId);
258
            rxMsg->Data[2] = eeprom_read_byte(EEDATA.actuatorId);
266
            rxMsg->Data[2] = eeprom_read_byte(EEDATA.actuatorId);
259
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
267
            StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
260
            rxMsg->Length = 3;
268
            rxMsg->Length = 3;
261
            while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
269
            while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
262
        break;
270
        break;
263
        case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL:
271
        case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL:
264
            if (rxMsg->Length == 1) {
272
            if (rxMsg->Length == 1) {
265
                if (65 <= rxMsg->Data[0])
273
                if (65 <= rxMsg->Data[0])
266
                    rxMsg->Data[0]=65;
274
                    rxMsg->Data[0]=65;
267
                if (0 == rxMsg->Data[0])
275
                if (0 == rxMsg->Data[0])
268
                    rxMsg->Data[0]=1;
276
                    rxMsg->Data[0]=1;
269
                eeprom_write_byte_crc(EEDATA.sendPeriod, rxMsg->Data[0], WITH_CRC);
277
                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);
278
                Timer_SetTimeout(act_PID_SEND_TIMER, rxMsg->Data[0]*1000, TimerTypeFreeRunning, &sendPID_callback);
271
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
279
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
272
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
280
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
273
            }
281
            }
274
        break;
282
        break;
275
 
283
 
276
        case CAN_MODULE_CMD_PID_CONFIG_PARAMETER:
284
        case CAN_MODULE_CMD_PID_CONFIG_PARAMETER:
277
            if (rxMsg->Length == 8)
285
            if (rxMsg->Length == 8)
278
            {
286
            {
279
                eeprom_write_word_crc(EEDATA16.K_P, rxMsg->Data[1]+(rxMsg->Data[0]<<8), WITHOUT_CRC);
287
                eeprom_write_word_crc(EEDATA16.K_P, (uint16_t)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);
288
                eeprom_write_word_crc(EEDATA16.K_I, (uint16_t)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);
289
                eeprom_write_word_crc(EEDATA16.K_D, (uint16_t)rxMsg->Data[5]+(rxMsg->Data[4]<<8), WITHOUT_CRC);
282
                eeprom_write_byte_crc(EEDATA.TimeMsOrS, ((rxMsg->Data[6]&0x80)>>7), WITHOUT_CRC);
290
                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);
291
                eeprom_write_word_crc(EEDATA16.Time, (uint16_t)rxMsg->Data[7]+((rxMsg->Data[6]&0x7f)<<8), WITH_CRC);
284
                if (eeprom_read_byte(EEDATA.TimeMsOrS) == 0) {
292
                if (eeprom_read_byte(EEDATA.TimeMsOrS) == 0) {
285
                    Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
293
                    Timer_SetTimeout(act_PID_TIMER, 1000, TimerTypeFreeRunning, &calculatePID_callback);
286
                } else {
294
                } else {
287
                    Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback);
295
                    Timer_SetTimeout(act_PID_TIMER, eeprom_read_word(EEDATA16.Time), TimerTypeFreeRunning, &calculatePID_callback);
288
                }
296
                }
289
 
297
 
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);
298
                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);
299
                pwmValue += (int16_t) pid_Controller(referenceValue, measurementValue, &pidData, &pidDebugData);
292
                PID_Status = PID_ON;
300
                PID_Status = PID_ON;
293
                pwmValue = DEFAULT_PWM_VALUE;
301
                pwmValue = DEFAULT_PWM_VALUE;
-
 
302
 
-
 
303
                rxMsg->Data[0] = (0xff&(eeprom_read_word(EEDATA16.K_P)>>8));
-
 
304
                rxMsg->Data[1] = (0xff&(eeprom_read_word(EEDATA16.K_P)));
-
 
305
                rxMsg->Data[2] = (0xff&(eeprom_read_word(EEDATA16.K_I)>>8));
-
 
306
                rxMsg->Data[3] = (0xff&(eeprom_read_word(EEDATA16.K_I)));
-
 
307
                rxMsg->Data[4] = (0xff&(eeprom_read_word(EEDATA16.K_D)>>8));
-
 
308
                rxMsg->Data[5] = (0xff&(eeprom_read_word(EEDATA16.K_D)));
-
 
309
                rxMsg->Data[6] = (0xff&(eeprom_read_word(EEDATA16.Time)>>8));
-
 
310
                rxMsg->Data[7] = (0xff&(eeprom_read_word(EEDATA16.Time)));
-
 
311
                rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7);
-
 
312
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
-
 
313
                rxMsg->Length = 8;
-
 
314
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
294
            } else
315
            } else
295
            {
316
            {
296
                rxMsg->Data[0] = (0xff00&(eeprom_read_word(EEDATA16.K_P))>>8);
317
                rxMsg->Data[0] = (0xff&(eeprom_read_word(EEDATA16.K_P)>>8));
297
                rxMsg->Data[1] = (0x00ff&(eeprom_read_word(EEDATA16.K_P)));
318
                rxMsg->Data[1] = (0xff&(eeprom_read_word(EEDATA16.K_P)));
298
                rxMsg->Data[2] = (0xff00&(eeprom_read_word(EEDATA16.K_I))>>8);
319
                rxMsg->Data[2] = (0xff&(eeprom_read_word(EEDATA16.K_I)>>8));
299
                rxMsg->Data[3] = (0x00ff&(eeprom_read_word(EEDATA16.K_I)));
320
                rxMsg->Data[3] = (0xff&(eeprom_read_word(EEDATA16.K_I)));
300
                rxMsg->Data[4] = (0xff00&(eeprom_read_word(EEDATA16.K_D))>>8);
321
                rxMsg->Data[4] = (0xff&(eeprom_read_word(EEDATA16.K_D)>>8));
301
                rxMsg->Data[5] = (0x00ff&(eeprom_read_word(EEDATA16.K_D)));
322
                rxMsg->Data[5] = (0xff&(eeprom_read_word(EEDATA16.K_D)));
302
                rxMsg->Data[6] = (0xff00&(eeprom_read_word(EEDATA16.Time))>>8);
323
                rxMsg->Data[6] = (0xff&(eeprom_read_word(EEDATA16.Time)>>8));
303
                rxMsg->Data[7] = (0x00ff&(eeprom_read_word(EEDATA16.Time)));
324
                rxMsg->Data[7] = (0xff&(eeprom_read_word(EEDATA16.Time)));
304
                rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7);
325
                rxMsg->Data[6] |= (0x80&(eeprom_read_byte(EEDATA.TimeMsOrS))<<7);
305
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
326
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
306
                rxMsg->Length = 8;
327
                rxMsg->Length = 8;
307
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
328
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
308
            }
329
            }