③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);
- }
- }
|