ROS小车STM32底板代码学习

发布时间 2023-08-22 18:12:24作者: 祈愿树下

用的是幻尔科技的新推出的ROS小车的STM32控制底板价格

他的代码是用HAL库写的,而且资料很少,刚开始连ROS1功能包都还在测试。

代码有300多M,编译一次,直接吃席。所以我用轮趣科技的ROS小车代码移植,采用的FreeRTOS写的,跟我学的代码风格几乎一致

移植过程中你会发现,电路很多地方都一致,盲猜有抄板。

注意:幻尔科技的没有电位器,无法通过改变电位器电平来改变车型。所以我在代码中直接固定了车型,手头电机有限,就选择差速小车。只需要两个轮子。

他这边的车型选择将ADC电平分段表示的注释掉,直接选择3号差速。OLED那边也是一样直接定死。

void Robot_Select(void)
{

//	Divisor_Mode=2048/CAR_NUMBER+5;
//	Car_Mode=(int) ((Get_adc_Average(Potentiometer,10))/Divisor_Mode); //Collect the pin information of potentiometer //²É¼¯µçλÆ÷Òý½ÅÐÅÏ¢	
//  if(Car_Mode>5)Car_Mode=5;

	Car_Mode=3;
	
	switch(Car_Mode)
	{
		case Mec_Car:       Robot_Init(MEC_wheelspacing,         MEC_axlespacing,          0,                     HALL_30F, Hall_13, Mecanum_75);            break; //Âó¿ËÄÉÄ·ÂÖС³µ
		case Omni_Car:      Robot_Init(0,                        0,                        Omni_Turn_Radiaus_109, HALL_30F, Hall_13, FullDirecion_60);       break; //È«ÏòÂÖС³µ
		case Akm_Car:       Robot_Init(Akm_wheelspacing,         Akm_axlespacing,          0,                     HALL_30F, Hall_13, Black_WheelDiameter);   break; //°¢¿ËÂüС³µ
		case Diff_Car:      Robot_Init(Diff_wheelSpacing,        0,                        0,                     HALL_30F, Hall_13, Black_WheelDiameter);   break; //Á½ÂÖ²îËÙС³µ
		case FourWheel_Car: Robot_Init(Four_Mortor_wheelSpacing, Four_Mortor__axlespacing, 0,                     HALL_30F, Hall_13, Black_WheelDiameter);   break; //ËÄÇý³µ 
		case Tank_Car:      Robot_Init(Tank_wheelSpacing,        0,                        0,                     HALL_30F, Hall_13, Tank_WheelDiameter);    break; //ÂÄ´ø³µ
	}

在system.c里面也有定义。可以统一定所有的mode

u8 Car_Mode=3;
// Robot type variable
//机器人型号变量
//0=Mec_Car,1=Omni_Car,2=Akm_Car,3=Diff_Car,4=FourWheel_Car,5=Tank_Car

 现在出现问题,在下载好我修改过后的代码后(还有按键、灯,OLED显示我都修改过了。)

差速小车模式。轮趣代码的AB电机对应这边24电机。

这边仔细对比了一下原理图,发现电机驱动器和编码器的对应有不同的地方,需要在编码器代码的初始化部分修改。(已修改,用蓝牙控制差速小车的两个电机正常。用ROS键盘控制今天有点问题,估计也是对应的问题。)

在修改编码器和电机驱动器的代码的时候,我有一些困扰,后来只按照电路表改了编码器的接口。

现在总结一下,motor.c就是电机驱动器,用两个PWN信号控制电机转速的。encoder.c就是编码器,他只是给外部编码器点击一个接口,同时通过时钟信号能够计算编码器传出来的转速。

总结:motor.c用来控制电机,encoder.c用来计算电机转速。