正点原子——直流无刷电机-霍尔传感基本实现流程

直流无刷电机-霍尔传感实现流程

初始化TIM以及IO

霍尔状态读取函数

uint32_t hallsersor(void)
{uint32_t state = 0;if(HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO,HALL_TIM_CH1_PIN)!=RESET){state |=0x01;}if(HAL_GPIO_ReadPin(HALL1_TIM_CH2_GPIO,HALL_TIM_CH2_PIN)!=RESET){state |=0x02;}if(HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO,HALL_TIM_CH1_PIN)!=RESET){state |=0x04;}return state;}

在这里插入图片描述

上下桥臂的导通情况,及六步换向

void ml_uhvl(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = g_blbc_motor1.pwm_duty;g_atimx_handle.Instance -> CCR2 = 0;g_atimx_handle.Instance -> CCR3 = 0;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_RESET);
}
void ml_uhwl(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = g_blbc_motor1.pwm_duty;g_atimx_handle.Instance -> CCR2 = 0;g_atimx_handle.Instance -> CCR3 = 0;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_SET);
}
void ml_vhul(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = 0;g_atimx_handle.Instance -> CCR2 = g_blbc_motor1.pwm_duty;g_atimx_handle.Instance -> CCR3 = 0;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_RESET);
}
void ml_vhwl(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = 0;g_atimx_handle.Instance -> CCR2 = g_blbc_motor1.pwm_duty;g_atimx_handle.Instance -> CCR3 = 0;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_SET);
}
void ml_whul(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = 0;g_atimx_handle.Instance -> CCR2 = 0;g_atimx_handle.Instance -> CCR3 = g_blbc_motor1.pwm_duty;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_RESET);
}
void ml_whvl(void)
{/*上桥臂*/g_atimx_handle.Instance -> CCR1 = 0;g_atimx_handle.Instance -> CCR2 = 0;g_atimx_handle.Instance -> CCR3 = g_blbc_motor1.pwm_duty;/*下桥臂*/HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_RESET);
}

设置旋转方向以及脉冲占空比,编写无刷启停函数

/*关闭电机函数,SHUTDOWN 拉低*,PWM_TIM1关闭,上桥臂关闭,下桥臂关闭*/
void stop_motor(void)
{SHUTDOWN_OFF;HAL_TIM_PWM_Stop(&g_atimx_handle,TIM_CHANNEL_1);HAL_TIM_PWM_Stop(&g_atimx_handle,TIM_CHANNEL_2);HAL_TIM_PWM_Stop(&g_atimx_handle,TIM_CHANNEL_3);g_atimx_handle.Instance -> CCR1 = 0;g_atimx_handle.Instance -> CCR2 = 0;g_atimx_handle.Instance -> CCR3 = 0;HAL_GPIO_WritePin(M1_LOW_SIDE_U_PORT,M1_LOW_SIDE_U_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_V_PORT,M1_LOW_SIDE_V_PIN,GPIO_PIN_RESET);HAL_GPIO_WritePin(M1_LOW_SIDE_W_PORT,M1_LOW_SIDE_W_PIN,GPIO_PIN_RESET);}
/*开启电机函数,SHUTDOWN 拉高*,PWM_TIM1打开,*/
void start_motor(void)
{SHUTDOWN_EN;HAL_TIM_PWM_Start(&g_atimx_handle,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&g_atimx_handle,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&g_atimx_handle,TIM_CHANNEL_3);}

在main.c中设置旋转方向以及脉冲占空比

int main(void)
{uint8_t key,t;//定义变量存放占空比int16_t pwm_dy = 0;HAL_Init();sys_stm32_clock_init(336,8,2,7);delay_init();usart_int(115200);led_init();key_init();lcd_init();bldc_init(1000-1,0);while(1){t++;if(t % 20 == 0){LED0_TOGGLE();}key = key_scan(0);if(key == KEY0_PRES){pwm_dy += 500;if(pwm_dy >= MAX_PWM_DUTY){pwm_dy = MAX_PWM_DUTY;}if(pwm_dy >0){g_bldc_motorl.dir = CW;g_bldc_motorl.pwm_duty = pwm_dy;	}else{g_bldc_motor1.dir = CCW;g_bldc_motorl.pwm_duty = -pwm_dy;}start_motor();g_bldc_motorl.run_flag = RUN;}else if(key == KEY1_PRES){pwm_dy -= 500;if(pwm_dy <= MAX_PWM_DUTY){pwm_dy = MAX_PWM_DUTY;}if(pwm_dy <0){g_bldc_motorl.dir = CCW;g_bldc_motorl.pwm_duty = -pwm_dy;	}else{g_bldc_motor1.dir = CW;g_bldc_motorl.pwm_duty = pwm_dy;}start_motor();g_bldc_motorl.run_flag = RUN;}else if(key == KEY2_PRES){stop_motor();g_bldc_motorl.run_flag = STOP;	g_bldc_motorl.pwm_duty = 0;pwm_dy = 0;}delay_ms(10);}
}

