找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32控制的高压无刷直流电机程序

[复制链接]
跳转到指定楼层
楼主
ID:440223 发表于 2018-12-5 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32控制的高压无刷直流电机

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f10x_lib.h"
  3. #include "stm32f10x_MClib.h"
  4. #include "MC_Globals.h"

  5. //debug in RAM
  6. //#define  VECT_TAB_RAM

  7. /* Private typedef -----------------------------------------------------------*/
  8. /* Private define ------------------------------------------------------------*/
  9. /* Private macro -------------------------------------------------------------*/
  10. /* Private variables ---------------------------------------------------------*/
  11. EXTI_InitTypeDef EXTI_InitStructure;
  12. /* Private function prototypes -----------------------------------------------*/

  13. void NVIC_Configuration(void);
  14. void GPIO_Configuration(void);
  15. void RCC_Configuration(void);
  16. void PVD_Configuration(void);
  17. void TB_Init(void);



  18. void  LCD_Dis_ZEQ(void);
  19. void Running_ZEQ(void);

  20. void InterruptConfig(void);
  21. void ExtOnConfig(void);

  22. extern volatile bool HallTimeOut;
  23. extern u16 Duty;
  24. extern u16 Duty1;
  25. extern u16 Duty2;
  26. extern u32 speed_integral;
  27. extern u32 hRotorFreq;
  28. extern u16 wGlobal_Flags;
  29. extern u8 bMenu_index;
  30. volatile bool PID_Control;
  31. volatile bool ReStartFlag=FALSE;
  32. volatile u8 StartTime=0;       

  33. /*******************************************************************************
  34. * Function Name  : main
  35. * Description    : Main program.
  36. * Input          : None
  37. * Output         : None
  38. * Return         : None
  39. *******************************************************************************/
  40. int main(void)
  41. {
  42. //u8 i=0,j=0,k=0;
  43. #ifdef DEBUG
  44.   debug();
  45. #endif
  46. /*Core initialization*/       
  47.           /*NVIC first,before RCC initialization,use HSI,because RCC initialization also may have INT,GPIO last*/
  48.          NVIC_Configuration();   
  49.          RCC_Configuration();
  50.          PVD_Configuration();
  51.          GPIO_Configuration();  
  52.          TB_Init(); //use systick as the timer base
  53.           //hall timer TIMER2  initialization
  54.          HALL_HallTimerInit();
  55.         /*shunt channel*/  
  56. #ifdef THREE_SHUNT  
  57.         SVPWM_3ShuntInit();  /* Current sensing by Three Shunt resistors */
  58. #elif defined ICS_SENSORS
  59.         SVPWM_IcsInit();
  60. #endif

  61. //#if 0
  62.           //PID parameters  initialization
  63.         PID_Init(&PID_Speed_InitStructure);
  64.         KEYS_Init();
  65.         LCD_Dis_ZEQ();
  66.         StartTimer(TIMERDISPLAY,0);
  67.         Running_ZEQ();
  68. //#endif
  69. //while(1);
  70. /*         while(1)                                                                                                  
  71.          {
  72.                  switch(KEYS_Read())
  73.                 {
  74.                         case ONOFF:{LCD_Print(1,0,"Key ONOFF");LCD_Putchar(++i+0x30);break;}
  75.                         case PLUS:{LCD_Print(1,0,"Key PLUS");LCD_Putchar(++j+0x30);break;}
  76.                         case MINUS:{LCD_Print(1,0,"Key MINUS");LCD_Putchar(++k+0x30);break; }
  77.                         default:break;
  78.                 }
  79.          }
  80. */
  81.      
  82. }

  83. /*******************************************************************************
  84. * Function Name  : GPIO_Configuration
  85. * Description    : Configures the TIM1 Pins.
  86. * Input          : None
  87. * Output         : None
  88. * Return         : None
  89. *******************************************************************************/
  90. void GPIO_Configuration(void)
  91. {
  92.   GPIO_InitTypeDef GPIO_InitStructure;

  93.   /* Enable GPIOC clock */
  94.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
  95.   /*Reset CPIOC after system reset*/
  96.   GPIO_DeInit(GPIOC);
  97.   GPIO_StructInit(&GPIO_InitStructure);
  98.                   
  99.   /* Configure PC0-PC3,PC10-PC12 Output push-pull for LCD Display */
  100.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3\
  101.    | GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
  102.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  103.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  104.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  105.    
  106. }

  107. /*******************************************************************************
  108. * Function Name  : RCC_Configuration
  109. * Description    : Configures the different system clocks.
  110. * Input          : None
  111. * Output         : None
  112. * Return         : None
  113. *******************************************************************************/
  114. void RCC_Configuration(void)
  115. {
  116.   ErrorStatus HSEStartUpStatus;

  117.   /* RCC system reset(for debug purpose) */
  118.   RCC_DeInit();

  119.   /* Enable HSE */
  120.   RCC_HSEConfig(RCC_HSE_ON);

  121.   /* Wait till HSE is ready */
  122.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  123.   
  124.   if(HSEStartUpStatus == SUCCESS)
  125.   {
  126.     /* HCLK = SYSCLK */
  127.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  128.   
  129.     /* PCLK2 = HCLK */
  130.     RCC_PCLK2Config(RCC_HCLK_Div1);

  131.     /* PCLK1 = HCLK/2 */
  132.     RCC_PCLK1Config(RCC_HCLK_Div2);

  133.     /* Flash 2 wait state */
  134.     FLASH_SetLatency(FLASH_Latency_2);
  135.     /* Enable Prefetch Buffer */
  136.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

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

  139.     /* Enable PLL */
  140.     RCC_PLLCmd(ENABLE);

  141.     /* Wait till PLL is ready */
  142.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  143.     {
  144.     }

  145.     /* Select PLL as system clock source */
  146.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  147.     /* Wait till PLL is used as system clock source */
  148.     while(RCC_GetSYSCLKSource() != 0x08)
  149.     {
  150.     }
  151.   }
  152. }
  153. /*******************************************************************************
  154. * Function Name  : PVD_Configuration
  155. * Description    : Settup the Program Voltage Detect function
  156. * Input          : None
  157. * Output         : None
  158. * Return         : None
  159. *******************************************************************************/
  160. void PVD_Configuration(void)
  161. {
  162.   PWR_PVDLevelConfig(PWR_PVDLevel_2V8); //config the voltage threshold
  163.   PWR_PVDCmd(ENABLE); //enable PVD
  164.   EXTI_StructInit(&EXTI_InitStructure);
  165.   EXTI_InitStructure.EXTI_Line = EXTI_Line16; //connect to Line16
  166.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //enable PVD interrupt
  167.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//low voltage trigger interrupt
  168.   EXTI_InitStructure.EXTI_LineCmd = ENABLE; //enable interrupt lin
  169.   EXTI_Init(&EXTI_InitStructure);//initiation the EXTI
  170. }
  171. /*******************************************************************************
  172. * Function Name  : TB_Init
  173. * Description    : TimeBase peripheral initialization. The base time is set to
  174. *                  1ms and the related interrupt is enabled  
  175. * Input          : None
  176. * Output         : None
  177. * Return         : None
  178. *******************************************************************************/
  179. void TB_Init(void)
  180. {   
  181.   /* Select AHB/8 clock(HCLK) as SysTick clock source */
  182.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  183.   /* SysTick interrupt each 1ms with Core clock equal to 72MHz,1/72M*8*9000=0.001s */
  184.   SysTick_SetReload(9000);
  185.   /* Enable SysTick Counter */
  186.   SysTick_CounterCmd(SysTick_Counter_Enable);

  187.   /* Enable SysTick interrupt */
  188.   SysTick_ITConfig(ENABLE);
  189. }

  190. /*******************************************************************************
  191. * Function Name  : NVIC_Configuration
  192. * Description    : Configures the Vector Table base address.
  193. * Input          : None
  194. * Output         : None
  195. * Return         : None
  196. *******************************************************************************/
  197. void NVIC_Configuration(void)
  198. {
  199. NVIC_InitTypeDef NVIC_InitStructure;

  200. NVIC_DeInit();
  201. //if debug the code in RAM,must define VECT_TAB_RAM
  202. #ifdef  VECT_TAB_RAM  
  203.   /* Set the Vector Table base location at 0x20000000 */
  204.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  205. #else  /* VECT_TAB_FLASH  */
  206.   /* Set the Vector Table base location at 0x08000000 */
  207.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  208. #endif

  209. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


  210. NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 4, 0);

  211.         //hall input interrupt Priority must highest
  212.     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  213.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  214.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  215.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  216.         NVIC_Init(&NVIC_InitStructure);

  217.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  218.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  219.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  220.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  221.         NVIC_Init(&NVIC_InitStructure);
  222.         // TIM1 update even interrupt
  223.           NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
  224.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  225.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  226.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  227.           NVIC_Init(&NVIC_InitStructure);

  228. }

  229. /*******************************************************************************
  230. * Function Name  : LCD_Dis _ZEQ
  231. * Description    : LCD_Display
  232. * Input          : None
  233. * Output         : None
  234. * Return         : None
  235. *******************************************************************************/
  236. void  LCD_Dis_ZEQ(void)
  237. {
  238.   LCD_Init();
  239.   LCD_Clear();
  240.   Display_Welcome_Message();
  241. }

  242. /*******************************************************************************
  243. * Function Name  : Running_ZEQ
  244. * Description    : While_running
  245. * Input          : None
  246. * Output         : None
  247. * Return         : None
  248. *******************************************************************************/

  249. void  Running_ZEQ(void)
  250. {
  251. while(1)
  252.   {
  253.   Display_LCD();   
  254.   KEYS_process();
  255.     switch (State)
  256.     {
  257.      case IDLE:    // Idle state   
  258.       break;
  259.       case INIT:
  260.                 MCL_Init();         
  261.                         if(StartTime>4)   State=FAULT;
  262.                         else State = START;
  263.       break;
  264.           
  265.       case START:        
  266.                   //if(ReadTimer(TIMERSTARTUP)==WAIT) MCL_Init();
  267.                 //if(ReadTimer(TIMERSTARTUP)==OK) StopTimer(TIMERSTARTUP);
  268.       break;

  269.       case STOP:    // motor stopped        
  270.           /* Main PWM Output Disable */
  271.                   TIM1_CtrlPWMOutputs(DISABLE);
  272.                   State = WAITING;
  273.                         StartTimer(TIMERDELAY,500);
  274.       break;
  275.       
  276.       case  WAITING:    // waiting state
  277.                              TIM_SetCounter(TIM2, 0);
  278.                              Duty = 0;
  279.                           Duty1 = 0;
  280.                           Duty2 = 0;
  281.                           speed_integral = 0;
  282.                 TIM_Cmd(TIM2, DISABLE);
  283.                         TIM_Cmd(TIM3, DISABLE);
  284.                            TIM_ITConfig(TIM3, TIM_IT_Trigger, DISABLE);
  285.           if (ReadTimer(TIMERDELAY)==OK)
  286.           {
  287. #ifdef  HALL_SENSORS      
  288.             if (hRotorFreq == 0)
  289.             {               
  290.               State=IDLE;
  291.             }
  292. #endif            
  293.           }
  294.         break;
  295.    
  296.       case FAULT:   
  297.           TIM1_CtrlPWMOutputs(DISABLE);
  298.           State = WAITING;
  299.           StartTimer(TIMERDELAY,500);
  300.           TIM_Cmd(TIM3, DISABLE);
  301.           TIM_Cmd(TIM2, DISABLE);
  302.           bMenu_index=ERR_MENU;               
  303.        break;
  304.    
  305.       default:        
  306.        break;
  307.     }
  308.   }
  309. }


  310. #ifdef  DEBUG
  311. /*******************************************************************************
  312. * Function Name  : assert_failed
  313. * Description    : Reports the name of the source file and the source line number
  314. *                  where the assert_param error has occurred.
  315. * Input          : - file: pointer to the source file name
  316. *                  - line: assert_param error line source number
  317. * Output         : None
  318. * Return         : None
  319. *******************************************************************************/
  320. void assert_failed(u8* file, u32 line)
  321. {
  322.   /* User can add his own implementation to report the file name and line number,
  323.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  324.   /* Infinite loop */
  325.   while (1)
  326.   {
  327.     //printf("Wrong parameters value: file %s on line %d\r\n", file, line);
  328.   }
  329. }
  330. #endif



  331. /******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
复制代码

所有资料51hei提供下载:
STM32控制的高压无刷直流电机程序.rar (246.62 KB, 下载次数: 51)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-7 04:19 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:135281 发表于 2020-8-25 17:20 | 只看该作者
没有电路图怎么看呢
回复

使用道具 举报

地板
ID:55749 发表于 2020-9-9 18:47 | 只看该作者
请补全电路图。
回复

使用道具 举报

5#
ID:288971 发表于 2020-9-18 10:23 | 只看该作者
这个是官方案例吗?
回复

使用道具 举报

6#
ID:4294 发表于 2021-5-10 11:10 | 只看该作者
可惜没有电路图了,呵呵
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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