三霍尔BLDC——已知霍尔元件输出与相线输入电压的关系表,如何写程序

news/2025/10/3 22:51:48/文章来源:https://www.cnblogs.com/FBsharl/p/19125118

无刷直流电机比较流行,很多电机内部加入霍尔元件,通过霍尔元件可以知道电机转子的位置,根据这个位置给电机相线供电,这样电机就转起来了。框图如下所示

image

霍尔元件输出与相线输入电压的关系可以让BLDC电机厂家提供,一般都提供这个对应关系表,如下图所示

image

有了上面这些足可以让我们设计电路编写程序让电机转起来!

 

有上面的框图可以看出,3相电机的驱动需要六个mos管,一般用的是NMOS,大功率的NMOS比较便宜。大功率MOS管有较大的结电容,控制电压也高些,无法用单片机直接驱动,所以需要驱动电路。驱动芯片组成的驱动电路比较简单,常见的有IR2110S,我这里用IR2110S设计了MOS驱动电路,如下图所示,其中C24和D5是自举电路,为了控制Q3抬高电压。(然后组成3片IR2110S, 驱动6个NMOS)

image

霍尔元件供电是5V,他的输出一般也是5V,可以分压后给单片机用。

image

单片机用流行STM32,他有高级定时器T1,T8,可以输出3对互补的PWM波,还有刹车信号输入,这些特性对于电机的可控制非常合适。电路如下图所示

image

BLDC电机控制用到单片机定时器及IO中断,初始化部分如下

void TIM_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStruct;TIM_OCInitTypeDef  TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;EXTI_InitTypeDef EXTI_InitStructure;//NVIC_InitTypeDef NVIC_InitStructure;TIM_ICInitTypeDef TIM_ICInitStructure;// ¿ªÆô¶¨Ê±Æ÷ʱÖÓ,¼´ÄÚ²¿Ê±ÖÓCK_INT=72MRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// Êä³ö±È½ÏͨµÀ1 GPIO ³õʼ»¯GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;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;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 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);EXTI_InitStructure.EXTI_Line= EXTI_Line6; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7);EXTI_InitStructure.EXTI_Line= EXTI_Line7; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_DeInit(TIM1);        //½«ÍâÉèTIM1¼Ä´æÆ÷ÖØÉèΪȱʡֵ  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;  TIM_TimeBaseInitStruct.TIM_Period = 1000 ;       TIM_TimeBaseInitStruct.TIM_Prescaler = 3 ;     TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct ) ;       /* ¶¨Ê±Æ÷Êä³öͨµÀ1ģʽÅäÖà */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 1000;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_OCNIdleState_Set;TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_OC2Init(TIM1, &TIM_OCInitStructure);TIM_OC3Init(TIM1, &TIM_OCInitStructure);/* Automatic Output enable, Break, dead time and lock configuration*/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 = 1;TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM1, ENABLE);TIM_Cmd(TIM1, ENABLE);TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Enable);TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);TIM_CCxNCmd(TIM1,TIM_Channel_2,TIM_CCxN_Enable);TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Enable);TIM_CCxNCmd(TIM1,TIM_Channel_3,TIM_CCxN_Enable);
}

让电机转起来需要知道电机转子的位置,根据霍尔相位对应表驱动电机相线,程序里用中断获取霍尔电平的变化。

void EXTI0_IRQHandler(void) 
{ int i,j;if(EXTI_GetITStatus(EXTI_Line0)!=RESET){EXTI_ClearITPendingBit(EXTI_Line0);step=((GPIOA->IDR & GPIO_Pin_6)>>6)+((GPIOA->IDR & GPIO_Pin_7)>>6)+((GPIOB->IDR & GPIO_Pin_0)<<2);if(start==1){TIM1->CCER=PHASE_CHANGE[step];int_count1++;}}
}void EXTI9_5_IRQHandler(void) 
{ int i,j;if(EXTI_GetITStatus(EXTI_Line6)!=RESET){EXTI_ClearITPendingBit(EXTI_Line6);step=((GPIOA->IDR & GPIO_Pin_6)>>6)+((GPIOA->IDR & GPIO_Pin_7)>>6)+((GPIOB->IDR & GPIO_Pin_0)<<2);if(start==1){TIM1->CCER=PHASE_CHANGE[step];int_count2++;}}if(EXTI_GetITStatus(EXTI_Line7)!=RESET){EXTI_ClearITPendingBit(EXTI_Line7);step=((GPIOA->IDR & GPIO_Pin_6)>>6)+((GPIOA->IDR & GPIO_Pin_7)>>6)+((GPIOB->IDR & GPIO_Pin_0)<<2);if(start==1){TIM1->CCER=PHASE_CHANGE[step];int_count3++;}}
}

检测到变化后改变定时器输出,从而使电机相线得到驱动,我在程序里做好了数组,把得到了位置通过数组给定时器CCER寄存器,这样电机就转起来了

int PHASE_CHANGE[7]={0x0000,0x0104,0x0041,0x0140,0x0410,0x0014,0x0401};

这是霍尔输出与PWM输出波形的截图

image

这是定时器3对PWM的输出截图

image

这是电机和电路板

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信公众号服务号网站开发流程网站建设如果登录失败

简介&#xff1a;本文为用户介绍快速专利缴费的方法。 对于一家科技公司来说&#xff0c;手握多项专利是十分常见的事情。但这却也让相关负责人有点头疼。 “我们公司名下有十多件专利&#xff0c;从14年到现在大概每年申请了一两个专利。类型的话发明专利、外观专利、实用新…

