③50ms中断中进行ADC读取、测量功率、计算误差,计算PID输出void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&htim2))
{
//计算40次取均值
for(int i=0;i<40;i++)
{
HAL_ADC_Start_DMA(&hadc1,ADC_Value,4);
voltage_ISN_sum+=ADC_Value[1]*3.3/4096.0*11;
electric_current_sum+=(ADC_Value[3]*33/4096.0-16.8);
}
voltage_ISN=voltage_ISN_sum/40;
electric_current=electric_current_sum/40;
voltage_ISN_sum=0;
electric_current_sum=0;
if(electric_current<0)
{
electric_current=0;
}
//计算功率
power=voltage_ISN*electric_current;
//计算误差
pid.err=power_want-power;
//计算pid输出
Add_pid_update(&pid);
//将输出与原来的占空比叠加
duty+=(int)pid.pidout;
if(duty>100)//限制功率
{
duty=100;
}
if(duty<0)
{
duty=0;
}
//duty=40;
Set_Tim3_Duty(&htim3,duty);
//串口发送数据
printf("%04.2f %04.2f %04.2f %03d %04.2f\r\n",voltage_ISN,electric_current,power,duty,pid.err);
}
}
|