Fixed PPM, PWM timeout
- fixed the general timeout handling: there is no need to disable the MOSFETs timer because it will confuse the BLDC_controller, making him consider the timeout as a false MOSFET defective error. - renamed `timeout` to `timeoutCnt` for consistency and to ease the search #61
This commit is contained in:
parent
68776699e1
commit
22984a7fd6
|
@ -31,7 +31,7 @@
|
|||
#else
|
||||
#define DELAY_IN_MAIN_LOOP 5 // in ms. default 5. it is independent of all the timing critical stuff. do not touch if you do not know what you are doing.
|
||||
#endif
|
||||
#define TIMEOUT 5 // number of wrong / missing input commands before emergency off
|
||||
#define TIMEOUT 20 // number of wrong / missing input commands before emergency off
|
||||
#define A2BIT_CONV 50 // A to bit for current conversion on ADC. Example: 1 A = 50, 2 A = 100, etc
|
||||
|
||||
// ADC conversion time definitions
|
||||
|
|
|
@ -57,8 +57,6 @@ volatile int pwmr = 0;
|
|||
|
||||
extern volatile adc_buf_t adc_buffer;
|
||||
|
||||
extern volatile uint32_t timeout;
|
||||
|
||||
uint8_t buzzerFreq = 0;
|
||||
uint8_t buzzerPattern = 0;
|
||||
static uint32_t buzzerTimer = 0;
|
||||
|
@ -116,13 +114,13 @@ void DMA1_Channel1_IRQHandler(void) {
|
|||
|
||||
// Disable PWM when current limit is reached (current chopping)
|
||||
// This is the Level 2 of current protection. The Level 1 should kick in first given by I_MOT_MAX
|
||||
if(ABS(curL_DC) > curDC_max || timeout > TIMEOUT || enable == 0) {
|
||||
if(ABS(curL_DC) > curDC_max || enable == 0) {
|
||||
LEFT_TIM->BDTR &= ~TIM_BDTR_MOE;
|
||||
} else {
|
||||
LEFT_TIM->BDTR |= TIM_BDTR_MOE;
|
||||
}
|
||||
|
||||
if(ABS(curR_DC) > curDC_max || timeout > TIMEOUT || enable == 0) {
|
||||
if(ABS(curR_DC) > curDC_max || enable == 0) {
|
||||
RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE;
|
||||
} else {
|
||||
RIGHT_TIM->BDTR |= TIM_BDTR_MOE;
|
||||
|
|
|
@ -10,7 +10,7 @@ TIM_HandleTypeDef TimHandle;
|
|||
TIM_HandleTypeDef TimHandle2;
|
||||
uint8_t ppm_count = 0;
|
||||
uint8_t pwm_count = 0;
|
||||
uint32_t timeout = 100;
|
||||
uint32_t timeoutCnt = 0;
|
||||
uint8_t nunchuk_data[6] = {0};
|
||||
|
||||
uint8_t i2cBuffer[2];
|
||||
|
@ -40,7 +40,7 @@ void PPM_ISR_Callback(void) {
|
|||
ppm_count = 0;
|
||||
}
|
||||
else if (ppm_count < PPM_NUM_CHANNELS && IN_RANGE(rc_delay, 900, 2100)){
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
ppm_captured_value_buffer[ppm_count++] = CLAMP(rc_delay, 1000, 2000) - 1000;
|
||||
} else {
|
||||
ppm_valid = false;
|
||||
|
@ -113,7 +113,7 @@ void PWM_ISR_CH1_Callback(void) {
|
|||
} else { // Falling Edge interrupt -> measure pulse duration
|
||||
uint16_t rc_signal = TIM2->CNT - pwm_CNT_prev_ch1;
|
||||
if (IN_RANGE(rc_signal, 900, 2100)){
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
pwm_timeout_ch1 = 0;
|
||||
pwm_captured_ch1_value = CLAMP(rc_signal, 1000, 2000) - 1000;
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ void PWM_ISR_CH2_Callback(void) {
|
|||
} else { // Falling Edge interrupt -> measure pulse duration
|
||||
uint16_t rc_signal = TIM2->CNT - pwm_CNT_prev_ch2;
|
||||
if (IN_RANGE(rc_signal, 900, 2100)){
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
pwm_timeout_ch2 = 0;
|
||||
pwm_captured_ch2_value = CLAMP(rc_signal, 1000, 2000) - 1000;
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ void PWM_ISR_CH2_Callback(void) {
|
|||
void PWM_SysTick_Callback(void) {
|
||||
pwm_timeout_ch1++;
|
||||
pwm_timeout_ch2++;
|
||||
// Stop after 500 ms without PPM signal
|
||||
// Stop after 500 ms without PWM signal
|
||||
if(pwm_timeout_ch1 > 500) {
|
||||
pwm_captured_ch1_value = 500;
|
||||
pwm_timeout_ch1 = 0;
|
||||
|
@ -228,11 +228,11 @@ void Nunchuk_Read(void) {
|
|||
HAL_I2C_Master_Transmit(&hi2c2,0xA4,(uint8_t*)i2cBuffer, 1, 10);
|
||||
HAL_Delay(3);
|
||||
if (HAL_I2C_Master_Receive(&hi2c2,0xA4,(uint8_t*)nunchuk_data, 6, 10) == HAL_OK) {
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
}
|
||||
|
||||
#ifndef TRANSPOTTER
|
||||
if (timeout > 3) {
|
||||
if (timeoutCnt > 3) {
|
||||
HAL_Delay(50);
|
||||
Nunchuk_Init();
|
||||
}
|
||||
|
|
22
Src/main.c
22
Src/main.c
|
@ -65,6 +65,7 @@ extern int16_t cmd2; // normalized input value. -1000 to 1000
|
|||
|
||||
extern int16_t speedAvg; // Average measured speed
|
||||
extern int16_t speedAvgAbs; // Average measured speed in absolute
|
||||
extern volatile uint32_t timeoutCnt; // Timeout counter for the General timeout (PPM, PWM, Nunchuck)
|
||||
extern uint8_t timeoutFlagADC; // Timeout Flag for for ADC Protection: 0 = OK, 1 = Problem detected (line disconnected or wrong ADC data)
|
||||
extern uint8_t timeoutFlagSerial; // Timeout Flag for Rx Serial command: 0 = OK, 1 = Problem detected (line disconnected or wrong Rx data)
|
||||
|
||||
|
@ -76,7 +77,6 @@ extern uint8_t buzzerPattern; // global variable for the buzzer patter
|
|||
|
||||
extern uint8_t enable; // global variable for motor enable
|
||||
|
||||
extern volatile uint32_t timeout; // global variable for timeout
|
||||
extern int16_t batVoltage; // global variable for battery voltage
|
||||
|
||||
#if defined(SIDEBOARD_SERIAL_USART2)
|
||||
|
@ -236,6 +236,12 @@ int main(void) {
|
|||
}
|
||||
#endif
|
||||
|
||||
// ####### GENERAL TIMEOUT #######
|
||||
if (timeoutCnt > TIMEOUT) { // Bring the system to a Safe State
|
||||
cmd1 = 0;
|
||||
cmd2 = 0;
|
||||
}
|
||||
|
||||
// ####### LOW-PASS FILTER #######
|
||||
rateLimiter16(cmd1, RATE, &steerRateFixdt);
|
||||
rateLimiter16(cmd2, RATE, &speedRateFixdt);
|
||||
|
@ -259,7 +265,7 @@ int main(void) {
|
|||
mixerFcn(speed << 4, steer << 4, &speedR, &speedL); // This function implements the equations above
|
||||
|
||||
// ####### SET OUTPUTS (if the target change is less than +/- 100) #######
|
||||
if ((speedL > lastSpeedL-100 && speedL < lastSpeedL+100) && (speedR > lastSpeedR-100 && speedR < lastSpeedR+100) && timeout < TIMEOUT) {
|
||||
if ((speedL > lastSpeedL-100 && speedL < lastSpeedL+100) && (speedR > lastSpeedR-100 && speedR < lastSpeedR+100)) {
|
||||
#ifdef INVERT_R_DIRECTION
|
||||
pwmr = speedR;
|
||||
#else
|
||||
|
@ -308,10 +314,10 @@ int main(void) {
|
|||
enable = 0;
|
||||
}
|
||||
}
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
}
|
||||
|
||||
if (timeout > TIMEOUT) {
|
||||
if (timeoutCnt > TIMEOUT) {
|
||||
pwml = 0;
|
||||
pwmr = 0;
|
||||
enable = 0;
|
||||
|
@ -345,7 +351,7 @@ int main(void) {
|
|||
#ifdef SUPPORT_LCD
|
||||
LCD_SetLocation(&lcd, 0, 0); LCD_WriteString(&lcd, "Nunchuk Control");
|
||||
#endif
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
HAL_Delay(1000);
|
||||
nunchuk_connected = 1;
|
||||
}
|
||||
|
@ -452,7 +458,7 @@ int main(void) {
|
|||
enable = 0;
|
||||
buzzerFreq = 8;
|
||||
buzzerPattern = 1;
|
||||
} else if (timeoutFlagADC || timeoutFlagSerial) { // beep in case of ADC or Serial timeout - fast beep
|
||||
} else if (timeoutFlagADC || timeoutFlagSerial || timeoutCnt > TIMEOUT) { // beep in case of ADC timeout, Serial timeout or General timeout - fast beep
|
||||
buzzerFreq = 24;
|
||||
buzzerPattern = 1;
|
||||
} else if (TEMP_WARNING_ENABLE && board_temp_deg_c >= TEMP_WARNING) { // beep if mainboard gets hot
|
||||
|
@ -479,7 +485,7 @@ int main(void) {
|
|||
if (abs(speedL) > 50 || abs(speedR) > 50) {
|
||||
inactivity_timeout_counter = 0;
|
||||
} else {
|
||||
inactivity_timeout_counter ++;
|
||||
inactivity_timeout_counter++;
|
||||
}
|
||||
if (inactivity_timeout_counter > (INACTIVITY_TIMEOUT * 60 * 1000) / (DELAY_IN_MAIN_LOOP + 1)) { // rest of main loop needs maybe 1ms
|
||||
poweroff();
|
||||
|
@ -490,7 +496,7 @@ int main(void) {
|
|||
lastSpeedL = speedL;
|
||||
lastSpeedR = speedR;
|
||||
main_loop_counter++;
|
||||
timeout++;
|
||||
timeoutCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ extern uint8_t buzzerPattern; // global variable for the buzzer patter
|
|||
extern uint8_t enable; // global variable for motor enable
|
||||
|
||||
extern uint8_t nunchuk_data[6];
|
||||
extern volatile uint32_t timeout; // global variable for timeout
|
||||
extern volatile uint32_t timeoutCnt; // global variable for general timeout counter
|
||||
extern volatile uint32_t main_loop_counter;
|
||||
|
||||
#if defined(CONTROL_PPM_LEFT) || defined(CONTROL_PPM_RIGHT)
|
||||
|
@ -746,7 +746,7 @@ void readCommand(void) {
|
|||
button1 = !HAL_GPIO_ReadPin(BUTTON1_PORT, BUTTON1_PIN);
|
||||
button2 = !HAL_GPIO_ReadPin(BUTTON2_PORT, BUTTON2_PIN);
|
||||
#endif
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
#endif
|
||||
|
||||
#if defined(CONTROL_SERIAL_USART2) || defined(CONTROL_SERIAL_USART3)
|
||||
|
@ -776,7 +776,7 @@ void readCommand(void) {
|
|||
button1 = !HAL_GPIO_ReadPin(BUTTON1_PORT, BUTTON1_PIN);
|
||||
button2 = !HAL_GPIO_ReadPin(BUTTON2_PORT, BUTTON2_PIN);
|
||||
#endif
|
||||
timeout = 0;
|
||||
timeoutCnt = 0;
|
||||
#endif
|
||||
|
||||
#if defined(CONTROL_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2)
|
||||
|
@ -798,7 +798,7 @@ void readCommand(void) {
|
|||
#endif
|
||||
|
||||
#ifdef VARIANT_HOVERCAR
|
||||
brakePressed = (uint8_t)(cmd1 > 50);
|
||||
brakePressed = (uint8_t)(cmd1 > 50);
|
||||
#endif
|
||||
|
||||
#ifdef VARIANT_TRANSPOTTER
|
||||
|
|
Loading…
Reference in New Issue