diff --git a/riscv-bldc-forced-commutation/riscv-bldc b/riscv-bldc-forced-commutation/riscv-bldc index e214c59..2074b1a 100755 Binary files a/riscv-bldc-forced-commutation/riscv-bldc and b/riscv-bldc-forced-commutation/riscv-bldc differ diff --git a/riscv-bldc-forced-commutation/src/riscv-bldc.cpp b/riscv-bldc-forced-commutation/src/riscv-bldc.cpp index fe44f66..03934c0 100644 --- a/riscv-bldc-forced-commutation/src/riscv-bldc.cpp +++ b/riscv-bldc-forced-commutation/src/riscv-bldc.cpp @@ -40,17 +40,6 @@ std::array senseTable { //! channels to sense during the applied pa SENSU_N, //5 SENSV_P //6 }; -std::array startupDelays{ -/* - 200, 150, 100, 80, 70, 65, - 60, 55, 50, 45, 40, 35, - 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25 -*/ - 150, 90, 70, 50, 40, 35, - 30, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25 -}; bool ccw=false; @@ -156,12 +145,8 @@ unsigned read_adc(unsigned channel){ * Since Timer/Counter1 is used in this function, it must never be called when * sensorless operation is running. */ -void fixed_delay(unsigned short delay){ - pwm0::oneshot_delay(STARTUP_DELAY_MULTIPLIER*delay); -} - unsigned short measured_zc_time(unsigned short max_delay){ - long delay_us = max_delay * STARTUP_DELAY_MULTIPLIER; + long delay_us = max_delay; auto scaling_factor=0; while(delay_us/(1< std::numeric_limits::max()){ scaling_factor++; @@ -200,20 +185,23 @@ void next_commutation_step(void) { } void start_open_loop(void){ + auto delay = 30120U; + std::array multiplier={0.83, 1.0}; nextCommutationStep = 0; //Preposition. gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK) | driveTable[nextCommutationStep]; - fixed_delay(STARTUP_LOCK_DELAY); + //fixed_delay(STARTUP_LOCK_DELAY); + pwm0::oneshot_delay(STARTUP_DELAY); next_commutation_step(); auto nextDrivePattern = driveTable[nextCommutationStep]; - const size_t size=startupDelays.size(); - for (size_t i = 0; i < startupDelays.size()+6*10; i++){ + for (size_t i = 0; i < 12; i++){ gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK & 0x00ffffff) | nextDrivePattern | nextCommutationStep<<24; auto channel=senseTable[nextCommutationStep]&0x3; auto zcPolRise = senseTable[nextCommutationStep]<4; auto bemf_0=read_adc(channel); - fixed_delay(startupDelays[i>=size?size-1:i]); + delay*=multiplier[(i/6)%multiplier.size()]; + pwm0::oneshot_delay(delay); auto bemf_1=read_adc(channel); auto bemf = bemf_1>bemf_0?bemf_1-bemf_0:bemf_0-bemf_1; next_commutation_step(); @@ -229,8 +217,7 @@ void run_closed_loop(void){ for(;;){ gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK & 0x00ffffff) | nextDrivePattern | nextCommutationStep<<24; - zc_delay=measured_zc_time(500); - pwm0::oneshot_delay(zc_delay); + zc_delay=measured_zc_time(50000); next_commutation_step(); nextDrivePattern = driveTable[nextCommutationStep]; } diff --git a/riscv-bldc-forced-commutation/src/riscv-bldc.h b/riscv-bldc-forced-commutation/src/riscv-bldc.h index bf91dd7..0a05ca8 100644 --- a/riscv-bldc-forced-commutation/src/riscv-bldc.h +++ b/riscv-bldc-forced-commutation/src/riscv-bldc.h @@ -29,13 +29,11 @@ enum { DRIVE_MASK=(1<