久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4707|回復: 1
打印 上一主題 下一主題
收起左側

dsPIC3EP256MC506的AN1160用擇多函數實現飯電動勢濾波的無傳感器BLDC控制

[復制鏈接]
跳轉到指定樓層
樓主
本應用筆記介紹一種采用 dsPIC ® 數字信號控制器
(Digital Signal Controller, DSC)或 PIC24 單片機來實現無刷直流 (Brushless Direct Current, BLDC)電機無傳感器控制的算法。該算法利用對反電動勢(Back-Electromotive Force,BEMF)進行數字濾波的擇多函數來實現。通過對電機的每一相進行濾波來確定電機驅動電壓換相的時刻。這一控制技術省卻了分立的低通濾波硬件和片外比較器。需指出,這里論述的所有內容及應用軟件,都是假定使用三相電機。該電機控制算法包括四個主要部分:
• 利用 DSC 或單片機的模數轉換器(Analog-to-Digital Converter,ADC)來采樣梯形波 BEMF 信號
• PWM 導通側 ADC 采樣,以降低噪聲并解決低電感問題
• 將梯形波BEMF信號與V BUS /2進行比較,以檢測過零點
• 用擇多函數濾波器對比較結果信號進行濾波
• 以三種不同模式對電機驅動電壓進行換相:
- 傳統開環控制器
- 傳統閉環控制器
- 比例 - 積分(Proportional-Integral,PI)閉環
控制器