音乐网站建设策划书网站备案幕布照片ps

最近笔试期间遇到一个难题&#xff0c;现在终于解决了&#xff0c;感谢各路大佬的指点&#xff0c;我在这里分享一下结果。 小红拿到一个数列满足&#xff1a; f(1) a&#xff1b; f(2) b&#xff1b; f(i) f(i-1) * f(i-2) * c^d 题目要求计算出第n项的因子数…

Dimensional Dimension

Dimensionless. Dimensionless!Here is a reorganized academic overview of dimensional dimension in physics, structured for clarity and precision:The Mathematical Essence of Dimensional Dimension Dimensio…

企业网站推广技巧凡科做的网站为什么搜不到

在 Redis 中&#xff0c;客户端请求命令执行完成后&#xff0c;确实会生成一个响应&#xff0c;但这个响应并不是总是立即发送给客户端的。这是因为 Redis 的单线程模型和 I/O 多路复用机制。以下是 Redis 处理响应数据的一般流程&#xff1a; 命令执行&#xff1a; 客户端发送…

河南省建设工程注册中心网站杭州明开seo

Python 从 3.10 版本开始增加了 match 语句&#xff0c;和其他语言常见的 switch 语句极其相似&#xff0c;但功能更加强大。 本文通过实例&#xff0c;了解下其用法。 基本的 match 语句 def http_code(status): match status: case 400 | 404 | 418: …

一加网站开发大连工商网站查询企业信息

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹责编 | 阿秃一张标志着上海现代建筑地标的东方明珠海报&#xff0c;另一张展示着上海悠久历史的豫园景区海报&#xff0c;不仅向我们展示了这座城市浓厚的历史气息与现代化的繁荣&#xff0c;也让我们看到了OpenStack历经…

Ruby 安装 - Windows - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做京东网站的摘要广西安策企业管理咨询有限公司

目录 Spark简介 1 什么是Spark 2 Spark特点 3 Spark分布式环境安装 3.1 Spark HA的环境安装 3.2 动态增删一个worker节点到集群 4 Spark核心概念 5 Spark案例 5.2 Master URL 5.3 spark日志的管理 5.4 WordCount案例程序的执行过程 6 Spark作业运行架构图&#xff…

计算机毕设 java 基于 vue 的 “江城风光” 旅游网 Java+MySQL “江城风光” 旅游信息一体化平台设计与开发 基于 SSM+Vue 的旅游资源展示与预订协同环境设计与完成

计算机毕设 java 基于 vue 的 “江城风光” 旅游网 Java+MySQL “江城风光” 旅游信息一体化平台设计与开发 基于 SSM+Vue 的旅游资源展示与预订协同环境设计与完成2025-10-03 22:34 tlnshuju 阅读(0) 评论(0) 收藏…

Spring事务管理:-propagation

propagation 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。 例:@Transactional(propagation=Propagation.REQUIRED) 常见传播行为‌REQUIRED‌(默认值):若存…

ZSH 安装配置

1. 安装基本工具 sudo apt install zsh git curl -y设置默认终端为 zsh(注意:不要使用 sudo)。 chsh -s /bin/zsh2. 安装 oh-my-zsh sh -c "$(curl -fsSL https://install.ohmyz.sh/)"5. 启用插件 修改~/…

六边形架构达成:领域驱动设计 + 端口适配器模式

六边形架构达成:领域驱动设计 + 端口适配器模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

长春网站设计团队好用的cms系统

数据介绍&#xff1a;根据2023年上市公司年报数据进行更新&#xff0c;包括基本信息、财务指标、环境、社会与治理、数字化转型、企业发展、全要素生产率等1413指标。数据范围&#xff1a;A股上市公司数据年份&#xff1a;1990-2023年指标数目&#xff1a;1413个指标&#xff0…

VSCode 中无法定位 Go 项目中自定义方法或类

自定义函数或类无法定位Go 项目中,自定义的函数、类型等无法通过 “转到定义” 或 “查找引用” 功能进行定位。 解决方法 如果 Go 项目没有正确初始化为 Go 模块(即没有 go.mod 文件),gopls 将无法正确解析代码的…

网站如何快速免费推广深圳制作广告宣传片制作

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 环境要求 1、Java SDK 1.8 下载 2、Eclipse IDE for Java EE Mars 2 (4.5.2) 下载&#xff08;依Eclipse举例&#xff0c;IDEA雷同。&…

青海建筑网站建设公司注册德国网站域名

文章目录 启动环境漏洞复现下载bp插件漏洞扫描dnslog测试是否向外请求资源用工具构造rmi服务器 反弹shell 启动环境 到vulhub目录下 cd vulhub/fastjson/1.2.24-rce安装环境并启动&#xff1a; sudo docker-compose up -d && sudo docker-compose up -d启动成功&…

中国网站排名前100天堂软件

From: http://blog.csdn.net/ljfrocky/article/details/46531137这篇文章主要介绍了如何使用PhpStorm Xdebug调试PHP程序&#xff0c;需要的朋友可以参考下。运行环境PhpStorm版本&#xff1a;8.0.3 PHP版本&#xff1a;5.4.12 xdebug版本&#xff1a;php_xdebug-2.2.3-5.4-vc…

乡镇网站建设宝塔面板设置wordpress伪静态

给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素&#xff0c;请找出移除后数组中不同整数的最少数目。 示例 1&#xff1a; 输入&#xff1a;arr [5,5,4], k 1 输出&#xff1a;1 解释&#xff1a;移除 1 个 4 &#xff0c;数组中只剩下 5 一种整数。…

写作业

完成离散作业