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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

直流無刷電機開環STM32控制-霍爾6步換向

  [復制鏈接]
跳轉到指定樓層
樓主
ID:368911 發表于 2018-7-11 11:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
直流無刷電機開環控制程序-6步換向法

STM32單片機源程序如下:

  1. #include "stm32f10x.h"
  2. #include <stdio.h>




  3. unsigned short int  CCR1_Val = 0;
  4. unsigned short int  CCR2_Val = 0;
  5. unsigned short int  CCR3_Val = 0;

  6. volatile unsigned char  HALL_Value = 0;
  7. unsigned char HALL_flag =1;

  8. /*******************************************************************************
  9. * 函數名稱: Timer1_Init();
  10. * 功能描述: 定時器1初始化
  11. * 輸入參數: void
  12. * 返回參數: 無
  13. ********************************************************************************/
  14. void PWM_GPIO_Init(void)
  15. {
  16.      GPIO_InitTypeDef GPIO_InitStructure;
  17.      //時鐘配置
  18.            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); // 使能GPIOA/GPIOB端口
  19.           
  20.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;    //PWM???PA8,9,10
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //??????
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.     GPIO_Init(GPIOA,&GPIO_InitStructure);                               //???GPIO

  24.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  //PWM???PA7
  25.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //??????
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.     GPIO_Init(GPIOB,&GPIO_InitStructure);                               //???GPIO

  28. }
  29. /*******************************************************************************
  30. * 函數名稱: HALL_GPIO_Init();
  31. * 功能描述: 霍爾端口初始化
  32. * 輸入參數: void
  33. * 返回參數: 無
  34. ********************************************************************************/
  35. void HALL_GPIO_Init(void)
  36. {  
  37.            GPIO_InitTypeDef GPIO_InitStructure;
  38.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);    // 使能GPIOC端口
  39.            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;  //PWM???PA7
  40.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                     //??????
  41.      GPIO_Init(GPIOB, &GPIO_InitStructure);

  42. }
  43. /*******************************************************************************
  44. * 函數名稱: Timer1_Init();
  45. * 功能描述: 定時器1初始化
  46. * 輸入參數: void
  47. * 返回參數: 無
  48. ********************************************************************************/
  49. void Timer1_Init(void)
  50. {   
  51.         
  52.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;       
  53.               TIM_OCInitTypeDef  TIM_OCInitStructure;
  54.               TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  55.              
  56.               PWM_GPIO_Init(); //端口初始化
  57.               HALL_GPIO_Init();
  58.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);   // 打開定時器1的時鐘
  59.              
  60.              
  61.                // 默認20KHZ
  62.               //設定3對PWM占空比
  63.               CCR1_Val    = 2799;
  64.         CCR2_Val    = 2799;
  65.         CCR3_Val    = 2799;
  66.       
  67.               //設置定時器相關參數
  68.               TIM_TimeBaseInitStructure.TIM_Prescaler = 0;                    // 72MHZ
  69.               TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計數模式
  70.               TIM_TimeBaseInitStructure.TIM_Period = 3599;         // 自動重裝載計數器周期的值
  71.               TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;                // 時鐘分頻系數--不分頻
  72.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  73.               TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
  74.        
  75.         //PWM模式設置-CH1
  76.                                 TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_Timing;          //PWM模式
  77.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //輸出使能
  78.                                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互補端使能輸出
  79.                                 TIM_OCInitStructure.TIM_Pulse = CCR1_Val ; //設置占空比
  80.         TIM_OCInitStructure.TIM_OCPolarity   =  TIM_OCPolarity_High;        //設置輸出極性
  81.                                 TIM_OCInitStructure.TIM_OCNPolarity  =  TIM_OCNPolarity_High; //設置輸出端互補極性
  82.                                 TIM_OCInitStructure.TIM_OCIdleState  =  TIM_OCIdleState_Set;  //死區后輸出狀態
  83.         TIM_OCInitStructure.TIM_OCNIdleState =  TIM_OCNIdleState_Set; //死區后互補端輸出狀態
  84.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  85.                                                        
  86.         TIM_OCInitStructure.TIM_Pulse = CCR2_Val ;
  87.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  88.                                
  89.         TIM_OCInitStructure.TIM_Pulse = CCR3_Val ;
  90.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  91.                                
  92.                                
  93.                                 //死區和剎車功能配置,使用了高級定時器
  94.                                 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//運行模式下輸出選擇
  95.         TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//空閑模式下輸出選擇
  96.         TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;   //鎖定設置
  97.         TIM_BDTRInitStructure.TIM_DeadTime = 0xc8;                 //死區時間--2us
  98.         TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;        //剎車功能使能
  99.         TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//剎車輸入極性
  100.         TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;//自動輸出使能
  101.         TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);   
  102.                                
  103.                                                                
  104.                                 TIM_CCPreloadControl(TIM1, ENABLE);     //使能預裝值       
  105.                                
  106.                                 TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE); //開啟通信事件
  107.               TIM_Cmd(TIM1, ENABLE);
  108.         TIM_CtrlPWMOutputs(TIM1, ENABLE);               
  109.         
  110. }     
  111. /*******************************************************************************
  112. * 函數名稱: BLDC_Hall_Convet();
  113. * 功能描述: 根據霍爾狀態進行換向--T1 T3 T5/T4 T6 T2排列
  114. * 輸入參數: 無
  115. * 返回參數: 無
  116. ********************************************************************************/
  117. void BLDC_Hall_Convet(void)
  118. {
  119. // char PB0_Value,PB1_Value,PB2_Value;
  120. //    PB0_Value = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);
  121. //    PB1_Value = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)*2;
  122. //    PB2_Value = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)*4;
  123. //   
  124. //   HALL_Value = PB0_Value+PB1_Value+PB2_Value;
  125.   HALL_Value =(unsigned char)((GPIO_ReadInputData(GPIOB) & 0x0007));        //讀轉子位置       
  126.        
  127.   if(HALL_flag ==1) //正轉
  128.   {                                                                         
  129.      switch(HALL_Value)   //根據轉子位置,決定CCER輸出相位和轉子字偏移量
  130.     {
  131.             case 0x05: //配置 T3/T4
  132.                           
  133.             /*  Channel2 configuration */
  134.             TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
  135.             TIM_CCxCmd(TIM1, TIM_Channel_2,  TIM_CCx_Enable);
  136.             TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  137.    
  138.             /*  Channel1 configuration */
  139.                                                 TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  140.                                                 TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
  141.                                                 TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);
  142.                
  143.                                                 /*  Channel3 configuration */   
  144.                                                 TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  145.                                                 TIM_CCxNCmd(TIM1, TIM_Channel_3,TIM_CCxN_Enable);
  146.                                                 TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);
  147.                                     
  148.                                     TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
  149.                              break;
  150.             case 0x04: //T4 T5
  151.                              /*  Channel3 configuration */
  152.                                     TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  153.                                                 TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
  154.                                                 TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  155.                
  156.                                                 /*  Channel1 configuration */
  157.                                                 TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  158.                                                 TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
  159.                                                 TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);

  160.                                                 /*  Channel2 configuration */
  161.                                                 TIM_CCxCmd(TIM1, TIM_Channel_2,  TIM_CCx_Disable);
  162.                                                 TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
  163.                                                 TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_InActive);
  164.                        
  165.                                TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
  166.                   break;                                                       
  167.       case 0x06: //T5 T6
  168.                   
  169.                                    /*  Channel3 configuration */
  170.                                         TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  171.                                         TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
  172.                                         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);       

  173.                                         /*  Channel2 configuration */
  174.                                         TIM_CCxCmd(TIM1, TIM_Channel_2,  TIM_CCx_Disable);
  175.                                         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
  176.                                         TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
  177.                
  178.                                         /*  Channel1 configuration */
  179.                                         TIM_CCxCmd(TIM1, TIM_Channel_1,  TIM_CCx_Disable);
  180.                                         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
  181.                                         TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_InActive);  

  182.            TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
  183.                        
  184.                              break;
  185.             case 0x02: //T6 T1
  186.                     
  187.                                   /*  Channel1 configuration */
  188.                                   TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  189.                                         TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
  190.                                         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  191.        
  192.                                         /*  Channel2 configuration */
  193.                                         TIM_CCxCmd(TIM1, TIM_Channel_2,  TIM_CCx_Disable);
  194.                                         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
  195.                                         TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
  196.                
  197.                                         /*  Channel3 configuration */
  198.                                         TIM_CCxCmd(TIM1, TIM_Channel_3,  TIM_CCx_Disable);
  199.                                         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
  200.                                         TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);  

  201.            TIM_GenerateEvent(TIM1, TIM_EventSource_COM);                       
  202.                 break;
  203.             case 0x03: // T1 T2
  204.                        
  205.                                    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  206.                                          TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
  207.                                          TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);

  208.                                          /*  Channel3 configuration */
  209.                                          TIM_CCxCmd(TIM1, TIM_Channel_3,  TIM_CCx_Disable);
  210.                                          TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
  211.                                          TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_Active);

  212.                                          /*  Channel2 configuration */
  213.                                          TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
  214.                                          TIM_CCxNCmd(TIM1, TIM_Channel_2,TIM_CCxN_Enable);
  215.                                          TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_InActive);
  216.                        
  217.                               TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
  218.                                                              
  219.                  break;
  220.             case 0x01: //T2 T3
  221.                      
  222.                                    /*  Channel2 configuration */
  223.                 TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1 );
  224.                                         TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
  225.                                         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  226.                
  227.                                         /*  Channel3 configuration */
  228.                                         TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  229.                                         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
  230.                                         TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_Active);
  231.                
  232.                                         /*  Channel1 configuration */   
  233.                                         TIM_CCxCmd(TIM1, TIM_Channel_1,  TIM_CCx_Disable);
  234.                                         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
  235.                                         TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_InActive);
  236.                        
  237.                                   TIM_GenerateEvent(TIM1, TIM_EventSource_COM);                    
  238.                 break;
  239.             default:break;
  240.                        
  241.                        
  242.        
  243.     }  
  244.   }

  245. }
  246. void Nvic_Init(void)
  247. {
  248.        
  249.   
  250.        
  251.    NVIC_InitTypeDef NVIC_InitStructure;                                                   //中斷結構體定?
  252.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
  253.        
  254.    
  255.         NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_IRQn;
  256.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;      //搶占優先級0
  257.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             //從優先級0
  258.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能IRQ通道
  259.         NVIC_Init(&NVIC_InitStructure);

  260.        
  261.   
  262.   // 可以繼續增加,設置中斷優先級
  263. }
  264.   

  265. void TIM1_TRG_COM_IRQHandler(void)       
  266. {
  267.          /* Clear TIM1 COM pending bit */
  268.    TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
  269.          BLDC_Hall_Convet();//換向
  270. }

  271. int main(void)
  272. {
  273.         SystemInit(); //系統時鐘配置函數,通過不同的時鐘定義,來選擇不同的主頻  
  274.         Nvic_Init();               
  275.         Timer1_Init();
  276.         BLDC_Hall_Convet();
  277.        
  278.   while(1)
  279.         {   
  280.                
  281.                       
  282.                                                        
  283.   }
  284.                
  285. }
  286.            
