请选择 进入手机版 | 继续访问电脑版
搜索
查看: 12892|回复: 33

[原创] 如何利用P-NUCLEO-IHM001转动带霍尔的BLDC电机(更新中)

  [复制链接]

该用户从未签到

28

主题

528

帖子

40

蝴蝶豆

论坛元老

最后登录
2021-3-28
发表于 2017-8-19 09:43:56 | 显示全部楼层 |阅读模式
本帖最后由 dzzwoaizi 于 2017-8-25 08:40 编辑

其实,看ST的官方demo有一种使人头大的感觉,各种代码各种库集合到一起,不容易上手,顾打算利用P-NUCLEO-IHM001转动手中带HALL的BLDC电机。原本是要在搞一套无位置BLDC的代码,但是苦耐于P-NUCLEO-IHM001是利用ADC检测反动势的(我利用的是比较器检测过零点)
/==============分割线===================/
带位置传感器的BLDC点击控制算法是比较简单的,只需要搞懂HALL位置和通电顺序的对应关系就能将电机转起来。
BLDC_HALL所以的单片机资源
(1)高级定时器TIM1+ADC+DMA
         ST在这一块做的堪称完美,高级定时器的CC4通道用来触发ADC采集数据,ADC采集完成之后利用DAM搬运到数组中,这所有的流程都是硬件完成的,程序只需要读取数组中的ADC采样值就可以了,这样大大节省了单片机的运算时间。
(2)3路外部中断连接HALL
         这里你当然也可以利用TIM接口与高级定时器直接连接在一起,利用硬件在换向,但是这种方式不便于移植算法。相反,ST的每个IO口都可以作为外部中断口来用,我们只需要随便3个IO就可以了。
利用以上资源就能够将电机转起来。

流程分3步,1.搭建STM32F3开发环境  2.底层代码编写,3.算法如何调试

昨天抽了个时间建立了一个工程,找不到flash加载了,很是郁闷,经过一番查找,终于找打解决办法。因为我装个KEIL4.7,可能是因为我之前卸载KEIL5从新装pach包的时候装错地址了。解决办法:在KEIL4安装目录下找到E:\2.software\mdk470\ARM\Flash  把里面的 STM32XXX.FLM文件复制到你安装的LEIL5的\ARM\Flash中既可以了。附件为刚建好的工程模板, 2.STM32F302RB_BLDC.zip (7.54 MB, 下载次数: 301)
回复

使用道具 举报

该用户从未签到

28

主题

528

帖子

40

蝴蝶豆

论坛元老

最后登录
2021-3-28
 楼主| 发表于 2017-8-22 17:39:00 | 显示全部楼层
本帖最后由 dzzwoaizi 于 2017-9-2 13:12 编辑
如何利用高级定时器CC4通道来触发ADC采集数据在利用DMA搬运到数组之中的。
说实话,第一次用STM32F3系列的单片机,和F0的还不是非常一样,我还花了很多时间将寄存器手册看了几个重要的外设。仔细阅读了STM32F的寄存器手册之后发现只有注入组才能用CC4触发ADC,如图为ADC外部信号触发的图
YQ%~K@PT7FB$MMSQF]6ZN5X.png 9%0`_CEZHGM9SGP60D20REC.png
这个是规则组和注入阻外部触发信号选择,我选择的规则组,这里用TIM1_CC1触发ADC采集,所以相对应的代码配置如下:
  1. /* Initialize ADC structure */
  2.         ADC_StructInit(&ADC_InitStructure);
  3.         ADC_InitStructure.ADC_Resolution                   = ADC_Resolution_12b;
  4.         ADC_InitStructure.ADC_ContinuousConvMode          = DISABLE;                                                                                                                                            //单通道模式
  5.         ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge; ; //设置上升沿触发中断
  6.         ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0 ;            //ADC触发源
  7.         ADC_InitStructure.ADC_DataAlign                    = ADC_DataAlign_Right;                                                                                           //数据右对齐
  8.         ADC_InitStructure.ADC_OverrunMode                                         = ADC_OverrunMode_Enable;                                                                                 //数据溢出禁用
  9.         ADC_InitStructure.ADC_AutoInjMode                                         = ADC_AutoInjec_Disable;      
  10.         ADC_InitStructure.ADC_NbrOfRegChannel                         = 2;        
  11.         ADC_Init(ADC1, &ADC_InitStructure);
复制代码
在看一下通道的选择:(电压,温度)
E@RMUX)H%SHUYDUE5_0Z749.png 1X$%O)QP2}}[F5Z3RBP)V`N.png
可以看到这里用的是是PA1和PC2
  1. /* ADC1 regular channel7 configuration */
  2.         ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_7Cycles5);
  3.         ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_7Cycles5);
复制代码
然后在使能ADC切配置DMA使能就OK了!
  1. /* ADC1 DMA Enable */
  2.         ADC_DMACmd(ADC1, ENABLE);
  3.         ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);
  4.         /* Enable ADC1 */
  5.         ADC_Cmd(ADC1, ENABLE);
  6.         /* wait for ADRDY */
  7.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
  8.         /* Start ADC1 Software Conversion */
  9.         ADC_StartConversion(ADC1);