單片機源程序如下:
  1. /************************************************************************************************************************
  2. * ?2011 Microchip Technology Inc.
  3. *
  4. * MICROCHIP SOFTWARE NOTICE AND DISCLAIMER:
  5. *
  6. * You may use this software, and any derivatives
  7. * created by any person or entity by or on your behalf, exclusively with Microchip抯 products.
  8. * Microchip and its licensors retain all ownership and intellectual property rights in the
  9. * accompanying software and in all derivatives hereto.  
  10. *
  11. * This software and any accompanying information is for suggestion only.
  12. * It does not modify Microchip抯 standard warranty for its products.  You agree that you are
  13. * solely responsible for testing the software and determining its suitability.
  14. * Microchip has no obligation to modify, test, certify, or support the software.
  15. *
  16. * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY,
  17. * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR
  18. * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE, ITS INTERACTION WITH MICROCHIP扴 PRODUCTS, COMBINATION WITH
  19. * ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
  20. *
  21. * IN NO EVENT, WILL MICROCHIP BE LIABLE, WHETHER IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH
  22. * OF STATUTORY DUTY), STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, PUNITIVE,
  23. * EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE SOFTWARE,
  24. * HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST
  25. * EXTENT ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED
  26. * THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.

  27. * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE TERMS.
  28. ***********************************************************************************************************************/
  29. #include "defs.h"                //defines, function headers, pi, etc

  30. #ifdef RTDM_DEMO
  31.         #include "debug.h"                //RTDM/DMCI functionality
  32. #endif

  33. int main(void)
  34. {
  35.         Init_Ports();        // Clock ( Fcy 70MHz ) , port configuration, etc

  36.         #ifdef RTDM_DEMO
  37.                 DBG_Init();                // RTDM ( Debugger ) Initialization
  38.         #endif

  39.         //defaults: CLKW rotation, motor stopped
  40.         Flags.RunMotor = 0;
  41.         Flags.Startup = 0;
  42.         Flags.CLKW = 1;
  43.         Flags.newCLKW = 1;
  44.         Flags.DMCI_Control_SW = 0;                //default potentiometer read

  45.         Timer2Average = TMR2_MAX;
  46.         trigger_count = 1;
  47.         Flags.nb_delay_on = 0;

  48.         #ifdef OPEN_LOOP_CONTROL
  49.         DesiredDuty = MIN_DUTY_CYCLE;
  50.         #else
  51.         DesiredRPM = STARTUP_RPM;
  52.         #endif

  53.         Flags.current_state = STATE_STOPPED;
  54.         while(1) {
  55.                
  56.                 if(S2) { //CLKW/CCLKW switch
  57.                         while(S2) //debounce
  58.                                 Delay_100uSec(DEBOUNCE_DELAY*10);
  59.                         Flags.newCLKW = !Flags.CLKW;
  60.                 }

  61.                 if(S3) { //start/stop switch
  62.                         while(S3) //debounce
  63.                                 Delay_100uSec(DEBOUNCE_DELAY*10);

  64.                         if(Flags.current_state == STATE_STOPPED)
  65.                                 Flags.current_state = STATE_STARTING;
  66.                         else
  67.                                    Flags.current_state = STATE_STOPPING;
  68.                 }


  69.                 switch(Flags.current_state) {
  70.                         case STATE_STOPPING:
  71.                                 Stop_Motor();
  72.                                 Flags.current_state = STATE_STOPPED;
  73.                         break;

  74.                         case STATE_STARTING:
  75.                                 //startup done on MCPWM ISR
  76.                         break;

  77.                         case STATE_FAULT:
  78.                                 Stop_Motor();
  79.                                 Flags.current_state = STATE_STOPPED;
  80.                         break;

  81.                         case STATE_STARTED:
  82.                                 if(Flags.newCLKW != Flags.CLKW) {
  83.                                         Stop_Motor();
  84.                                         Flags.CLKW = Flags.newCLKW;
  85.                                         Delay_100uSec(5000);        //delay 500 ms for motor to actually stop
  86.                                         Flags.current_state = STATE_STARTING;
  87.                                 }
  88.                         break;

  89.                         case STATE_STOPPED:
  90.                                 if(Flags.newCLKW != Flags.CLKW)
  91.                                         Flags.CLKW = Flags.newCLKW;
  92.                         break;
  93.                 }

  94.                 #ifdef RTDM_DEMO
  95.                         DBG_SyncComm();        //assure RTDM communication
  96.                 #endif
  97.         }

  98.         return 0;
  99. }

  100. /*******************************************************************
  101. Init_Motor()
  102.         Procedure used to initialize all params for the motor and
  103. for the AN1160 algorithm.
  104.         Also rotor alignment is done here.
  105. *******************************************************************/
  106. void Init_Motor()
  107. {
  108.         int i;        //auxiliary counter

  109.         if(Flags.nb_delay_on == 0) {
  110.                 T1CONbits.TON = 0;
  111.                 T2CONbits.TON = 0;
  112.                 TMR1 = 0;
  113.                 TMR2 = 0;

  114.                 Flags.TrainPI = 0;
  115.        
  116.             //setting direction CLKW or CCLKW
  117.                 if(Flags.CLKW == 1) {

  118.                         for(i=0;i<6;i++) {
  119.                                 PWM_STATE1[i] = PWM_STATE1_CLKW[i];
  120.                                 PWM_STATE2[i] = PWM_STATE2_CLKW[i];
  121.                                 PWM_STATE3[i] = PWM_STATE3_CLKW[i];
  122.                                 MotorPhaseAState[i] = MotorPhaseAState_CLKW[i];
  123.                                 MotorPhaseBState[i] = MotorPhaseBState_CLKW[i];
  124.                                 MotorPhaseCState[i] = MotorPhaseCState_CLKW[i];
  125.                                 ADC_CHANNEL[i] = ADC_CHANNEL_CLKW[i];

  126.                                 ADC_MASK[i] = ADC_MASK_CLKW[i];
  127.                                 ADC_XOR[i] = ADC_XOR_CLKW[5-i];
  128.                         }
  129.                         for(i=0;i<64;i++)
  130.                                 ADC_BEMF_FILTER[i] = ADC_BEMF_FILTER_CLKW[63-i];

  131.                 } else {
  132.                         for(i=0;i<6;i++) {
  133.                                 PWM_STATE1[i] = PWM_STATE1_CLKW[5-i];
  134.                                 PWM_STATE2[i] = PWM_STATE2_CLKW[5-i];
  135.                                 PWM_STATE3[i] = PWM_STATE3_CLKW[5-i];
  136.                                 MotorPhaseAState[i] = MotorPhaseAState_CLKW[5-i];
  137.                                 MotorPhaseBState[i] = MotorPhaseBState_CLKW[5-i];
  138.                                 MotorPhaseCState[i] = MotorPhaseCState_CLKW[5-i];
  139.                                 ADC_CHANNEL[i] = ADC_CHANNEL_CLKW[5-i];

  140.                                 ADC_MASK[i] = ADC_MASK_CLKW[5-i];
  141.                                 ADC_XOR[i] = ADC_XOR_CLKW[5-i];
  142.                         }
  143.                         for(i=0;i<64;i++)
  144.                                 ADC_BEMF_FILTER[i] = ADC_BEMF_FILTER_CLKW[63-i];
  145.                 }
  146.        
  147.             stallCount = 0;

  148.                 PIDStructure.qInMeas = STARTUP_RPM;
  149.                 PIDStructure.qInRef = STARTUP_RPM;
  150.             InitPI(&PIDStructure,SpeedControl_P,SpeedControl_I,PI_ANTI_WINDUP,MAX_DUTY_CYCLE,MIN_DUTY_CYCLE,0);

  151.                 TMR2 = TMR2_MAX; //initialize TMR2 and TMR2 average with the value corresponding to the minimum motor speed
  152.                 Timer2Value = TMR2;
  153.                 Timer2Average = TMR2;
  154.                 Timer1Value = 0;

  155.                 Flags.RunMotor = 1;                     // turn the motor ON
  156.                 Flags.Startup = 1;                                                // motor initialized, go to starting sequence
  157.    
  158.                 ADCCommState = 5;        //always start with sector 6 forced

  159.                 //set pwm overdrive to the according PWM channel
  160.                 IOCON1 = PWM_STATE1[ADCCommState];
  161.                 IOCON2 = PWM_STATE2[ADCCommState];
  162.                 IOCON3 = PWM_STATE3[ADCCommState];
  163.             CurrentDuty = STARTUP_DUTY;   //Init PWM duty cycle value to minimum duty allowed
  164.             PDC1 = CurrentDuty;
  165.                 PDC2 = CurrentDuty;
  166.                 PDC3 = CurrentDuty;

  167.                 nb_delay = ROTOR_ALIGN_T*PWM_100us_FACTOR*10;
  168.                 delay_counter = 0;
  169.                 Flags.nb_delay_on = 1;               

  170.                 t_current = STARTUP_START_T*10;        //in ms
  171.                 t_sector = 0;
  172.         }
  173. }

  174. /**********************************************************************
  175. Start_Motor()
  176.         Procedure for starting the motor according to the implemented
  177. startup ramp. After the ramp, PI loop training will begin.
  178. **********************************************************************/
  179. void Start_Motor()
  180. {
  181.         if(Flags.nb_delay_on == 0) {        //this is just to test if we're not in a non-blocking delay actually

  182.             if(++ADCCommState>5)        // Change The Six-Step Commutation Sector
  183.                      ADCCommState = 0;

  184.                 AD1CHS0 = ADC_CHANNEL[ADCCommState];        //Change ADC Channel AN Selection

  185.                 if(t_current < (unsigned long int)STARTUP_T_RAMP*10) {
  186.                          t_sector = STARTUP_SEC_C/t_current;        //calculates T for 1 sector, in 100s of uS.
  187.                         if(t_sector <= 0) t_sector = 1;
  188.                 } else
  189.                 if (t_current < ((unsigned int)STARTUP_T_RAMP*10 + STARTUP_T_SUST*10)) {

  190.                         Flags.TrainPI = 1;
  191.                         AD1CON1bits.SSRC = 3;
  192.                 }       
  193.                 else
  194.                         Flags.TrainPI = 0;

  195.                 //overdrive and output next motor sector
  196.                 IOCON1 = PWM_STATE1[ADCCommState];
  197.                 IOCON2 = PWM_STATE2[ADCCommState];
  198.                 IOCON3 = PWM_STATE3[ADCCommState];

  199.                 //here we want a non-blocking delay for the startup to execute
  200.                 nb_delay = t_sector * PWM_100us_FACTOR;
  201.                 delay_counter = 0;
  202.                 Flags.nb_delay_on = 1;               

  203.                 t_current += t_sector;       

  204.             adcBackEMFFilter = 0;    //clear the BEMF filter
  205.         }
  206. }


  207. ……………………

  208. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
