常见问题和解决方案:
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_packet(u8 *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_packet(u8 *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/