[应用相关] 基于stm32的恒功率无线充电

[复制链接]
4106|34
 楼主| 和下土 发表于 2023-6-30 02:03 | 显示全部楼层
4.1.2 信号发射电路
信号发射电路采用现成的发射电路,如图4.2所示。发射的正弦波频率为150KHZ,发射功率高达60W左右。信号发射器包括发射控制器、主控电路、发射线圈、供电电源。 16910649dc765781a4.png 图4.2 信号发射电路
 楼主| 和下土 发表于 2023-6-30 02:03 | 显示全部楼层
4.1.3 无线接收电路板
无线充电接收板包括超级电容保护电路、LC谐振倍压整流电路、PWM控制电路、电压测量电路、电流测量电路、电源管理电路。

54242649dc7781f1c7.png 图4.3 无线接收电路板
 楼主| 和下土 发表于 2023-6-30 02:03 | 显示全部楼层
4.2 关键程序代码
4.2.1 传统PID算法代码
①PID结构体定义typedef struct PID_Add  
{  
  float pGain;        
  float iGain;         
  float dGain;         
  float err;         
  float last_err;   
  float prev_err;
  float pidout;  
}PID2;
 楼主| 和下土 发表于 2023-6-30 02:04 | 显示全部楼层
②增量式PID输出函数定义
  1. void Add_pid_update(PID2* pid)  
  2. {  
  3.     float ep,ei,ed;  
  4.     ep = pid->err - pid->last_err;  
  5.     ei = pid->err;  
  6.     ed = pid->err - 2*pid->last_err + pid->prev_err;  
  7.     pid->pidout = pid->pGain * ep + pid->iGain*ei + pid->dGain*ed;  
  8.     pid->prev_err = pid->last_err;  
  9.     pid->last_err = pid->err;  
  10. }
 楼主| 和下土 发表于 2023-6-30 02:04 | 显示全部楼层
③50ms中断中进行ADC读取、测量功率、计算误差,计算PID输出
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  
  2. {  
  3.     if (htim == (&htim2))  
  4.     {  
  5.             //计算40次取均值  
  6.             for(int i=0;i<40;i++)  
  7.             {  
  8.                 HAL_ADC_Start_DMA(&hadc1,ADC_Value,4);  
  9.                 voltage_ISN_sum+=ADC_Value[1]*3.3/4096.0*11;  
  10.                 electric_current_sum+=(ADC_Value[3]*33/4096.0-16.8);  
  11.             }  
  12.             voltage_ISN=voltage_ISN_sum/40;  
  13.             electric_current=electric_current_sum/40;  
  14.             voltage_ISN_sum=0;  
  15.             electric_current_sum=0;  
  16.             if(electric_current<0)  
  17.             {  
  18.                 electric_current=0;  
  19.             }  
  20.             //计算功率  
  21.             power=voltage_ISN*electric_current;  
  22.             //计算误差  
  23.             pid.err=power_want-power;  
  24.             //计算pid输出  
  25.             Add_pid_update(&pid);  
  26.             //将输出与原来的占空比叠加  
  27.             duty+=(int)pid.pidout;  
  28.             if(duty>100)//限制功率  
  29.             {  
  30.                 duty=100;  
  31.             }  
  32.             if(duty<0)  
  33.             {  
  34.                 duty=0;  
  35.             }  
  36.             //duty=40;  
  37.             Set_Tim3_Duty(&htim3,duty);  
  38.              //串口发送数据  
  39.             printf("%04.2f %04.2f %04.2f %03d %04.2f\r\n",voltage_ISN,electric_current,power,duty,pid.err);  
  40.     }  
  41. }
 楼主| 和下土 发表于 2023-6-30 02:04 | 显示全部楼层
4.2.2积分系数改进(理解不深,可能有错误)
在中断函数中加入下面代码
  1. if(pid.err<-2.2)  //超出10W,增大i消去尖峰  
  2. {  
  3.     pid.iGain=25;  
  4. }  
  5. else  
  6. {  
  7.     pid.iGain=0.5;  
  8. }
 楼主| 和下土 发表于 2023-6-30 02:04 | 显示全部楼层