在中断函数中读取霍尔状态,根据方向以及霍尔状态依次导通上下桥臂

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == ATIM_TIMX_PWM){if(g_bldc_motor1.run_flag == RUN){//读取霍尔位置g_bldc_motor1.step_sta = hallsersor();if(g_bldc_motor1.step_sta >=1 && g_bldc_motor1.step_sta <=6){//正转时,CWif(g_bldc_motor1.dir == CW){switch(g_bldc_motor1.step_sta){case 0x01: mi_uhwl(); break;case 0x02: mi_vhul(); break;case 0x03: mi_vhwl(); break;case 0x04: mi_whvl(); break;case 0x05: mi_uhvl(); break;case 0x06: mi_whul(); break;default : break;}		}}else if(g_bldc_motor1.dir == CCW){switch(g_bldc_motor1.step_sta){case 0x01:ml_whul();break;case 0x02:ml_uhvl();break;case 0x03:ml_whvl();break;case 0x04:ml_vhwl();break;case 0x05:ml_vhul();break;case 0x06:ml_uhwl();break;default : break;}	}else{stop_motor();g_bldc_motor1.run_flag = STOP;}}}

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

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

相关文章

小白的进阶之路系列之十七----人工智能从初步到精通pytorch综合运用的讲解第十部分

NLP 从零开始:使用字符级 RNN 生成姓名 这是我们“NLP 从零开始”系列三部分教程中的第二部分。在第一个教程中,我们使用了 RNN 将姓名分类到其语言来源。这次我们将反过来,从语言生成姓名。 > python sample.py Russian RUS Rovakov Uantov Shavakov> python sampl…

思辨场域丨AR技术如何重塑未来学术会议体验?

毫无疑问&#xff0c;增强现实&#xff08;AR&#xff09;已成为科技浪潮中最澎湃的浪花之一。当Pokemon Go点燃全球热情&#xff0c;我们首次大规模体验到数字精灵与现实街景的奇妙交融。这不仅是游戏革命&#xff0c;更是一个强烈的信号&#xff1a;虚实共生的交互时代已轰然…

医学数据分析实战:冠心病发病因素可视化

一、数据加载与基本信息检查 #例9.5 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings#引入第三方库plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 warnings.filterwarnings(ignore) #防止…

Proteus8.0 打开前期版本的操作方法

1.打开Proteus8.0 2. 打开菜单File->Import legacy Project 3.在Import Legacy Project 点击Browse按钮 4.选择要打开的例子目录 5.打开*.dsn文件 6.点击Import 7.导入成功 点击运行即可

【innovus基础】- 对某根线单独route

在某些特殊需求场景&#xff0c;我们可能需要对某些net进行单独的route&#xff0c;方法如下&#xff1a; 1、打开design browser&#xff0c;选择对应net&#xff1a;&#xff08;或者使用selectNet命令&#xff09; 2、Route → nano Route → 勾选selectNet only 可以看到…

【Linux】network网络配置

目录 1、介绍2、网络配置【1】查看【2】说明 3、工作流程【1】启动以太网接口【2】关闭接口时反向执行 4、现代替换方案 1、介绍 linux中network网络服务的核心配置位于/etc/sysconfig/network-scripts/目录下。它们共同构成了网络接口的管理框架&#xff0c;负责处理网络接口…

深入解析 Taro 项目结构:从入门到精通

在现代前端开发中&#xff0c;跨平台开发框架变得越来越重要。Taro 作为一款由京东凹凸实验室推出的多端统一开发框架&#xff0c;支持编译到微信小程序、支付宝小程序、百度小程序、H5、React Native 等多个平台&#xff0c;极大地提高了开发效率。然而&#xff0c;要充分发挥…

零基础开始的网工之路第二十一天------系统安全基线和系统加固

目录 一、系统安全基线 1、账户与认证安全 2、文件与目录权限 3、SSH服务安全 4、网络与服务配置 5、日志与审计 6、内核参数加固 7、更新与补丁 8、安全模块配置 9、SUID/SGID文件检查 10、默认权限控制&#xff08;umask&#xff09; 二、系统安全加固 1、账户与…

Log4j 和 Log4j2的比较

以下是 Log4j&#xff08;通常指 Log4j 1.x&#xff09;与 Log4j2 的核心对比分析&#xff0c;结合架构、性能、功能及适用场景&#xff0c;帮助开发者做出合理选择&#xff1a; &#x1f4ca; 一、架构与设计 特性Log4j 1.xLog4j2分析架构模型单模块设计&#xff0c;耦合度高…

说说 Springboot 的启动流程?

Spring Boot 的启动流程是一个相对复杂但有序的过程&#xff0c;它涉及多个组件和步骤的协同工作。以下是 Spring Boot 启动流程的详细解析&#xff1a; 一、初始化阶段 启动入口 Spring Boot 应用的启动入口通常是一个包含 main 方法的类&#xff0c;该类上标注了 SpringBoot…

从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页

如果php.ini已经加入了如下的内容还是报错 &#xff1a; upload_max_filesize 1024M post_max_size 1024M 那就是因为阿帕奇导致&#xff1a;

10、java语法糖

编译期处理&#xff1a;语法糖&#xff08;即java编译器把。java的源码编译成。class字节码的过程中&#xff0c;自动生成和转换的一些代码&#xff0c;主要是为了减轻程序员的负担&#xff0c;算是java编译器给我们的一个额外福利-给糖吃&#xff09; 默认构造器&#xff1a;…

在Vscode中安装Sass并配置

在Vscode中安装Sass并配置 sass简介安装Sass插件配置sass插件编写sass使用Sass sass简介 Sass&#xff08;Syntactically Awesome Style Sheets,英文官方文档 &#xff09;是一种CSS预处理器&#xff0c;扩展了CSS的功能并提供了更高效的样式表编写方式。它兼容所有CSS版本&am…

深入解析 MySQL 并发控制:读写锁、锁粒度与高级优化

深入解析 MySQL 并发控制:读写锁、锁粒度与 InnoDB 实现细节 在高并发数据库应用中,确保数据一致性的同时最大化性能是永恒的挑战。MySQL 通过精巧的 锁机制(Locking) 和 多版本并发控制(MVCC) 来解决这个问题。本文聚焦于锁机制的核心:读写锁(共享/排他锁) 和 锁粒度…

【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来

一、为什么需要 Winograd 卷积算法&#xff1f;从 “卷积计算瓶颈” 说起 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;被广泛应用于图像识别、目标检测、语义分割等任务。然而&#xff0c;卷积操作作为 CNN 的核心计算单元&#xff0c;其计算量巨大&a…

前端项目脱离后端运行,备份后端API数据

问题描述&#xff1a; 开发过的项目老是打不开&#xff0c;因为离开公司后服务器用不了了。所以想着在公司开发的时候把数据都备份一下&#xff0c;供之后参考项目代码。 实现方法&#xff1a; 建一个Express服务&#xff0c;前端请求Express&#xff0c;Express代理目标服务器…

Windows下利用DevEcoStudio的交叉编译工具链编译assimp库给OpenHarmony使用

文章目录 准备编译使用 准备 安装DevEco Studio&#xff0c;并且安装好对应OpenHarmony版本的SDK 比如我这里安装了API 11 的sdk 对应的文件夹 然后下载ASSIMP的源文件&#xff0c;我这里下载的是5.4.3版本 【assimp 5.4.3】 解压放在一个文件夹里面&#xff0c;并在源码文…

批量大数据并发处理中的内存安全与高效调度设计(以Qt为例)

背景 在批量处理大型文件(如高分辨率图片、视频片段、科学数据块)时,开发者通常希望利用多核CPU并行计算以提升处理效率。然而,如果每个任务对象的数据量很大,直接批量并发处理极易导致系统内存被迅速耗尽,出现程序假死、崩溃,甚至系统级“死机”。 Qt自带的线程池(Q…

微信小程序课程设计美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代&#xff0c;餐饮行业数字化…

Linux中使用grep查看日志

Linux中使用grep查看日志 文章目录 Linux中使用grep查看日志1、使用 grep 查找字符或字符串示例常用选项例子 2、显示前后上下文选项说明示例命令 结果示例 3、显示出现的次数使用示例选项说明示例其他方法总结 4、其他命令1. 基本用法2. 常用选项3. 正则表达式支持4. 其他实用…