Changed naming of constants and formatting
This commit is contained in:
		| @@ -7,7 +7,6 @@ | ||||
| //============================================================================ | ||||
|  | ||||
| #include "riscv-bldc.h" | ||||
| #include "peripherals.h" | ||||
| #include "delay.h" | ||||
| #include "bsp.h" | ||||
| #include "plic/plic_driver.h" | ||||
| @@ -15,42 +14,46 @@ | ||||
| #include <cstdio> | ||||
| #include <cstdint> | ||||
|  | ||||
| volatile uint32_t nextCommutationStep; | ||||
| #include "hifive1_io.h" | ||||
|  | ||||
| std::array<uint32_t, 6> cwDriveTable { //! Drive pattern for commutation, CW rotation | ||||
|     ((1 << VH) | (1 << WL)), ((1 << UH) | (1 << WL)), ((1 << UH) | (1 << VL)), | ||||
|     ((1 << WH) | (1 << VL)), ((1 << WH) | (1 << UL)), ((1 << VH) | (1 << UL)) | ||||
| volatile uint32_t nextCommutationStep; | ||||
| /* | ||||
| Kommutierungsblöcke | ||||
|     1   2   3   4   5   6 | ||||
| U   0   z   +1  +1  z   0 | ||||
| V   +1  +1  z   0   0   z | ||||
| W   z   0   0   z   +1  +1 | ||||
| */ | ||||
| std::array<uint32_t, 6> driveTable { //! Drive pattern for commutation, CW rotation | ||||
|             ((1 << VH) | (1 << UL)), //1 | ||||
|             ((1 << VH) | (1 << WL)), //2 | ||||
|             ((1 << UH) | (1 << WL)), //3 | ||||
|             ((1 << UH) | (1 << VL)), //4 | ||||
|             ((1 << WH) | (1 << VL)), //5 | ||||
|             ((1 << WH) | (1 << UL))  //6 | ||||
| }; | ||||
| std::array<uint32_t, 6> cwSenseTable { //! channels to sense during the applied pattern | ||||
|     SENSU_P,                 SENSV_N,                 SENSW_P, | ||||
|     SENSU_N,                 SENSV_P,                 SENSW_N | ||||
| std::array<uint32_t, 6> senseTable { //! channels to sense during the applied pattern | ||||
|     SENSW_N, //1 | ||||
|     SENSU_P, //2 | ||||
|     SENSV_N, //3 | ||||
|     SENSW_P, //4 | ||||
|     SENSU_N, //5 | ||||
|     SENSV_P  //6 | ||||
| }; | ||||
| std::array<uint32_t, 6> ccwDriveTable{ //! Drive pattern for commutation, CCW rotation. | ||||
|     ((1 << UL) | (1 << VH)), ((1 << UL) | (1 << WH)), ((1 << VL) | (1 << WH)), | ||||
|     ((1 << VL) | (1 << UH)), ((1 << WL) | (1 << UH)), ((1 << WL) | (1 << VH)) | ||||
| }; | ||||
| std::array<uint32_t, 6> ccwSenseTable { //! channels to sense during the applied pattern | ||||
|     SENSW_P,                 SENSV_N,                 SENSU_P, | ||||
|     SENSW_N,                 SENSV_P,                 SENSU_N | ||||
| }; | ||||
| std::array<unsigned int, 24> startupDelays{ | ||||
| std::array<unsigned int, 18> 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, 50, 50, | ||||
|      50, 50, 50, 40, 40, 40, | ||||
|      40, 40, 40, 30, 30, 30, | ||||
|      30, 30, 30, 25, 25, 25, | ||||
|     150, 90, 70, 50, 40, 35, | ||||
|      30, 25, 25, 25, 25, 25, | ||||
|      25, 25, 25, 25, 25, 25 | ||||
| }; | ||||
|  | ||||
| bool ccw=false; | ||||
|  | ||||
| auto& driveTable = ccw?ccwDriveTable:cwDriveTable; | ||||
| auto& senseTable = ccw?ccwSenseTable:cwSenseTable; | ||||
|  | ||||
| typedef void (*function_ptr_t) (void); | ||||
| // Instance data for the PLIC. | ||||
| plic_instance_t g_plic; | ||||
| @@ -157,7 +160,7 @@ void fixed_delay(unsigned short delay){ | ||||
|     pwm0::oneshot_delay(STARTUP_DELAY_MULTIPLIER*delay); | ||||
| } | ||||
|  | ||||
| unsigned short measured_zc_time(unsigned short max_delay, unsigned state){ | ||||
| unsigned short measured_zc_time(unsigned short max_delay){ | ||||
|     long delay_us = max_delay * STARTUP_DELAY_MULTIPLIER; | ||||
|     auto scaling_factor=0; | ||||
|     while(delay_us/(1<<scaling_factor) > std::numeric_limits<unsigned short>::max()){ | ||||
| @@ -174,24 +177,37 @@ unsigned short measured_zc_time(unsigned short max_delay, unsigned state){ | ||||
|     uint32_t adc_res=0; | ||||
|     do{ | ||||
|         adc_res=read_adc(channel); | ||||
|         if((zc_neg && adc_res<2048) || (!zc_neg && adc_res>2047)){ | ||||
|         if((zc_neg && adc_res<2048) || (!zc_neg && adc_res>2047)) | ||||
|             break; | ||||
|         } | ||||
|     } while(pwm0::is_active()); | ||||
|     uint32_t sreg = pwm0::s_reg(); | ||||
|     pwm0::cfg_reg().enoneshot=false; | ||||
|     return sreg*(1<<scaling_factor); | ||||
| } | ||||
|  | ||||
| void next_commutation_step(void) { | ||||
|     if (ccw) { | ||||
|         if (nextCommutationStep == 0) | ||||
|             nextCommutationStep = 0; | ||||
|         else | ||||
|             nextCommutationStep--; | ||||
|     } else { | ||||
|         if (nextCommutationStep == 5) | ||||
|             nextCommutationStep = 0; | ||||
|         else | ||||
|             nextCommutationStep++; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void start_motor(void){ | ||||
|     nextCommutationStep = 0; | ||||
|     //Preposition. | ||||
|     gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK) | driveTable[nextCommutationStep]; | ||||
|     fixed_delay(STARTUP_LOCK_DELAY); | ||||
|     nextCommutationStep++; | ||||
|     next_commutation_step(); | ||||
|     auto nextDrivePattern = driveTable[nextCommutationStep]; | ||||
|     const size_t size=startupDelays.size(); | ||||
|     for (size_t i = 0; i < startupDelays.size()+10; i++){ | ||||
|     for (size_t i = 0; i < startupDelays.size()+6*10; i++){ | ||||
|         gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK & 0x00ffffff) | ||||
|                 | nextDrivePattern | nextCommutationStep<<24; | ||||
|         auto channel=senseTable[nextCommutationStep]&0x3; | ||||
| @@ -200,10 +216,7 @@ void start_motor(void){ | ||||
|         fixed_delay(startupDelays[i>=size?size-1:i]); | ||||
|         auto bemf_1=read_adc(channel); | ||||
|         auto bemf = bemf_1>bemf_0?bemf_1-bemf_0:bemf_0-bemf_1; | ||||
|         nextCommutationStep++; | ||||
|         if (nextCommutationStep >= 6){ | ||||
|             nextCommutationStep = 0; | ||||
|         } | ||||
|         next_commutation_step(); | ||||
|         nextDrivePattern = driveTable[nextCommutationStep]; | ||||
| //        if(i>12 && bemf>32 && ((zcPolRise && bemf_0<2048 && bemf_1>2047) || (!zcPolRise && bemf_0>2047 && bemf_1<2048))) | ||||
| //            return; | ||||
| @@ -214,16 +227,14 @@ void run_motor(void){ | ||||
|     auto count=0; | ||||
|     auto zc_delay=0U; | ||||
|     auto tmp=0U; | ||||
|     auto nextDrivePattern = driveTable[nextCommutationStep]; | ||||
|     for(;;){ | ||||
|         gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK & 0x00ffffff) | ||||
|                 | driveTable[nextCommutationStep] | nextCommutationStep<<24; | ||||
|         zc_delay=measured_zc_time(50,  senseTable[nextCommutationStep]); | ||||
| //        tmp=zc_delay>>2; | ||||
| //        pwm0::oneshot_delay(zc_delay>tmp?zc_delay:zc_delay/2+zc_delay/4+zc_delay/8); | ||||
|                 | nextDrivePattern | nextCommutationStep<<24; | ||||
|         zc_delay=measured_zc_time(500); | ||||
|         pwm0::oneshot_delay(zc_delay); | ||||
|         nextCommutationStep++; | ||||
|         if (nextCommutationStep >= 6) | ||||
|             nextCommutationStep = 0; | ||||
|         next_commutation_step(); | ||||
|         nextDrivePattern = driveTable[nextCommutationStep]; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -20,24 +20,22 @@ enum { | ||||
|     VH=10,     //! Port pin connected to phase V, high side enable switch. | ||||
|     WL=19,     //! Port pin connected to phase W, low side enable switch. | ||||
|     WH=20,     //! Port pin connected to phase W, high side enable switch. | ||||
|     CW=0,      //! Clockwise rotation flag. | ||||
|     CCW=1,     //! Counterclockwise rotation flag. | ||||
|     SENSU_P=0, //! Phase U voltage to sense | ||||
|     SENSV_P=1, //! Phase V voltage to sense | ||||
|     SENSW_P=2, //! Phase W voltage to sense | ||||
|     SENSU_N=4, //! Phase U voltage to sense | ||||
|     SENSV_N=5, //! Phase V voltage to sense | ||||
|     SENSW_N=6, //! Phase W voltage to sense | ||||
|     SENSU_P=0, //! Phase U voltage to sense positive zero cross | ||||
|     SENSV_P=1, //! Phase V voltage to sense positive zero cross | ||||
|     SENSW_P=2, //! Phase W voltage to sense positive zero cross | ||||
|     SENSU_N=4, //! Phase U voltage to sense negative zero cross | ||||
|     SENSV_N=5, //! Phase V voltage to sense negative zero cross | ||||
|     SENSW_N=6, //! Phase W voltage to sense negative zero cross | ||||
|     DRIVE_MASK=(1<<UL)|(1<<UH)| (1<<VL)|(1<<VH)| (1<<WL)|(1<<WH) | ||||
| }; | ||||
|  | ||||
| //! Startup delays are given in microseconds times STARTUP_DELAY_MULTIPLIER. | ||||
| const auto STARTUP_DELAY_MULTIPLIER=1000; | ||||
| const auto STARTUP_DELAY_MULTIPLIER=150; | ||||
| /*! | ||||
|  *  Number of milliseconds to lock rotor in first commutation step before | ||||
|  *  the timed startup sequence is initiated. | ||||
|  */ | ||||
| const auto STARTUP_LOCK_DELAY=200; | ||||
| const auto STARTUP_LOCK_DELAY=1000; | ||||
|  | ||||
| extern "C" void handle_m_ext_interrupt(); | ||||
| extern "C" void handle_m_time_interrupt(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user