找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4286|回复: 2
打印 上一主题 下一主题
收起左侧

STM32-FOC-PMSM相关仿真以及应用代码

[复制链接]
跳转到指定楼层
楼主
ID:321383 发表于 2018-5-3 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试基于STM32的无刷直流电机的相关驱动控制方法,现在已经调试完毕基于磁链定向控制的相关研究了。附件是我最近调试的代码。有兴趣的可加我QQ:2049988620进行沟通。

BLDC PMSM2 无霍尔LCD程序上海电机单片机源程序如下:
  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name          : main.c
  3. * Author             : IMS Systems Lab
  4. * Date First Issued  : 21/11/07
  5. * Description        : Main program body.
  6. ********************************************************************************

  7. ********************************************************************************
  8. * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. *
  15. * THIS SOURCE CODE IS PROTECTED BY A LICENSE.
  16. * FOR MORE INFORMATION PLEASE CAREFULLY READ THE LICENSE AGREEMENT FILE LOCATED
  17. * IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.
  18. *******************************************************************************/

  19. /* Includes ------------------------------------------------------------------*/
  20. #define          root
  21. #include <Ram.h>

  22. #include "STM103REG.h"
  23. #include "stm32f10x_lib.h"
  24. #include "stm32f10x_MClib.h"
  25. #include "MC_Globals.h"


  26. /* Private typedef -----------------------------------------------------------*/
  27. /* Private define ------------------------------------------------------------*/
  28. /* Private macro -------------------------------------------------------------*/
  29. /* Private variables ---------------------------------------------------------*/
  30. /* Private function prototypes -----------------------------------------------*/

  31. void NVIC_Configuration(void);
  32. void GPIO_Configuration(void);
  33. void RCC_Configuration(void);

  34. unsigned char Res_f=0;         //上电防止出现过流

  35. /*******************************************************************************
  36. * Function Name  : main
  37. * Description    : Main program.
  38. * Input          : None
  39. * Output         : None
  40. * Return         : None
  41. *******************************************************************************/
  42. int main(void)
  43. {                        //        s16 te;

  44. #ifdef DEBUG
  45.   debug();
  46. #endif
  47.    
  48.   RCC_Configuration();
  49.   GPIO_Configuration();


  50. #ifdef THREE_SHUNT  //三个电阻电流取样
  51.   SVPWM_3ShuntInit(); //设置电流取样,PWM周期
  52. #elif defined ICS_SENSORS
  53.   SVPWM_IcsInit();
  54. #elif defined SINGLE_SHUNT
  55.   SVPWM_1ShuntInit();
  56. #endif
  57.   
  58. #ifdef ENCODER
  59.   
  60.    #ifdef OBSERVER_GAIN_TUNING
  61.       STO_StateObserverInterface_Init();
  62.       STO_Init();
  63.    #endif
  64. #elif defined HALL_SENSORS
  65.   
  66.    #ifdef OBSERVER_GAIN_TUNING
  67.       STO_StateObserverInterface_Init();
  68.       STO_Init();
  69.    #endif
  70. #elif defined NO_SPEED_SENSORS
  71.     STO_StateObserverInterface_Init();
  72.     STO_Init();
  73.    #ifdef VIEW_ENCODER_FEEDBACK
  74.       ENC_Init();
  75.    #elif defined VIEW_HALL_FEEDBACK
  76.       HALL_HallTimerInit();
  77.    #endif
  78. #endif

  79. #ifdef DAC_FUNCTIONALITY   
  80.   MCDAC_Init();
  81. #endif

  82.   TB_Init();//定时器初始化
  83.   
  84.   PID_Init(&PID_Torque_InitStructure, &PID_Flux_InitStructure, &PID_Speed_InitStructure);//初始化PID值
  85.         GPIO_SetBits(GPIOB,GPIO_Pin_12);
  86. #ifdef BRAKE_RESISTOR
  87.     MCL_Brake_Init();
  88. #endif
  89.       
  90.   KEYS_Init();
  91.   
  92.   /* TIM1 Counter Clock stopped when the core is halted */
  93.   //DBGMCU_Config(DBGMCU_TIM1_STOP, ENABLE);
  94.   
  95.   // Init Bus voltage and Temperature average  
  96.   MCL_Init_Arrays();
  97.    
  98. // STM3210C_LCD_Init();
  99.   //LCD_Clear(White);
  100.   //LCD_SetTextColor(Blue);
  101. // LCD_SetBackColor(White);
  102.    
  103.   //Display_Welcome_Message();   
  104.   NVIC_Configuration();
  105.         LcdReset();
  106.   Res_f=1; //上电完成
  107. fgDispMode=1;
  108.   //wGlobal_Flags |= SPEED_CONTROL;
  109.   while(1)
  110.   {
  111.    // Display_LCD();
  112.    // MCL_ChkPowerStage();   
  113.     //User interface management   
  114.    KeyProc();
  115.         Timeproc();
  116.          
  117.     switch (State)
  118.     {
  119.       case IDLE:    // Idle state   
  120.       break;
  121.       
  122.       case INIT:
  123.         MCL_Init();
  124.         TB_Set_StartUp_Timeout(3000);//延时1.5S吗
  125.         State = START;
  126.       break;
  127.         
  128.       case START:  
  129.       //passage to state RUN is performed by startup functions;
  130.       break;
  131.          
  132.       case RUN:   // motor running      
  133. #ifdef ENCODER
  134.         if(ENC_ErrorOnFeedback() == TRUE)
  135.         {
  136.           MCL_SetFault(SPEED_FEEDBACK);
  137.         }
  138. #elif defined HALL_SENSORS        
  139.         if(HALL_IsTimedOut())
  140.         {
  141.           MCL_SetFault(SPEED_FEEDBACK);
  142.         }
  143.         //        te=        HALL_GetSpeed();/te/
  144.         if ( HALL_GetSpeed()== HALL_MAX_SPEED)
  145.         {
  146.           MCL_SetFault(SPEED_FEEDBACK);
  147.         }
  148. #elif defined NO_SPEED_SENSORS
  149.       
  150. #endif     
  151.       break;  
  152.       
  153.       case STOP:    // motor stopped
  154.           // shutdown power         
  155.           /* Main PWM Output Disable */
  156.           TIM_CtrlPWMOutputs(TIM1, DISABLE);
  157.          
  158.           State = WAIT;
  159.          
  160. #ifdef THREE_SHUNT         
  161.           SVPWM_3ShuntAdvCurrentReading(DISABLE);
  162. #endif   
  163. #ifdef SINGLE_SHUNT         
  164.           SVPWM_1ShuntAdvCurrentReading(DISABLE);
  165. #endif
  166.           Stat_Volt_alfa_beta.qV_Component1 = Stat_Volt_alfa_beta.qV_Component2 = 0;
  167.          
  168. #ifdef ICS_SENSORS
  169.           SVPWM_IcsCalcDutyCycles(Stat_Volt_alfa_beta);
  170. #elif defined THREE_SHUNT
  171.           SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta);
  172. #endif                                                
  173.           TB_Set_Delay_500us(2000); // 1 sec delay
  174.       break;
  175.       
  176.       case WAIT:    // wait state
  177.           if (TB_Delay_IsElapsed() == TRUE)
  178.           {
  179. #ifdef ENCODER            
  180.             if(ENC_Get_Mechanical_Speed() ==0)            
  181.             {              
  182.               State = IDLE;              
  183.             }
  184. #elif defined HALL_SENSORS      
  185.             if (HALL_IsTimedOut())
  186.             {               
  187.               State=IDLE;
  188.             }
  189. #elif defined NO_SPEED_SENSORS
  190.             STO_InitSpeedBuffer();
  191.             State=IDLE;
  192. #endif            
  193.           }
  194.         break;
  195.    
  196.       case FAULT:                  
  197.           if (MCL_ClearFault() == TRUE)
  198.           {
  199.             if(wGlobal_Flags & SPEED_CONTROL == SPEED_CONTROL)
  200.             {
  201.               bMenu_index = CONTROL_MODE_MENU_1;
  202.             }
  203.             else
  204.             {
  205.               bMenu_index = CONTROL_MODE_MENU_6;
  206.             }      
  207. #if defined NO_SPEED_SENSORS
  208.             STO_InitSpeedBuffer();
  209. #endif            
  210.             State = IDLE;
  211.             wGlobal_Flags |= FIRST_START;
  212.           }
  213.         break;
  214.    
  215.       default:        
  216.         break;
  217.     }
  218.   }
  219. }

  220. /*******************************************************************************
  221. * Function Name  : GPIO_Configuration
  222. * Description    : Configures the TIM1 Pins.
  223. * Input          : None
  224. * Output         : None
  225. * Return         : None
  226. *******************************************************************************/
  227. void GPIO_Configuration(void)
  228. {
  229. //  GPIO_InitTypeDef GPIO_InitStructure;

  230.   //RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOF, ENABLE);

  231.   //GPIO_DeInit(GPIOF);
  232.   //GPIO_StructInit(&GPIO_InitStructure);
  233.                   
  234.   /* Configure PF.06, PF.07, PF.08 and PF.09 as Output push-pull for debugging
  235.      purposes */
  236.     GPIO_InitTypeDef GPIO_InitStructure;
  237.    

  238.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
  239.                                 RCC_APB2Periph_ADC1|RCC_APB2Periph_USART1,ENABLE);
  240.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  241.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  242.         GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
  243.         /*-----------------GPIOA--------------------*/
  244.         //DI点
  245.         //GPIO_InitStructure.GPIO_Pin =  PAI_KSET;
  246.         //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  247.         //GPIO_Init(GPIOA, &GPIO_InitStructure);

  248.        
  249.        
  250.         //DO 点
  251.         GPIO_InitStructure.GPIO_Pin = PAO_LCDDB0|PAO_LCDEN|PAO_LCDRS;
  252.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  253.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  254.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  255.         /*-----------------GPIOB--------------------*/
  256.        
  257.         //DI点
  258.         GPIO_InitStructure.GPIO_Pin =  PBI_KDOWN|PBI_KDOWN|PBI_KRIGHT|PBI_KUP|PBI_URTRX;
  259.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  260.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  261.         //DO 点
  262.         GPIO_InitStructure.GPIO_Pin =  PBO_LCDCS1|PBO_LCDCS2|PBO_LCDDB5|PBO_LCDDB6|PBO_LCDDB7|PBO_MBREAK|PBO_M_EN;
  263.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  264.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  265.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  266.         GPIO_InitStructure.GPIO_Pin = PBI_URTRX;
  267.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  268.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  269.        
  270.         GPIO_InitStructure.GPIO_Pin = PBO_URTTX;
  271.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  272.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  273.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  274.         /*-----------------GPIOC--------------------*/
  275.         //DI点
  276.         GPIO_InitStructure.GPIO_Pin =  PCI_DEFAULT|PCI_HELLA|PCI_HELLB|PCI_HELLC|PCI_KLEFT|PCI_KSET;
  277.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  278.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  279.         GPIO_InitStructure.GPIO_Pin = PCO_IIC_CLK|PCO_IIC_DATA|PCO_LCDDB1|PCO_LCDDB2|PCO_LCDDB3|PCO_LED1;
  280.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  281.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  282.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  283.         /*-----------------GPIOD--------------------*/
  284.         GPIO_InitStructure.GPIO_Pin = PDO_LCDDB4;
  285.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  286.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  287.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  288.    
  289. }

  290. /*******************************************************************************
  291. * Function Name  : RCC_Configuration
  292. * Description    : Configures the different system clocks.
  293. * Input          : None
  294. * Output         : None
  295. * Return         : None
  296. *******************************************************************************/
  297. void RCC_Configuration(void)
  298. {
  299.   ErrorStatus HSEStartUpStatus;

  300.   /* RCC system reset(for debug purpose) */
  301.   RCC_DeInit();

  302.   /* Enable HSE */
  303.   RCC_HSEConfig(RCC_HSE_ON);

  304.   /* Wait till HSE is ready */
  305.   HSEStartUpStatus = RCC_WaitForHSEStartUp();
  306.   
  307.   if(HSEStartUpStatus == SUCCESS)
  308.   {
  309.     /* HCLK = SYSCLK */
  310.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  311.   
  312.     /* PCLK2 = HCLK */
  313.     RCC_PCLK2Config(RCC_HCLK_Div1);

  314.     /* PCLK1 = HCLK/2 */
  315.     RCC_PCLK1Config(RCC_HCLK_Div2);

  316.     /* Flash 2 wait state */
  317.     FLASH_SetLatency(FLASH_Latency_2);
  318.     /* Enable Prefetch Buffer */
  319.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  320.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  321.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  322.     /* Enable PLL */
  323.     RCC_PLLCmd(ENABLE);

  324.     /* Wait till PLL is ready */
  325.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  326.     {
  327.     }

  328.     /* Select PLL as system clock source */
  329.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  330.     /* Wait till PLL is used as system clock source */
  331.     while(RCC_GetSYSCLKSource() != 0x08)
  332.     {
  333.     }
  334.   }
  335. }

  336. /*******************************************************************************
  337. * Function Name  : NVIC_Configuration
  338. * Description    : Configures the Vector Table base address.
  339. * Input          : None
  340. * Output         : None
  341. * Return         : None
  342. *******************************************************************************/
  343. void NVIC_Configuration(void)
  344. {
  345. #ifdef  VECT_TAB_RAM  
  346.   /* Set the Vector Table base location at 0x20000000 */
  347.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  348. #else  /* VECT_TAB_FLASH  */
  349.   /* Set the Vector Table base location at 0x08000000 */
  350.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  351. #endif
  352. }

  353. #ifdef  DEBUG
  354. /*******************************************************************************
  355. * Function Name  : assert_failed
  356. * Description    : Reports the name of the source file and the source line number
  357. *                  where the assert_param error has occurred.
  358. * Input          : - file: pointer to the source file name
  359. *                  - line: assert_param error line source number
  360. * Output         : None
  361. * Return         : None
  362. *******************************************************************************/
  363. void assert_failed(u8* file, u32 line)
  364. {
  365.   /* User can add his own implementation to report the file name and line number,
  366.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  367.   /* Infinite loop */
  368.   while (1)
  369.   {
  370.     //printf("Wrong parameters value: file %s on line %d\r\n", file, line);
  371.   }
  372. }
  373. #endif

  374. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码

所有资料51hei提供下载:
BLDC PMSM2 无霍尔LCD程序上海电机-0621.rar (806.1 KB, 下载次数: 133)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:117947 发表于 2019-11-7 13:55 | 只看该作者
你好 这个你跑过实际项目吗
回复

使用道具 举报

板凳
ID:185611 发表于 2020-7-18 10:43 | 只看该作者
这个好,不知道有没有实战过?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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