Changed delay calculation for open loop commutation
This commit is contained in:
		@@ -40,17 +40,6 @@ std::array<uint32_t, 6> senseTable { //! channels to sense during the applied pa
 | 
			
		||||
    SENSU_N, //5
 | 
			
		||||
    SENSV_P  //6
 | 
			
		||||
};
 | 
			
		||||
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, 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<<scaling_factor) > std::numeric_limits<unsigned short>::max()){
 | 
			
		||||
        scaling_factor++;
 | 
			
		||||
@@ -200,20 +185,23 @@ void next_commutation_step(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void start_open_loop(void){
 | 
			
		||||
    auto delay = 30120U;
 | 
			
		||||
    std::array<double, 2> 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];
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,11 @@ enum {
 | 
			
		||||
    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=150;
 | 
			
		||||
/*!
 | 
			
		||||
 *  Number of milliseconds to lock rotor in first commutation step before
 | 
			
		||||
 *  Number of 10 microseconds to lock rotor in first commutation step before
 | 
			
		||||
 *  the timed startup sequence is initiated.
 | 
			
		||||
 */
 | 
			
		||||
const auto STARTUP_LOCK_DELAY=1000;
 | 
			
		||||
const auto STARTUP_DELAY=25000U;
 | 
			
		||||
 | 
			
		||||
extern "C" void handle_m_ext_interrupt();
 | 
			
		||||
extern "C" void handle_m_time_interrupt();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user