dsPICDEM MCLV-2開發板用戶指南.pdf (1.18 MB, 下載次數: 51)
AN1160_dsPIC33EP256MC506_MCLV.rar (1.04 MB, 下載次數: 67)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:324611 發表于 2019-9-18 14:37 | 只看該作者
好東西,學習了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费一区 | 久久久av一区 | 国产激情在线 | 在线播放一区 | 国产成人网 | 在线一区视频 | 亚洲欧美日韩精品久久亚洲区 | 日本三级线观看 视频 | 国产成人小视频 | 亚洲精品久久久蜜桃网站 | 久久99视频这里只有精品 | 精品久久久久久久久久久下田 | 国产在线播 | 国产精品久久久久久婷婷天堂 | 国产精品一区二区福利视频 | 国产免费一区二区三区 | 免费h视频| 日韩欧美高清 | 久草视频在线播放 | 国产一区二区小视频 | 天堂视频免费 | 91免费观看国产 | 国产一级片在线播放 | 亚洲在线一区 | 国产一区二区视频免费在线观看 | 亚洲精品一二三区 | 亚洲福利一区二区 | 四虎影视一区二区 | 草逼网站| 国产一区二区在线播放 | 第四色狠狠 | 中文字幕一区在线观看视频 | 欧美日韩在线视频一区二区 | 精品久久久久久久 | 国内自拍偷拍视频 | www久久| 日韩成人免费 | 亚洲激情在线视频 | 玖玖玖在线观看 | 成人在线免费观看 | 狠狠婷婷综合久久久久久妖精 |