找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13667|回复: 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 单片机教程网

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