復制代碼

所有資料51hei提供下載:
霍爾六步換向成功.rar (289.9 KB, 下載次數: 250)



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

使用道具 舉報

沙發
ID:375234 發表于 2018-7-23 22:06 | 只看該作者
積分不足啊,等組了再來
回復

使用道具 舉報

板凳
ID:15170 發表于 2018-10-8 12:25 | 只看該作者
電機不動沒有跑起來。
回復

使用道具 舉報

地板
ID:259898 發表于 2018-10-13 14:40 | 只看該作者
你好,你用的是無刷電機,怎么驅動的
回復

使用道具 舉報

5#
ID:259898 發表于 2018-10-13 14:51 | 只看該作者
你好,怎么用單片機驅動無刷電機
回復

使用道具 舉報

6#
ID:259898 發表于 2018-10-13 14:54 | 只看該作者
你好,無刷電機怎么用單片機驅動,可以告訴我嗎
回復

使用道具 舉報

7#
ID:341045 發表于 2018-10-25 15:45 | 只看該作者
收藏了,謝謝分享
回復

使用道具 舉報

8#
ID:324611 發表于 2018-12-13 13:17 | 只看該作者
收藏了,學些下,謝謝分享。
回復

使用道具 舉報

9#
ID:368004 發表于 2018-12-13 16:39 | 只看該作者
收藏了
回復

