ST电机库没有带母线电流采样,所以这里提供一种方法添加,如果在生成代码前,那么直接在cubu里加个ADC就好,如果在生成代码后不想改了就用我这种方法。
#include "power_stage_parameters.h"
#include "stm32g4xx_hal.h"
#include "MC_type.h"
#include "regular_conversion_manager.h"
#include "r_divider_bus_voltage_sensor.h"
#include "bus_voltage_sensor.h"
#include "parameters_conversion.h"
RDivider_Handle_t *BUS_Curr;
uint16_t RealBusCurrSensorFilterBufferM1[6];
RDivider_Handle_t BUS_CurrParamsM1 =
{
._Super =
{
.SensorType = REAL_SENSOR,
.ConversionFactor =(uint16_t)3.3,//(uint16_t)(ADC_REFERENCE_VOLTAGE / VBUS_PARTITIONING_FACTOR),
},
.VbusRegConv =
{
.regADC = ADC2, //改成你自己的通道
.channel =MC_ADC_CHANNEL_17,
.samplingTime = LL_ADC_SAMPLING_CYCLE(47),
},
.LowPassFilterBW = 6, //M1_VBUS_SW_FILTER_BW_FACTOR,
.OverVoltageThreshold = 65535,//OVERVOLTAGE_THRESHOLD_d,
.UnderVoltageThreshold = 0,//UNDERVOLTAGE_THRESHOLD_d,
.aBuffer = RealBusCurrSensorFilterBufferM1,
};
void RVBS_CalcAvBusCurr( RDivider_Handle_t * pHandle )
{
uint32_t wtemp;
uint16_t hAux;
uint8_t i;
hAux = RCM_ExecRegularConv(pHandle->convHandle);
if ( hAux != 0xFFFF )
{
pHandle->aBuffer[pHandle->index] = hAux;
wtemp = 0;
for ( i = 0; i < pHandle->LowPassFilterBW; i++ )
{
wtemp += pHandle->aBuffer[i];
}
wtemp /= pHandle->LowPassFilterBW;
pHandle->_Super.AvBusVoltage_d = ( uint16_t )wtemp;
pHandle->_Super.LatestConv = hAux;
if ( pHandle->index < pHandle->LowPassFilterBW - 1 )
{
pHandle->index++;
}
else
{
pHandle->index = 0;
}
}
}
然后初始化一下,在循环里调用RVBS_CalcAvBusCurr就好
BUS_Curr = &BUS_CurrParamsM1; //初始化
RVBS_Init(BUS_Curr);
当然ADC初始化里和gpio初始化里加入你自己的引脚
然后就读到原始数据了,做个处理就好