第二章 基于STM32F427的电机调试和时钟配置

第二章 基于STM32F427的电机调试和时钟配置

上一章我们移植好了单片机,于是在我们兴奋地看到自己点亮了LED之后,开始着手准备驱动的设置,那么这里面又会有什么问题呢?我把我遇到的困难和问题记录在此,同时也为你们答疑解惑。

电机和can通信移植过程

这里电机采用的是大疆的M3508,是通过can通信或者PWM波进行驱动的,此次的调试是在用F407成功驱动后的基础上进行的,所以如果需要详细程序的小伙伴可以去别的博客看看,关于他的驱动程序已经有很多,包括在github上也有开源的代码。我将会直接快进到移植的部分。
在这里插入图片描述

①IO口的切换

首先想到的就是CAN1 GPIO口的切换,这里用的CAN1口是PD0(RX)和PD1(TX),时钟线也应该更改到对应的GPIOD的时钟线上。

  GPIO_InitTypeDef GPIO_InitStructure;
  CAN_InitTypeDef CAN_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
  
  CAN1_PORT_ENABLE();
  
  GPIO_InitStructure.GPIO_Pin = PIN_CAN1_TX | PIN_CAN1_RX;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init( PORT_CAN1, &GPIO_InitStructure );
  
  GPIO_PinAFConfig( PORT_CAN1, CAN1_AF_TX, CAN1_AF );
  GPIO_PinAFConfig( PORT_CAN1, CAN1_AF_RX, CAN1_AF );

②CAN的初始化

接下来是CAN1的初始化,概括来讲就是
CAN1时钟线使能(在上文的 CAN1_PORT_ENABLE();)
CAN通信协议配置
CAN通信波特率设置
NVIC中断配置(配置一个接收中断就好)

  CAN_StructInit( &CAN_InitStructure );
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = ENABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 5; // Braudrate= 1M
  CAN_Init( CAN1, &CAN_InitStructure );
  
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit( &CAN_FilterInitStructure );
 
  // Enable CAN1 RX1 interrupt IRQ channel 
  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init( &NVIC_InitStructure );
  
  CAN_ITConfig( CAN1, CAN_IT_FMP0 | CAN_IT_FOV0, ENABLE );

再加上发送函数和接收函数原来都已经有了,所以CAN1通信初始化就算是做完了。接下来就可以开始测试电机了。

③测试函数和实际调试

在这里插入图片描述
简单在程序里写了个测试函数,在IAR的在线调试窗口中更改motor_test的值即可测试电机。

时钟设置

在实际检验中,发现电机没转,一方面检查程序,CAN通信是否从主板发出(验证是否成功赋值,以及进入到对应can通信的发送函数中);另一方面检查电路情况,包括线、电机、电调。
以上情况都没有问题,目前存在的问题是在线调试窗口中,成功赋值后没有返回值,所以此时利用示波器观察发送端和接收端,最终发现,有发送也有回传。请添加图片描述
如图:3508电机有反馈信息
两边检验之后,发现频率存在不一致,说明波特率设置有问题,波特率来自于板子的晶振频率,最终考虑时钟设置的问题。

STM32F427的时钟

STM32F427的时钟和原本的STM32F407在时钟频率上有一定区别
在这里插入图片描述
在这里插入图片描述
在系统时钟(sysclk)上最大频率为180MHZ,CAN1挂在APB1总线上,分频为4,即最终CAN1模块上的频率为45MHZ,(之前是168MHZ分频到42MZH),由于3508CAN通信默认波特率为1MZH,所以在CAN通信设置波特率时应当用
45/[(SJW+BS1+BS2)*Prescaler]=1
来实现。
然后最重要的是要在初始文件中更改定义的时钟参数。
system_stm32f4xx.c依次更改如下的参数:
在这里插入图片描述
在这里插入图片描述
stm32f4xx.h中更改HSE时钟的值
在这里插入图片描述
在这里插入图片描述
更改完毕后,正常调试,电机开始转动且有返回值。

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值