前言
硬件配置
1.定时器的配置
2.adc的配置
程序配置
1、中断使能
2、中断响应
3、接口函数
调试测试
总结
前期的工作, simpleFoc开环控制已经完成了,实现完整的闭环控制,就差两相电流检测了,主要设计思路是来源于odrive,用产生pwm波的定时器update事件,触发两路adc 注入式采样。
硬件管脚分配 ib-----adc in0
ic-----adc in1
由于在电路原理图设计时,为了方便走线,L6234的OUT1直接拉到了三相柱的中间,程序上也默认了OUT1,2,3对应的是A,B,C。所以电流检测时,定义为:IB,IC的检测。
电流IB的配置
电流IC的配置
使得定时器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;
}
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");
}
// 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);
}
整个串口调试,接收数据来看。电流检测部分成功移植。整个个移植工作都以完成,剩下的只是针对力矩,速度,角度等闭环调试了。