复制代码
DMA配置如下!
  1.     DMA_InitTypeDef DMA_InitStructure;  
  2.           NVIC_InitTypeDef NVIC_InitStructure;
  3.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);              //使能DMA时钟  
  4.   
  5.     DMA_DeInit(DMA1_Channel1);                                      //复位DMA1_channel1  
  6.     DMA_StructInit(&DMA_InitStructure);                            //初始化DMA结构体  
  7.   
  8.     DMA_InitStructure.DMA_PeripheralBaseAddr         = (uint32_t) &(ADC1->DR);//取值的外设地址  
  9.     DMA_InitStructure.DMA_MemoryBaseAddr                         = (uint32_t)&ADC_Tab[0];//缓存数据数组起始地址  
  10.     DMA_InitStructure.DMA_DIR                                                                 = DMA_DIR_PeripheralSRC;//DMA方向:外设作为数据源  
  11.     DMA_InitStructure.DMA_BufferSize                                         = 2;                                            //DMA缓存数组大小设置  
  12.     DMA_InitStructure.DMA_PeripheralInc                                 = DMA_PeripheralInc_Disable;//外设地址递增禁用  
  13.     DMA_InitStructure.DMA_MemoryInc                                         = DMA_MemoryInc_Enable; //内存地址递增  
  14.     DMA_InitStructure.DMA_PeripheralDataSize         = DMA_PeripheralDataSize_HalfWord;//外设取值大小设置为Halfword  
  15.     DMA_InitStructure.DMA_MemoryDataSize                         =        DMA_MemoryDataSize_HalfWord ;//数据大小设置为Halfword  
  16.     DMA_InitStructure.DMA_Mode                                                                 = DMA_Mode_Circular;    //DMA循环模式,即完成后重新开始覆盖  
  17.     DMA_InitStructure.DMA_Priority                                                 = DMA_Priority_High;    //DMA优先级设置为高         
  18.     DMA_InitStructure.DMA_M2M                                                                 = DISABLE;              //内存到内存禁用  
  19.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
  20.   
  21.     //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  22.     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn ;
  23.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  24.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =0 ;
  25.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  26.     NVIC_Init(&NVIC_InitStructure);  
  27.                
  28.     DMA_ITConfig(DMA1_Channel1, DMA1_FLAG_TC1, ENABLE);                  //使能DMA中断  
  29.     DMA_ClearITPendingBit(DMA1_FLAG_TC1);                                //清除一次DMA中断标志  
  30.     DMA_Cmd(DMA1_Channel1, ENABLE);  //使能DMA1
复制代码
DMA配置的时候一定要注意外设地址和缓存数据起始地址及缓存数据的大小不要设置错了,否则采集数据也会出现错位!我这里采集的是两路,所以定义的是  uint16_t ADC_Tab[2];            //ADC储存
这里BUF对应的数据如下 :ADC_Tab[0]存放的电压的采集值。ADC_Tab[1]存放的温度的采集值
你只需要在主程序中调用者两个值就可以了!


附件为自己调试好的程序,有兴趣的可以自己下载看看,里面基本的功能都调试完成,代码的硬件就是P-NUCLEO-IHM001,
视频会晚些上传给大家看看效果。 4.STM32F302RB_BLDC.zip (7.89 MB, 下载次数: 2235)
回复 支持 反对

使用道具 举报

该用户从未签到

18

主题

334

帖子

1

蝴蝶豆

金牌会员

最后登录
2019-7-22
发表于 2017-8-19 11:00:25 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

0

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2018-11-11
发表于 2017-10-21 15:17:50 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

0

主题

13

帖子

0

蝴蝶豆

初级会员

最后登录
2018-12-13
发表于 2018-3-15 22:25:34 | 显示全部楼层
后悔看到的有点晚
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

528

帖子

40

蝴蝶豆

论坛元老

最后登录
2021-3-28
 楼主| 发表于 2018-3-16 08:25:30 | 显示全部楼层
1767355084 发表于 2018-3-15 22:25
后悔看到的有点晚

遇到同行了相互学习
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

16

帖子

0

蝴蝶豆

初级会员

最后登录
2021-4-1
发表于 2018-3-28 09:27:43 | 显示全部楼层
感谢  无私奉献!
回复 支持 反对

使用道具 举报

该用户从未签到

21

主题

352

帖子

36

蝴蝶豆

金牌会员

最后登录
2020-3-30
发表于 2018-4-24 19:45:56 | 显示全部楼层
楼主威武
回复

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

初级会员

最后登录
2019-4-10
发表于 2018-5-12 15:11:06 | 显示全部楼层
多谢
回复

使用道具 举报

该用户从未签到

0

主题

4

帖子

0

蝴蝶豆

新手上路

最后登录
2018-5-18
发表于 2018-5-17 20:14:15 | 显示全部楼层
xiexie
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 01:04 , Processed in 0.209235 second(s), 48 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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