4.3 实验结果
4.3.1 固定占空比与PID算法的对比
图4.4~4.7为在占空比等于100的情况下测得的数据,图4.8~4.11为使用PID算法恒定10W的情况下测得的数据,图4.12~4.15为使用PID算法恒定20W的情况下测得的数据。由于数据串口回传是放在中断函数中的,所以各个图中的数据点数可以代表时间。
由图4.4~4.7与图4.8~4.11对比可知,使用PID算法之后充电功率稳定在了10W左右,而没有使用PID算法时,最后电流很容易变得接近于0而导致充不了电。
 楼主| 和下土 发表于 2023-6-30 02:05 | 显示全部楼层
由图4.4~4.7与图4.12~4.15对比可知,从两者的电压变化情况来看,20W的恒功率充电在数据点数等于7000时,超级电容电压已超过10V,而占空比等于100的充电方式下,数据点个数为7000时,超级电容电压维持在9V而不能上升,这说明了恒功率充电可以在超级电容电压较高时维持充电功率,提高充电速度和效率。
 楼主| 和下土 发表于 2023-6-30 02:05 | 显示全部楼层
 楼主| 和下土 发表于 2023-6-30 02:05 | 显示全部楼层
4.3.2 PID算法改进前后的对比
由图可见,在改进之前,达到稳定时,电流可以飘升到4A,功率曲线出现16W的尖峰,而改进之后,电流没有飘升,功率曲线出现尖峰大大减小,变为12W左右。
21778649dc7f73cee8.png
 楼主| 和下土 发表于 2023-6-30 02:06 | 显示全部楼层
总结
5.1 实验中遇到的问题,怎样解决的 20396649dc80add2ec.png
 楼主| 和下土 发表于 2023-6-30 02:06 | 显示全部楼层
附录
硬件电路图: 23374649dc81c97963.png
 楼主| 和下土 发表于 2023-6-30 02:06 | 显示全部楼层
 楼主| 和下土 发表于 2023-6-30 02:06 | 显示全部楼层
Matlab画图程序:
  1. % 关闭所有的Figure窗口  
  2. close all;   
  3. % 清除工作空间的所有变量,函数,和MEX文件  
  4. clear all;  
  5.   
  6. % 加载数据文件,并命名为A  
  7. A = load('data_add.txt');  
  8. % 矩阵A的规模,[行,列]  
  9. [m,n] = size(A);  
  10.   
  11. % 绘制txt文件第一列的数据s  
  12. figure(1);  
  13. plot(A(:,1));  
  14. axis([0 10000 0 10]);   
  15. % 横坐标  
  16. xlabel('数据点数(个)');  
  17. % 纵坐标  
  18. ylabel('幅值(V)');  
  19. % 标题  
  20. title('电压波形图');  
  21.   
  22. figure(2);  
  23. plot(A(:,2));  
  24. axis([0 10000 0 10]);   
  25. % 横坐标  
  26. xlabel('数据点数(个)');  
  27. % 纵坐标  
  28. ylabel('幅值(A)');  
  29. % 标题  
  30. title('电流波形图');  
  31.   
  32. figure(3);  
  33. plot(A(:,3));  
  34. axis([0 10000 0 15]);   
  35. % 横坐标  
  36. xlabel('数据点数(个)');  
  37. % 纵坐标  
  38. ylabel('幅值(W)');  
  39. % 标题  
  40. title('功率波形图');  
  41.   
  42. figure(4);  
  43. plot(A(:,4));  
  44. axis([0 10000 0 120]);   
  45. % 横坐标  
  46. xlabel('数据点数(个)');  
  47. % 纵坐标  
  48. ylabel('幅值(%)');  
  49. % 标题  
  50. title('占空比波形图');
 楼主| 和下土 发表于 2023-6-30 02:06 | 显示全部楼层
代码:https://gitee.com/guoxianda/Constant-power-wireless-charging-based-on-stm32
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部