STM32 电机教程 23 - ST MCLIB实战之基于stm32f13c8tx构建FOC工程

前言

前面章节我们介绍了很多关于ST MotorControl Workbench的使用及实例 ,但是所有的实例均是基于ST的NUCLEO-F103RB和X-NUCLEO-IHM07M1 3SH开发板进行讲解与演示的,很多同学表示手头并没有相应的开发板,且在实际应用时经常会出现各种各样的问题,从本节开始,将给大家演示一下实际应用工程中怎么用ST MotorControl Workbench来配工程,调参数。在本节开始之前先给大家分享几个ST官方ST MotorControl Workbench的使用说明资料(位于ST MotorControl Workbench安装文件夹下的Documentation 文件夹中,如笔者的D:\Program Files (x86)\STMicroelectronics\MC_SDK_5.3.3\Documentation):

      好了,下面我们进入实战环节,首选先简单看一下原理图:

 

      电机控制部分电路基本就如上面的图片所示,接下来我们就按上面的原理图来构延ST MotorControl Workbench电机控制工程:

新建工程,如下图:

接下来我们按下图所标顺序依次配置各模块:

1.Bus Voltage sensing:

2.Temperature sensing,原理图中没有,跳过。

3.motor 根据自己实际电机参数去填写,如笔者所用电机如下:

本实例用绝对式磁编码器来检测电机位置,所以传感器这里可以都不选(先对无感FOC方式配好工程,然后到工程代码中手动加入绝对式编码器对应的功能代码即可):

4.current sensing :

5.Over current protection(过流保护) :

 

6.Speed Sensing (选用无感方式,保持默认即可) :

7.Power Stage – Power Switches(根据实际情况填) :

8.Power Stage – Driving signal …(根据实际情况填) :

9.Firmware Drive Management – start -up …(保持默认) :

Firmware Drive Management – Drive setting …(根据实际填) :

Firmware Drive Management – addition features …(保持默认) :

 

Firmware Drive Management – sensing Enabling …(根据实际填) :

10.MCU and Clock Freq :

11.Digital I/O :

12.DAC functionality :

13.ADC Input and Protection :

 

14.User Interface(保持默认即可) :

 

保存工程,生成代码即可:

生成完成后,MCU还不是stm32f103c8t6,这时可以到cube(.ioc)工程中修改MCU芯片,再更新代码即可,用文本编译器打开.ioc文件,用夫换工具将所有的STM103R替换成STM103C,然后将所有的STM103RBTx替换成STM103C8Tx,最后将LQFP64换成LQFP48:

修改前:

修改后:

当然因为本示例仅有一个普通ADC通道(总线电压),在.Ioc工程中ADC模块配置有点小问题,手动按下图修改即可:

最后在cube工具打开ioc工程,按原理图配置好LED引脚 ,SPI绝对磁编码器接口,CAN通信接口以及修改一下定时器1接口(实际原理图并没有用到BREAK引脚 ),以下操作仅供参考:

CAN:

SPI:

LED:

最后调整一下模块的初始化速度就可以直接生生工程代码了:

 

打开工程,编译工程,解决掉工程中的各个问题(最多问题就是工程中少包含某个文件,手动加入一下就可以了):

到此,基于ST MCLIB的stm32f13c8tx FOC工程创建工作就基本完成了,下一讲将给大家介绍如何将其无感方式变成绝对式磁编码位置检测方式。也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,每天都会有技术干货推出!!

 

文中源码及资料下载,关注十三公众号:

在公众号里给十三发送 “下载|STM32 电机教程 23” :

 

 

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是基于stm32f13c8t6和HCSR04的超声波测距代码,可以参考: ```C #include "stm32f10x.h" #include "delay.h" #define TRIG_PIN GPIO_Pin_0 #define ECHO_PIN GPIO_Pin_1 #define TRIG_PORT GPIOA #define ECHO_PORT GPIOA void HCSR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TRIG_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ECHO_PORT, &GPIO_InitStructure); } float HCSR04_GetDistance(void) { u32 start_time = 0, end_time = 0; float distance = 0; GPIO_SetBits(TRIG_PORT, TRIG_PIN); delay_us(10); GPIO_ResetBits(TRIG_PORT, TRIG_PIN); while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == RESET); start_time = SysTick->VAL; while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == SET); end_time = SysTick->VAL; if(end_time > start_time) { distance = (float)(end_time - start_time) * 100 / 72 / 2; } else { distance = (float)(start_time - end_time) * 100 / 72 / 2; } return distance; } int main(void) { HCSR04_Init(); Delay_Init(); while(1) { float distance = HCSR04_GetDistance(); printf("Distance: %.2f cm\r\n", distance); delay_ms(500); } } ``` 需要注意的是,该代码使用了自己编写的一个延时库delay.h,如果没有的话需要自行编写。此外,需要将printf函数与串口进行绑定,否则无法输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值