使用道具 舉報

10#
ID:445421 發表于 2018-12-13 19:57 | 只看該作者
我是初學者,過來學習的
回復

使用道具 舉報

11#
ID:446351 發表于 2018-12-15 11:44 | 只看該作者
問一下作者,那電機怎么進行調速呢。
回復

使用道具 舉報

12#
ID:479575 發表于 2019-2-23 10:22 | 只看該作者
積分夠后,下載學習學習。謝謝!
回復

使用道具 舉報

13#
ID:247186 發表于 2019-4-30 17:26 | 只看該作者
謝謝樓主
回復

使用道具 舉報

14#
ID:547944 發表于 2019-5-26 22:58 | 只看該作者
多謝樓主分享  初學者謝啦
回復

使用道具 舉報

15#
ID:549113 發表于 2019-5-28 11:03 | 只看該作者
謝謝樓主
回復

使用道具 舉報

16#
ID:638203 發表于 2020-2-24 11:18 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

17#
ID:704942 發表于 2020-4-8 14:18 | 只看該作者
謝謝分享!!!!!!
回復

使用道具 舉報

18#
ID:62514 發表于 2020-4-9 22:06 | 只看該作者
收藏一下,覺得有用,好好學習。
回復

使用道具 舉報

19#
ID:252765 發表于 2020-4-11 11:28 | 只看該作者
謝謝樓主
回復

