找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5025|回复: 5
收起左侧

STM32逆变器spwm源码+原理图PCB文件+vb上位机源程序

  [复制链接]
ID:828038 发表于 2020-10-10 21:51 | 显示全部楼层 |阅读模式
逆变器spwm仿真源码,可以下载

vb上位机源程序
51hei.png
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png 51hei.png
51hei.png

STM32单片机源程序如下:
  1. /****************************************************************
  2. *文件名称:
  3. *文件标示:
  4. *摘要         :
  5. *
  6. *
  7. *当前版本:v1.0
  8. *作者         :苹安
  9. *****************************************************************/

  10. #include "includes.h"
  11. #include "math.h"

  12. __align(8) static OS_STK         TaskStartStk[500];
  13. __align(8) static OS_STK        TaskLedStk[500];


  14. #define START_PRIO                1u
  15. #define LED_PRIO                        5u


  16. OS_EVENT        * spk;
  17. OS_EVENT        * lcd;
  18. OS_EVENT         * time_10;


  19. static void TaskStart( void *parg);
  20. static void TaskLed(void *parg);
  21. void MenusTask( void *parg);

  22. int main()

  23. {


  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  25.         OSInit();
  26.         
  27.         spk=OSSemCreate( 1 );
  28.         lcd=OSSemCreate( 1 );
  29.         time_10=OSSemCreate( 1 );


  30.         OSTaskCreateExt( TaskStart,
  31.                                                                          (void *)0,
  32.                                                                          &TaskStartStk[500-1],
  33.                                                                          START_PRIO,
  34.                                                                          START_PRIO,
  35.                                                                          TaskStartStk,
  36.                                                                          500,
  37.                                                                          ( void *)0,
  38.                                                                          OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);        
  39.                                                         
  40.         OSStart();
  41.         return 0;
  42. }

  43. //#include "math.h"
  44. static float x_est_last1 = 0;
  45. static float P_last1 = 0;
  46. /*/the noise in the system */
  47. static float Q1 = 0.1;
  48. static float R1 = 0.8;

  49. static float K1;
  50. static float P1;
  51. static float P_temp1;
  52. static float x_temp_est1;
  53. static float x_est1;
  54. static float z_measured1; /*/the 'noisy' value we measured  */
  55. //   float z_real = 0.5; /*/the ideal value we wish to measure */
  56. static float sum_error_kalman1 = 0;
  57. static float sum_error_measure1 = 0;

  58. static float kalman1(float z_real)
  59. {                 
  60.         /*/do a prediction */
  61.         x_temp_est1 = x_est_last1;
  62.         P_temp1 = P_last1 + Q1;
  63.         /*/calculate the Kalman gain */
  64.         K1 = P_temp1 * (1.0/(P_temp1 + R1));
  65.         /*/measure*/
  66.         z_measured1 = z_real ;
  67.         x_est1 = x_temp_est1 + K1 * (z_measured1 - x_temp_est1);  
  68.         P1 = (1- K1) * P_temp1;
  69.          
  70.         sum_error_kalman1 += fabs(z_real - x_est1);
  71.         sum_error_measure1 += fabs(z_real-z_measured1);
  72.          
  73.         P_last1 = P1;
  74.         x_est_last1 = x_est1;

  75.         return x_est1;
  76. }


  77. void halfword(FP32 j);
  78. static void TaskStart( void *parg)
  79. {
  80.         INT16U i=0,j=0,l=0;
  81.         FP32 vbat=0,k=0,oldk=0,dianliu=0,wendu=0;
  82.         (void)parg;
  83.         OS_CPU_SysTickInit();
  84.         OSStatInit();
  85.         
  86.         OSTaskCreateExt( TaskLed,         
  87.                                                                          (void *)0,
  88.                                                                          &TaskLedStk[500-1],        
  89.                                                                          LED_PRIO,
  90.                                                                          LED_PRIO,
  91.                                                                          TaskLedStk,
  92.                                                                          500,
  93.                                                                          ( void*)0,  
  94.                                                                          OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
  95.         

  96.         LedInit();                //初始化LED指示灯灯
  97.         PWMTimer(25000);        //初始化PWM         
  98.         DCOut(ENABLE);
  99.         
  100.         ADC1_Configuration();                //采样初始化
  101.         Getk_adc();
  102.         ReadCanShu();
  103.         OSTimeDlyHMSM( 0, 0, 1, 0 );
  104.         vbat=GetDC310();
  105.         gotoxy(0,0);
  106.         dprintf8("12");
  107.         k=310/vbat;
  108.         k=kalman1(k);
  109.         if(k<1)
  110.         {
  111.                         halfword(k);
  112.                         ban();
  113.         }
  114.         Time1Config();                        //SPWM
  115.         SPWMState(ENABLE );
  116.         //halfword();
  117.         while(1)
  118.         {
  119.                 OSTimeDlyHMSM( 0, 0, 0, 50 );
  120.                 vbat=GetBATE();
  121.                
  122.                 if((vbat<10.5)||(vbat>14.5))
  123.                 {
  124.                         i++;
  125.                         if(i==60)
  126.                                 while(1)
  127.                                 {
  128.                                         LedGreen(0);
  129.                                         WenKong(0);
  130.                                         DCOut(DISABLE);
  131.                                         SPWMState(DISABLE );
  132.                                 }
  133.                 }
  134.                 else
  135.                         i=0;
  136.                
  137.                 dianliu=GetElectric();
  138.                 if(dianliu>32)
  139.                 {
  140.                         j++;
  141.                         if(j==40)
  142.                                 while(1)
  143.                                 {
  144.                                         LedGreen(0);
  145.                                         WenKong(0);
  146.                                         DCOut(DISABLE);
  147.                                         SPWMState(DISABLE );
  148.                                 }
  149.                 }
  150.                 else
  151.                         j=0;
  152.                 if(dianliu>55)
  153.                 {
  154.                                 while(1)
  155.                                 {
  156.                                         LedGreen(0);
  157.                                         WenKong(0);
  158.                                         DCOut(DISABLE);
  159.                                         SPWMState(DISABLE );
  160.                                 }
  161.                 }
  162.                 if(dianliu>2)
  163.                         WenKong(1);
  164.                 if(dianliu<1.5)
  165.                         WenKong(0);
  166.                
  167.                 vbat=GetDC310();
  168.                 vbat=kalman1(vbat);
  169.                 k=310/vbat;
  170.                 //k=kalman1(k);
  171.                 if(k<1)
  172.                 {
  173.                         halfword(k);
  174.                 }
  175.                 else
  176.                         halfword(1);
  177.                
  178.         }
  179. }


  180. float k_dianya=0.14143920;        //电池电压比例

  181. extern volatile FP32 vref;
  182. static void TaskLed(void *parg)          //测试任务
  183. {        
  184.         INT32U j=0,b=0;
  185.         FP32 vbat=0,k=0;
  186.         //ADC_Config();
  187.         Init_ST7576();
  188.         //Usart1Init(9600);
  189.         DianLiuInit();
  190.         while(1)
  191.         {
  192.                 LedGreen(1);               
  193.                 OSTimeDlyHMSM( 0, 0, 0, 500 );               
  194.                 LedGreen(0);                 
  195.                 OSTimeDlyHMSM( 0, 0, 0, 500 );
  196.                 Getk_adc();
  197.                 vbat=GetBATE();
  198.                 gotoxy(0,0);
  199.                 dprintf("vbat=%0.2f ",vbat);
  200.                 vbat=GetDC310();
  201.                 gotoxy(0,2);
  202.                 dprintf("DC=%0.2f ",vbat);
  203.                 k=310/vbat;
  204.                 gotoxy(0,4);
  205.                 dprintf("k=%0.1f ",k);
  206.                 k=GetWenDu();
  207.                 gotoxy(0,6);
  208.                 dprintf("wen=%0.1f",k);
  209.                 k=GetElectric();
  210.                 dprintf(" %0.1f",k);

  211.                 if(GetAnJian()==0)
  212.                 {
  213.                         DCOut(DISABLE);
  214.                         SPWMState(DISABLE );
  215.                         OSTimeDlyHMSM( 0, 0, 3, 500 );
  216.                         Getele();
  217.                         SaveCanShu();
  218.                         DCOut(ENABLE);
  219.                         SPWMState(ENABLE );
  220.                         
  221.                 }
  222.         }
  223. }
复制代码

所有资料51hei提供下载:
spwm.rar (10.07 MB, 下载次数: 347)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:202142 发表于 2020-10-22 16:02 | 显示全部楼层
下来学习学习,有空也搞个试试~
回复

使用道具 举报

ID:711539 发表于 2020-10-22 21:42 | 显示全部楼层
感谢楼主分享,很好的资料,赞一个
回复

使用道具 举报

ID:691573 发表于 2021-7-1 12:59 | 显示全部楼层
下来学习学习,有空也搞个试试~
回复

使用道具 举报

ID:686311 发表于 2021-8-5 19:47 | 显示全部楼层
这方案多少瓦?
回复

使用道具 举报

ID:663676 发表于 2022-3-27 14:15 | 显示全部楼层

下来学习学习,有空也搞个试试~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表