一、STM32F103驱动无刷直流电机基本思路
无刷电机控制是基于6步换相法如下图所示:

二、STM32F103驱动无刷直流电机方法介绍
通常我们用的方法是使用高级定时器3通道互补输出去驱动mos管,用通用定时器连接霍尔传感器去触发中断,在中断中换相,基本原理如下图所示:

三、驱动代码编写

/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void BLDC_GPIOConfig(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;  //TIM1输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;              //TIM3的霍尔输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                         //TIM3的霍尔输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void BLDC_TIM1Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;               //基本结构体变量定义TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;                   //死区刹车结构体变量定义TIM_DeInit(TIM1);TIM_TimeBaseStructure.TIM_Prescaler = 2;                     //TIM基本初始化TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//中央对齐计数模式TIM_TimeBaseStructure.TIM_Period = 1499;                       //PWM 16KTIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;         //TIM输出通道初始化TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  TIM_OCInitStructure.TIM_Pulse =1200; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;          TIM_OC1Init(TIM1,&TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse =1200;TIM_OC2Init(TIM1,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse =1200;TIM_OC3Init(TIM1,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;          //TIM输出通道4初始化,用来触发AD注入采样TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                   TIM_OCInitStructure.TIM_Pulse =1495; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;           TIM_OC4Init(TIM1,&TIM_OCInitStructure); TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //死区刹车初始化TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime = 100;TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;   //如打开,开机无输出且状态紊乱????TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕获比较寄存器预装载(通道1)TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);    //使能捕获比较寄存器预装载(通道2)TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);   //使能捕获比较寄存器预装载(通道3)TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);        //输入触发源选择TIM3   //TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);//从模式选择 触发     TIM_CtrlPWMOutputs(TIM1,ENABLE);TIM_Cmd(TIM1,ENABLE);
}
/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void BLDC_TIM3Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;               //基本结构体变量定义TIM_ICInitTypeDef TIM_ICInitStructure;                      //定义结构体变量TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Prescaler = 71;                  //TIM基本初始化TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period =65535;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //选择通道1TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //配置通道为输入,并映射到哪里TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //输入捕获预分频值TIM_ICInitStructure.TIM_ICFilter = 10;                      //输入滤波器带宽设置TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //输入通道配置TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;            //TIM输出通道初始化TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             TIM_OCInitStructure.TIM_Pulse =1023; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;            //TIM输出通道初始化TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;             TIM_OCInitStructure.TIM_Pulse =65535; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      TIM_OC4Init(TIM3,&TIM_OCInitStructure);TIM_SelectHallSensor(TIM3,ENABLE);                          //使能TIMx的霍尔传感器接口TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //输入触发源选择   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //从模式选择TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择        TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);      //选择输出触发模式(TRGO端)TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //开定时器中断 //TIM_Cmd(TIM3,ENABLE);
}
/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void huanxiang(void)
{u8 irq_zhuanzi; irq_zhuanzi=(u8)((GPIOA->IDR&0x000000c0)>>6);    //读转子位置irq_zhuanzi|=(u8)((GPIOB->IDR&0x00000001)<<2);if(zheng_fan==RESET){                                   //正转switch(irq_zhuanzi)                 //根据转子位置,决定CCER输出相位和转子字偏移量{/*    case 0x01:{                                                                       TIM1->CCER=0x3081;    //1,4};break;case 0x03:{TIM1->CCER=0x3180;    //4,5                  };break;                         case 0x02:{TIM1->CCER=0x3108;   //2,5};break;case 0x06:{TIM1->CCER=0x3018;  //2,3                   };break;case 0x04:{TIM1->CCER=0x3810;   //3,6                   };break;case 0x05:{TIM1->CCER=0x3801;    //1,6                  };break;default:break;  */case 0x05:{                                                                       TIM1->CCER=0x3081;    //1,4};break;case 0x04:{TIM1->CCER=0x3180;    //4,5                  };break;                         case 0x06:{TIM1->CCER=0x3108;   //2,5};break;case 0x02:{TIM1->CCER=0x3018;  //2,3                   };break;case 0x03:{TIM1->CCER=0x3810;   //3,6                   };break;case 0x01:{TIM1->CCER=0x3801;    //1,6                  };break;default:break;}  }else{                                  //反转switch(irq_zhuanzi)                 //根据转子位置,决定CCER输出相位和转子字偏移量{case 0x01:{                                      TIM1->CCER=0x3810;};break;case 0x05:{TIM1->CCER=0x3018;                    };break;                         case 0x04:{TIM1->CCER=0x3108;};break;case 0x06:{TIM1->CCER=0x3180;                      };break;case 0x02:{TIM1->CCER=0x3081;                       };break;case 0x03:{                             TIM1->CCER=0x3801;                      };break;default:break;}}
}
/**************启动******************/
void BLDC_Start(void)
{TIM1->SMCR|=0x0006;        //开TIM1的输入触发    TIM1->DIER=0x0040;         //开TIM1的触发中断huanxiang();               //调用换向函数,启动                                 TIM3->CR1|=0x0001;       //开TIM3TIM3->DIER|=0x0050;          //开TIM3中断
}
void BLDC_Stop(void)
{TIM1->SMCR&=0xfff8;          //关闭TIM1的输入触发TIM1->CCER=0;              //关闭TIM1的六路输出Delay_us(40);                  //延时(加死区)TIM1->CCER=0x0ccc;         //打开三路下管,进行能耗制动while(stalling_count<1);    //等待电机停止(TIM3连续溢出10次,即认为电机已停转)   TIM1->CCER=0;              //关闭TIM1的六路输出,关刹车        TIM3->CR1&=0xfffe;         //关闭TIM3                         TIM3->CNT=0;               //清TIM3的计数器                   TIM3->DIER&=0xffaf;        //关TIM3中断
}
/*** @brief  This function handles PPP interrupt request.* @param  None* @retval : None*/
void TIM1_TRG_COM_IRQHandler(void)
{ TIM1->SR&=0;           //清中断标志huanxiang();             //调用换向函数
}