使用道具 舉報

20#
ID:135281 發表于 2020-8-5 14:53 | 只看該作者
資料不錯,可以進行基礎參考
回復

使用道具 舉報

21#
ID:785125 發表于 2020-8-6 15:35 | 只看該作者
用的什么驅動板呢?自己做嗎
回復

使用道具 舉報

22#
ID:274323 發表于 2020-8-6 17:04 | 只看該作者
好  收藏了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97色在线视频 | 97久久精品午夜一区二区 | 欧美日韩a | 亚洲国产精品一区二区久久 | 涩涩视频在线观看 | 成人欧美一区二区三区黑人孕妇 | 亚洲九九精品 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 谁有毛片| 欧美性tv| 成人免费看片又大又黄 | 中文字幕视频一区二区 | 国产日韩一区 | 国产精品成人国产乱一区 | 麻豆久久久久久久 | 最新国产精品视频 | 成人一区在线观看 | 成人精品鲁一区一区二区 | 国产福利在线视频 | 日本三级黄视频 | 国产人久久人人人人爽 | 成人av一区二区亚洲精 | 国产成人福利 | 免费看黄色片 | 日本高清不卡视频 | 亚洲久在线 | 精品国产乱码久久久久久闺蜜 | 欧美一级网站 | 99精品99 | 欧美一区2区三区4区公司 | 国产区精品视频 | 天天艹 | 国产99久久久国产精品 | 特级做a爰片毛片免费看108 | 91精品久久久久 | 欧美精品一区二区三区视频 | 神马影院一区二区三区 | 国产精品99久久久久久大便 | 午夜精品一区二区三区在线观看 | 国产在线精品一区二区三区 | 7799精品视频天天看 |