当前位置: 首页 > news >正文

南昌企业网站设计公司厦门哪里有做网站

南昌企业网站设计公司,厦门哪里有做网站,什么语言做网站简单,邯郸市旅游景点有哪些接上节stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(一)-CSDN博客 基本配置设置完成之后,本文代码采用KEIL5软件进行编写及实现。 首先新建一个HALL.c文件与HALL.h文件,HALL.c文件包括霍尔状态真值判断、六步换相函数、…

接上节stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(一)-CSDN博客

基本配置设置完成之后,本文代码采用KEIL5软件进行编写及实现。

首先新建一个HALL.c文件与HALL.h文件,HALL.c文件包括霍尔状态真值判断、六步换相函数、以及霍尔传感器的初始化。

霍尔状态真值判断的目的是为了获取当前电机旋转到的位置,对UVW三相霍尔值进行读取最直接的方法就是通过读取stm32的IO电平来实现。

以下为对应的霍尔状态真值判断函数:

uint8_t HALL_Value(void)
{
//HALL_Ustate --- PD12
//HALL_Vstate --- PD13
//HALL_Wstate --- PB8uint8_t State = 0;/* 读取霍尔位置传感器 U 的状态 */if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_12) != GPIO_PIN_RESET){State |= 0x01U << 2;}/* 读取霍尔位置传感器 V 的状态 */if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_13) != GPIO_PIN_RESET){State |= 0x01U << 1;}/* 读取霍尔位置传感器 W 的状态 */if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) != GPIO_PIN_RESET){State |= 0x01U << 0;}return State;
}

这个时候,会想到一个问题,就是这个函数既然是获取电机位置,那么我具体在哪些场景下会调用这些函数呢?

其实我们在刚拿到BLDC电机的时候,就会用这个函数来调试查看电机正转与反转时霍尔真值的变化情况,当然了,要调试查看的话,可以采用串口来看。

另外一个场景就是六步换相时,需要获取霍尔真值。

下面则是六步换相程序和霍尔传感器初始化,我的BLDC电机在正转时,真值2对应A相桥臂的上桥臂导通,B相桥臂的下桥臂导通,C相桥臂悬空,不做动作。真值3对应A相桥臂的上桥臂导通,B相桥臂悬空,C相桥臂的下桥臂导通。其余真值也是根据我实际电机的霍尔状态与相序导通关系来做发波处理的。

void SIX_STEP(uint8_t hallState) 
{switch(hallState) {case 2: // A+ B-    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 200);      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);            //使得对应所用驱动板上的下管一直导通HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 200);HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);            break;case 3: // A+ C-__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 200);      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 200); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0);HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);  break;case 1: // B+ C-__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 200);      HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 200); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0);HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);  break;case 5: // B+ A-__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);      HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 200); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 200);HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);  break;case 4: // C+ A-__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);      HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 200); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 200);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);  break;case 6: // C+ B-__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 200);      HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 200);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);   break;default: // 错误处理break;}
}/*霍尔传感器初始化*/
void HALL_Init(void)
{/* 启动霍尔传感器接口 */HAL_TIMEx_HallSensor_Start_IT(&htim4);	}

200是PWM波的占空比,占空比改变能够改变电机的速度 。

下面是主程序和中断程序:

int main(void)
{SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_TIM1_Init();MX_TIM4_Init();         HALL_Init();            //霍尔传感器初始化HALL_State = HALL_Value();SIX_STEP(HALL_State);  while (1){}}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM4){HALL_State = HALL_Value();SIX_STEP(HALL_State);HAL_GPIO_WritePin(GPIOH,GPIO_PIN_9,GPIO_PIN_SET);__HAL_TIM_CLEAR_FLAG(&htim4,TIM_FLAG_CC1);}
}

看到这里,肯定有人会疑问,为什么中断中放了六步换相和霍尔真值判断的程序,还要在主程序里面加两行一模一样的程序呢?

这是因为刚开始电机在没有六步换相转动之前,电机是处于静止的,因为霍尔信号没有变化,所以这个时候是触发不了霍尔中断的。因此先在主程序里面判断一下静止时候的霍尔值,然后根据这个霍尔值发波,来让电机转动一下,从而产生变化的一个霍尔信号,这个时候产生霍尔中断,然后执行六步换相程序,最后循环往复的触发中断,不断地进行换相。

根据以上程序,电机能够正常转动,采用六步换相的电机噪声较大是正常的。

http://www.dtcms.com/a/446800.html

相关文章:

  • 上虞做网站商超软件系统哪家好
  • 基于 Go 的PostgreSQL 数据库清理工具完整实现方案
  • 网站视频下载wordpress建站是什么意思
  • Web3生态图谱核心课程目录
  • 广州网站建设公视频播放类网站建设费用
  • 辽宁省住房和城乡建设厅网站进不去百度账户托管运营
  • C++用哈希表封装unordered_set和unordered_map
  • 盐城网站制作哪家好天元建设集团有限公司单位性质
  • 【环境配置 安装 】RK3588+Ubuntu20.04+cmake3.22+opencv4.54
  • 无锡高端网站设计建设外贸公司网站建设
  • 银行回单识别技术:通过图像预处理、关键区域定位、OCR识别、信息结构化等环节,能有效提升数据处理效率和准确性
  • 网络工程师笔记10-BGP协议
  • 十二师建设局网站风险网站怎么解决方法
  • 虚拟细胞赋能药物研发:AI驱动的“细胞模拟器”如何破解研发困局
  • 【AI论文】视觉拼图式微调可提升多模态大语言模型性能
  • 0、C语言基础——基本认识
  • C# 调用yolov11 onnx 后处理关注点
  • 做视频解析网站违法不品牌建设部门的规章制度
  • 建筑设计地图网站桐乡app开发
  • Linux的系统调用是怎么样运行的
  • 备案 网站名称 修改河北建设安装工程有限公司怎么样
  • 【2026计算机毕业设计】基于jsp的药店管理系统
  • 做的网站在百度找不到wordpress网页排版插件
  • 【高并发服务器】二、时间轮定时器设计与实现
  • 【操作系统】多线程
  • 信阳seo优化seo有些什么关键词
  • Giants Shoulder - Hyrix: LPDDR5 Commands New Features
  • 有关网站建设的外文文献好习惯网站
  • 网站的内容与功能设计优书网所有书单
  • 小迪web自用笔记56