【STM32】使用串口控制读取VESC

常见问题和解决方案:

Q1:缺少ch.h文件

A1:注释#include ch.h, 该文件属于ChibiOS中的文件,此处不需要

最后更新:2020年5月5日


Step1.下载和添加需要用到的头文件和源文件

>>1.1 在Github中下载相应文件,直接添加到工程

网址:https://github.com/vedderb/bldc_uart_comm_stm32f4_discovery 

下面是需要下载的文件:

#include "datatypes.h"  

#include "bldc_interface.c"

#include "bldc_interface.h"

#include "bldc_interface_uart.c"

#include "bldc_interface_uart.h"

#include "buffer.c"

#include "buffer.h"

#include "packet.c"

#include "packet.h"

#include "crc.c"

#include "crc.h"


Step2.通过串口向VESC发送控制命令

>>2.1 自定义一个函数 void send_packetu8 *s, u8 len)

该函数用于发送字符串,控制VESC的命令由此发送。一个实现例子如下:

void send_package(unsigned char  *s,unsigned int len)
{
  if(len>(PACKET_MAX_PL_LEN+5)){
    return;
  }
  while(len--)
  {
    while((USART1->SR & 0x40)==0);
    USART_SendData(USART1,*s++);
  }
}
 

 

>>2.2 在串口配置时使用函数 bldc_interface_uart_init(send_package)

      这是一个函数指针,指向函数 void send_packetu8 *s,u8 len,vesc将底层和逻辑剥离开来,使用函数指针的方式告知单片机在发送时调用函数 void send_packet(u8 *s,u8 len),如下图所示:

 

>>2.3发送部分配置完成,可以在主函数中调用以下函数:

          以下函数均可用于设置电机参数,由于VESC的机制,需要循环调用。

void bldc_interface_set_duty_cycle(float dutyCycle); //占空比设置

void bldc_interface_set_current(float current);  //电流设置

void bldc_interface_set_current_brake(float current); //刹车电流设置

void bldc_interface_set_rpm(int rpm);  //转速设置

void bldc_interface_set_pos(float pos);  //位置设置

void bldc_interface_set_handbrake(float current); //手刹电流设置

void bldc_interface_set_servo_pos(float pos); //伺服位置控制

示例,以电流模式10A控制电机:


Step3.通过串口接收VESC状态信息

>>3.1 在主函数中创建函数void bldc_val_received(mc_values *val)

void bldc_val_received(mc_values *val) {

printf("\r\n");

printf("Input voltage: %.2f V\r\n", val->v_in);

printf("Temp:          %.2f degC\r\n", val->temp_mos);

printf("Current motor: %.2f A\r\n", val->current_motor);

printf("Current in:    %.2f A\r\n", val->current_in);

printf("RPM:           %.1f RPM\r\n", val->rpm);

printf("Duty cycle:    %.1f %%\r\n", val->duty_now * 100.0f);

printf("Ah Drawn:      %.4f Ah\r\n", val->amp_hours);

printf("Ah Regen:      %.4f Ah\r\n", val->amp_hours_charged);

printf("Wh Drawn:      %.4f Wh\r\n", val->watt_hours);

printf("Wh Regen:      %.4f Wh\r\n", val->watt_hours_charged);

printf("Tacho:         %i counts\r\n", val->tachometer);

printf("Tacho ABS:     %i counts\r\n", val->tachometer_abs);

printf("Fault Code:    %s\r\n", bldc_interface_fault_to_string(val->fault_code));

}

>>3.2 在初始化时调用bldc_interface_set_rx_value_func(bldc_val_received)bldc_interface_get_values() 函数

    bldc_interface_set_rx_value_func(bldc_val_received)函数也是一个函数指针,在主循环里调用bldc_interface_get_values() 如下图所示:

>>3.3在串口中断服务函数中调用函数 bldc_interface_uart_process_byte( unsoigned char )

          参数unsoigned char b为串口收到的一个字节,如下图所示:

>>3.4 正确设置后由串口读取到的数据如下图:

参考教程:

1.正点原子《STM32F4开发指南-库函数版本》

2.本杰明串口通信教程 http://vedder.se/2015/01/vesc-open-source-esc/

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicssic

与你一起成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值