[STM32F1] 关于电机2.0库中的SVPWM算法

[复制链接]
8666|5
 楼主| rickemma 发表于 2015-6-8 13:57 | 显示全部楼层 |阅读模式
小弟最近在用ST的2.0电机库 ,发现它的3电阻采样部分的程序代码好乱。尤其是它的ADC的设定和使用。贴出2.0库中的SVPWM算法。他的算法到底是用了ABC三路的电流采样还是用了两路的电流采样计算出第三路。其中的计算每一路电流采样为什么是   0电压误差值减去采样值。不应该是采样值减去0电压误差吗。还有他的算法流程很不解。代码如下:
  1. Curr_Components SVPWM_3ShuntGetPhaseCurrentValues(void)
  2. {
  3.   Curr_Components Local_Stator_Currents;
  4.   s32 wAux;

  5.   switch (bSector)
  6.    {
  7.    case 4:  //È¡µÃÔÚÄǸöÉÈÇøµÄʱºòÔÚ¶ÁÈ¡AD      ÒòΪADCÊý¾ÝÑ¡ÔñÁË×ó¶ÔÆë£¬ÔÚ×¢ÈëͨµÀÀïÓзûºÅλËùÒÔ²ÅÓÐÊý¾ÝֵΪÎÞ·ûºÅ65535£¨ÓзûºÅÔò32767£©
  8.    case 5: //Current on Phase C not accessible     
  9.            // Ia = (hPhaseAOffset)-(ADC Channel 11 value)   
  10.             wAux = (s32)(hPhaseAOffset)- ((ADC1->JDR1)<<1);         
  11.            //Saturation of Ia
  12.             if (wAux < S16_MIN)
  13.             {
  14.               Local_Stator_Currents.qI_Component1= S16_MIN;
  15.             }  
  16.             else  if (wAux > S16_MAX)
  17.                   {
  18.                     Local_Stator_Currents.qI_Component1= S16_MAX;
  19.                   }
  20.                   else
  21.                   {
  22.                     Local_Stator_Currents.qI_Component1= wAux;
  23.                   }
  24.                      
  25.            // Ib = (hPhaseBOffset)-(ADC Channel 12 value)
  26.             wAux = (s32)(hPhaseBOffset)-((ADC2->JDR1)<<1);
  27.            // Saturation of Ib
  28.             if (wAux < S16_MIN)
  29.             {
  30.               Local_Stator_Currents.qI_Component2= S16_MIN;
  31.             }  
  32.             else  if (wAux > S16_MAX)
  33.                   {
  34.                     Local_Stator_Currents.qI_Component2= S16_MAX;
  35.                   }
  36.                   else
  37.                   {
  38.                     Local_Stator_Currents.qI_Component2= wAux;
  39.                   }
  40.            break;
  41.            
  42.    case 6:
  43.    case 1:  //Current on Phase A not accessible     
  44.             // Ib = (hPhaseBOffset)-(ADC Channel 12 value)
  45.             wAux = (s32)(hPhaseBOffset)-((ADC1->JDR1)<<1);
  46.             //Saturation of Ib
  47.             if (wAux < S16_MIN)
  48.             {
  49.               Local_Stator_Currents.qI_Component2= S16_MIN;
  50.             }  
  51.             else  if (wAux > S16_MAX)
  52.                   {
  53.                     Local_Stator_Currents.qI_Component2= S16_MAX;
  54.                   }
  55.                   else
  56.                   {
  57.                     Local_Stator_Currents.qI_Component2= wAux;
  58.                   }
  59.             // Ia = -Ic -Ib
  60.             wAux = ((ADC2->JDR1)<<1)-hPhaseCOffset-
  61.                                             Local_Stator_Currents.qI_Component2;
  62.             //Saturation of Ia
  63.             if (wAux> S16_MAX)
  64.             {
  65.                Local_Stator_Currents.qI_Component1 = S16_MAX;
  66.             }
  67.             else  if (wAux <S16_MIN)
  68.                   {
  69.                    Local_Stator_Currents.qI_Component1 = S16_MIN;
  70.                   }
  71.                   else
  72.                   {  
  73.                     Local_Stator_Currents.qI_Component1 = wAux;
  74.                   }
  75.            break;
  76.            
  77.    case 2:
  78.    case 3:  // Current on Phase B not accessible
  79.             // Ia = (hPhaseAOffset)-(ADC Channel 11 value)     
  80.             wAux = (s32)(hPhaseAOffset)-((ADC1->JDR1)<<1);
  81.             //Saturation of Ia
  82.             if (wAux < S16_MIN)
  83.             {
  84.               Local_Stator_Currents.qI_Component1= S16_MIN;
  85.             }  
  86.             else  if (wAux > S16_MAX)
  87.                   {
  88.                     Local_Stator_Currents.qI_Component1= S16_MAX;
  89.                   }
  90.                   else
  91.                   {
  92.                     Local_Stator_Currents.qI_Component1= wAux;
  93.                   }
  94.      
  95.             // Ib = -Ic-Ia;
  96.             wAux = ((ADC2->JDR1)<<1) - hPhaseCOffset -
  97.                                             Local_Stator_Currents.qI_Component1;
  98.             // Saturation of Ib
  99.             if (wAux> S16_MAX)
  100.             {
  101.               Local_Stator_Currents.qI_Component2=S16_MAX;
  102.             }
  103.             else  if (wAux <S16_MIN)
  104.                   {  
  105.                     Local_Stator_Currents.qI_Component2 = S16_MIN;
  106.                   }
  107.                   else  
  108.                   {
  109.                     Local_Stator_Currents.qI_Component2 = wAux;
  110.                   }                     
  111.            break;

  112.    default:
  113.            break;
  114.    }
  115.   
  116.   return(Local_Stator_Currents);
  117. }
CS_Police 发表于 2015-6-9 21:12 | 显示全部楼层
楼主可以看下STM32F103的ADC外设,它有两个ADC模块,也就是可以同时读取两路的电流信号,所以三电阻采样可以直接同时读取两路的电流信号,另外一路当然可以通过Ia+Ib+Ic=0计算出数据的,2.0的库里面根据扇区在做ADC通道的切换;至于Offset部分,看定义的电流方向了,是进入电机为正还是电机输出为正了,不管何种定义,最后的电流电压一定是以Offset电压为中心的上下(正负)数据。
个人认为ST的2.0的库相对后面的3.0,4.0库还是比较好上手的,但后面的库支持的单片机比较多,没办法因为研发需要,4.0的库面向对象的编程本人还在熟悉中。。。。。
 楼主| rickemma 发表于 2015-6-23 09:17 | 显示全部楼层
CS_Police 发表于 2015-6-9 21:12
楼主可以看下STM32F103的ADC外设,它有两个ADC模块,也就是可以同时读取两路的电流信号,所以三电阻采样可 ...

我让2.0的电机库终于转起来了,不过用 的是对应的电机PMSM。我想让它运行BLDC可行吗?可以的话,我该修改哪些参数呢,麻烦大侠能告知一二,感激不尽。
309579471 发表于 2015-6-24 10:51 | 显示全部楼层
你真要用 就不会问修改哪几个参数就可以运行了 这种问题 ,你得把代码都搞清楚才行
CS_Police 发表于 2015-6-26 09:53 | 显示全部楼层
楼上说的在理,好的产品程序需要花时间去深入研究,简单说可以控制BLDC,让电机转动没问题,要转的好需要根据实际情况进行调整。
gaoyang9992006 发表于 2015-6-26 12:31 | 显示全部楼层
case语句不错啊,我喜欢用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

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