Skip to content

Dangerous error produced in speed calculation for EBiCS display method #28

@wuwbobo2021

Description

@wuwbobo2021

In case of 2.2 m of wheel circumference, single magnet in the spokes:

#define WHEEL_CIRCUMFERENCE 2200
#define PULSES_PER_REVOLUTION 1

When the speed reaches 4r/s (4 * 2.2 * 3.6 = 31.68 km/h), the interval measured by TIM3 is (1/f)/[1/(64M/7814)] = 8190/f = 8190/4 = 2048; the value in EBiCS is [(int)2200 / ((int)2048 >> 3)] * 36 / 10 = 28.8, nearly 2 km/h error produced.

you can draw two functions in the calculator

y = 2.2*3.6*x
y = 3.6*floor(2200/floor(8190/x/8))

to see the maximum error 4.3 km/h. 29 km/h will be shown as 25 km/h!

I have extracted related code from your project (with many unindented code):

int main(void)
{
	...
	while (1)
	{
		...
		// SPEED signal processing
		if (ui8_SPEED_flag) {
			if(uint32_SPEED_counter > 200) { //debounce
				MS.Speed = uint32_SPEED_counter;
				uint32_SPEED_counter = 0;
				ui8_SPEED_flag = 0;
			}
		}
		...
		if (ui32_tim3_counter > 500) {
			if(uint32_SPEED_counter > 127999)
				MS.Speed = 128000;
			...
			ui8_slowloop_counter++;
			if (ui8_slowloop_counter > 3) {
				ui8_slowloop_counter = 0;
				send_ant_page(0, &MS, &MP);
			}
			ui32_tim3_counter = 0;
		}
		...
	}
}

// elapse frequency of TIM3 is 64M/7814 (Hz), interval is about 122.1 us
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim == &htim3) {
		if(ui32_tim3_counter < 32000)
			ui32_tim3_counter++;
		...
		if (uint32_SPEED_counter < 128000)
			uint32_SPEED_counter++; //counter for external Speed sensor
	}
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	...
	//Speed processing
	if(GPIO_Pin == Speed_EXTI5_Pin)
		ui8_SPEED_flag = 1; //with debounce

}

void send_ant_page(uint8_t page, MotorState_t* MS, MotorParams_t* MP)
{
	...
	// *3,6 for km/h then *10 for LEV standard definition.
	uint16_t speedx10 = MP->wheel_cirumference / ((MS->Speed*MP->pulses_per_revolution) >> 3) * 36;
	
	ui8_tx_buffer[9] = speedx10 & 0xFF; //low byte of speed
	ui8_tx_buffer[10] = speedx10>>8 & 0x07; //lower 3 Bytes(needs correction) of high byte
	...
	HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&ui8_tx_buffer, 12);
}

Thanks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions