基于STM32F103C8T6的同步电机驱动-电流采样去直流偏置
本系列文章:
- 基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用
- 基于STM32F103C8T6的同步电机驱动-PWM驱动代码以及SVPWM的实现
- 基于STM32F103C8T6的同步电机驱动-ADC采样与基于MT6701的角度获取
- 基于STM32F103C8T6的同步电机驱动-电流采样去直流偏置
ADC采样去直流偏置代码编写
/****file:my_adc.c*****/
//ADC相关参数
uint16_t ADC_Value[4]={0}; //存储ADC采样值,范围为0-4095
_iq i_a_offect; //存储电流采样补偿值
_iq i_b_offect; //存储电流采样补偿值
_iq i_dc_offect; //存储电流采样补偿值
_iq i_a;
_iq i_b;
_iq i_dc;
_iq i_a_sum;
_iq i_b_sum;
_iq i_dc_sum;
/**********************************************************************
* 函数名称: get_ADCvalue
* 功能描述: ADC采样函数
* 输入参数: 无
* 返 回 值: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2024/07/05 V1.0 TONY0925 创建
***********************************************************************/
void get_ADCvalue(void)
{
for(int i=0;i<4;i++)
{
HAL_ADC_Start(&hadc1);
ADC_Value[i]= HAL_ADC_GetValue(&hadc1);
}
}
/**********************************************************************
* 函数名称: get_Current_offect
* 功能描述: 获取电流采样的补偿值
* 输入参数: 无
* 返 回 值: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2024/07/05 V1.0 TONY0925 创建
***********************************************************************/
void get_Current_offect(void)
{
for(uint16_t i=0;i<999;i++)
{
get_ADCvalue();
i_a = _IQmpy(_IQmpy(_IQ(ADC_Value[2]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
i_b = _IQmpy(_IQmpy(_IQ(ADC_Value[3]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
i_dc = _IQmpy(_IQmpy(_IQ(ADC_Value[0]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2));
i_a_sum = i_a_sum + i_a;
i_b_sum = i_b_sum + i_b;
i_dc_sum = i_dc_sum + i_dc;
}
i_a_offect = _IQmpy( i_a_sum , _IQ(0.001) );
i_b_offect = _IQmpy( i_b_sum , _IQ(0.001) );
i_dc_offect = _IQmpy( i_dc_sum , _IQ(0.001) );
}
在正式运行TIM4中断之前,先对电流采样进行直流偏置量计算,在后续每次计算电流值时减去直流偏置量即可
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_CAN_Init();
MX_SPI1_Init();
MX_TIM1_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
HAL_ADCEx_Calibration_Start(&hadc1); //AD校准
get_Current_offect();
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, PWM1_PULSE);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, PWM2_PULSE);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, PWM3_PULSE);
__HAL_TIM_SET_AUTORELOAD(&htim4,2-1); //设置要输出的PWM脉冲数1000个
HAL_TIM_Base_Start_IT(&htim4); //启动从定时器
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
while (1)
{
}
}