四、完整工程下载
点击下载完整工程

STM32F103驱动无刷直流电机应用思路相关推荐

  1. STM32驱动无刷直流电机学习(2)

    stm32 通过 IRS2101S 将驱动io 升压,再驱动 N沟道MOS管 IRF540NS N沟道MOS管是通过 高电平导通 低电平禁止的 PWM1H PWM2H PWM3H 分别接 PA8 PA ...

  2. BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序

    BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序, 无传感的实现是基于反电动势过零点实现的,有传感是霍尔实现. 永磁同步电机有 ...

  3. STC单片机驱动BLDC无刷直流电机(无HALL)官方示例

    STC单片机驱动BLDC无刷直流电机(无HALL)官方示例 示例代码在STC8系列文档第20章里面:http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pd ...

  4. 永磁无刷电机及其驱动技术_东莞东昊电机无刷直流电机在伺服控制和工业驱动中的应用...

    东莞东昊电机有限公司致力于世界工业自动化的发展,生产的高性能.高品质无刷直流电机和相关的配套驱动器,并提供完善的运动控制技术和服务,努力为人类创造高效节能的工作环境. 同步型永磁交流伺服电机的控制器部 ...

  5. 计算机外围设计原理,CPLD无刷直流电机的驱动设计及原理分析

    直流无刷电机广泛应用于计算机外围设备.数控机床.机器人.伺服系统.汽车.家电等领域.本文介绍的电机驱动电路就是某稳定平台的角度伺服控制回路的驱动部分.本文中设计的基于CPLD的电机驱动电路,充分利用c ...

  6. 【2022项目复盘】无位置传感器的无刷直流电机驱动设计

    目录 概述 BLDC发展 历史 现状 未来前景 工作原理 BLDC结构 六步法 启动方式 转子预定位 转子的同步加速 切入转子正常旋转程序 反电动势检测法 硬件设计 控制模块最小系统 三相逆变器电路及 ...

  7. 无刷直流电机的结构及驱动方式

    1.铁心构成励磁线圈产生的磁通的磁路.它采用的是高磁导率的硅钢板叠层而成,可以抑制涡流降低铁损. 电机的转矩与磁场的磁通密度成比例.另外,磁通密度与驱动线圈的安匝数,也就是与驱动电流X匝数成比例. 为 ...

  8. 无刷直流电机矢量控制(二):单电阻采样

    在无刷直流电机的矢量控制中,采用分流电阻进行三相电流采样是一种经济成本较低.应用较成熟的方案,因此在很多低成本产品中应用十分广泛.分流电阻方案的整体思路是在下桥臂或地线上串联分流电阻,通过运放和控制器 ...

  9. 9-基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献)

    基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献) 文章目录 基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT ...

  10. 【毕业设计】9-基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献)

    毕业设计]基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献) 文章目录 毕业设计]基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿 ...

最新文章

  1. 写代码:使用while循环实现输出1,2,3,4,5,7,8,9,11,12
  2. NTP时间同步服务器搭建
  3. IDC发布对话式人工智能白皮书|附下载
  4. 水凝胶 静电纺丝_吉林大学:静电纺丝与水凝胶制备技术结合构建高强度光控智能水凝胶驱动器...
  5. Linux进程-命令行参数和环境列表
  6. Haproxy + Pacemaker 实现高可用负载均衡(一)
  7. JS实现鼠标点击展开/隐藏表格行
  8. c语言 判断乘法是否溢出,如何判断C语言算术运算的越界问题
  9. wamp无法访问php,wamp无法访问phpmyadmin怎么办
  10. JavaScript:get和post的区别
  11. .net pdf转图片_如何将PDF转图片?PDF转图片免费方法!
  12. 基于Python的旅游管理系统-小程序
  13. python之类和对象
  14. 使用外置无线网卡来切换mac地址
  15. java severlet 获取当前路径_Java 获取当前路径的方法总结
  16. python redis缓存_第二百九十五节,python操作redis缓存-字符串类型
  17. Scrum立会报告+燃尽图(Beta阶段第二周第二次)
  18. 异形3×3魔方还原教程_2345异形魔方教程
  19. Java解压缩技术(三)BZIP2压缩-解压缩
  20. 星际公民服务器位置,《星际公民》3.0测试服务器上线 游戏实际内容展示

热门文章

  1. 数据分析师的就业薪资
  2. 贾玲,这次你是不是可以真的快乐了?
  3. matlab p值 z值,显著性水平 p值 z值
  4. 租房经历总结-----我是如何2天找到合适租房的(房东直租)简单粗暴
  5. 基于springboot智慧养老手表管理系统
  6. 将Spring Boot Web应用部署到Tomcat服务器
  7. css背景颜色占满全屏幕
  8. Sqlite字段长度填坑
  9. 使用python print打印函数返回值多一个None的问题探究
  10. [Frank kelly] 经济学理论对TCP的收敛性和公平性做出分析,从理论上论证了TCP在互联网环境下的稳定性和有效性