手把手移植 simpleFOC (五):电流检测 篇

文章目录

前言

硬件配置

1.定时器的配置

2.adc的配置

程序配置

1、中断使能

2、中断响应

3、接口函数

调试测试

总结


前言

前期的工作, simpleFoc开环控制已经完成了,实现完整的闭环控制,就差两相电流检测了,主要设计思路是来源于odrive,用产生pwm波的定时器update事件,触发两路adc 注入式采样。

硬件管脚分配   ib-----adc in0

                         ic-----adc in1


硬件配置

1.定时器的配置

手把手移植 simpleFOC (五):电流检测 篇_第1张图片

2.adc的配置

由于在电路原理图设计时,为了方便走线,L6234的OUT1直接拉到了三相柱的中间,程序上也默认了OUT1,2,3对应的是A,B,C。所以电流检测时,定义为:IB,IC的检测。

电流IB的配置

手把手移植 simpleFOC (五):电流检测 篇_第2张图片


 电流IC的配置

手把手移植 simpleFOC (五):电流检测 篇_第3张图片

程序配置

1、中断使能

使得定时器1的update事件能触发adc的转换,并能顺利进入转换结束中断响应

// function reading an ADC value and returning the read voltage
void* _configureADCInline(const void* driver_params, const int pinA,const int pinB,const int pinC){
  _UNUSED(driver_params);

  // if( _isset(pinA) ) pinMode(pinA, INPUT);
  // if( _isset(pinB) ) pinMode(pinB, INPUT);
  // if( _isset(pinC) ) pinMode(pinC, INPUT); 

  Stm32CurrentSenseParams* params = new Stm32CurrentSenseParams {
    .pins = { pinA, pinB, pinC },
    .adc_voltage_conv = (_ADC_VOLTAGE_F1)/(_ADC_RESOLUTION_F1)
  };

  __HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
  HAL_ADCEx_InjectedStart(&hadc1);
  __HAL_ADC_ENABLE_IT(&hadc2, ADC_IT_JEOC);
  HAL_ADCEx_InjectedStart(&hadc2);

  return params;
}

2、中断响应

 uint32_t ADCValue;
    
    ADCValue = HAL_ADCEx_InjectedGetValue(hadc, ADC_INJECTED_RANK_1);
    
    
    if (hadc == &hadc1) {
        adc_val_pinIB = ADCValue;
        // printf("2");
        //return;
    } else {
        adc_val_pinIC = ADCValue;
        // printf("3");
    }

3、接口函数

// function reading an ADC value and returning the read voltage
float _readADCVoltageInline(const int pin_index, const void* cs_params){
  uint32_t raw_adc = 0;//analogRead(pinA);
  switch(pin_index)
  {
    case 1:break;
    case 2:{
      raw_adc= adc_val_pinIB;
      // printf("--42--");
      }break;
    case 3:{
      raw_adc= adc_val_pinIC;
      // printf("--43--");
      }break;
    default:break;
  }
  return raw_adc * ((Stm32CurrentSenseParams*)cs_params)->adc_voltage_conv;
}

调试测试

从接口函数的设计来看,初始化部分如下(pina不设置,2,3只是代表ib,ic不是实际的管脚),在整个个移植个过程中,pin的传参数,并没有去参与底层的驱动,因为整个驱动是用stm32cubeMX生成的。只是在部分上不改动 simpleFoc上层代码上,作为一些选择,匹配使用。

InlineCurrentSense current_sense = InlineCurrentSense(0.01f, 50.0f, NOT_SET,2,3);

BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
InlineCurrentSense current_sense = InlineCurrentSense(0.01f, 50.0f, NOT_SET,2,3);

void setup() {
  
 // initialise the current sensing
  current_sense.init();

  // for SimpleFOCShield v2.01/v2.0.2
  current_sense.gain_b *= -1;  

  driver.pwm_frequency = 50000;
  // power supply voltage [V]
  driver.voltage_power_supply = 12;
  // Max DC voltage allowed - default voltage_power_supply
  driver.voltage_limit = 6;

  // driver init
  driver.init();

  // enable driver
  driver.enable();

  Serial.begin(115200);
  Serial.println("Current sense ready.");
  // _delay(1000);
  // driver.setPwm(3,6,5);
}

// int dex=1;
void loop() {
	 PhaseCurrent_s currents = current_sense.getPhaseCurrents();
    float current_magnitude = current_sense.getDCCurrent();

    HAL_ADC_Start(&hadc1);

    Serial.print(currents.a*1000); // milli Amps
    Serial.print("\t");
    Serial.print(currents.b*1000); // milli Amps
    Serial.print("\t");
    Serial.print(currents.c*1000); // milli Amps
    Serial.print("\t");
    Serial.print(current_magnitude*1000); // milli Amps
    Serial.print("\t");
    float dcValue=get_vbus_sense_value();
    Serial.println(dcValue,2);

    _delay(1000);
}

总结

整个串口调试,接收数据来看。电流检测部分成功移植。整个个移植工作都以完成,剩下的只是针对力矩,速度,角度等闭环调试了。

你可能感兴趣的:(stm32,simplefoc,foc电流检测)