用的是幻尔科技的新推出的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用来计算电机转速。
标签:底板,编码器,电机,Car,代码,Robot,STM32,Mode,ROS From: https://www.cnblogs.com/cjl520/p/17645781.html