自学笔记7_pinocchio·L的博客-程序员秘密

1月19日
今天我会将底盘的代码全部放到这,而且会把之前没注释的内容注释,,如果有什么问题可以私信我,很多关于keil的基础内容我都没有写,主要是过几天就是向RM官方提交中期视频的时候,等提交完毕我会系统的全部都补上

昨天我写了底盘结构体和初始化函数,既然定义完毕了,那现在就开始写小车遥控器部分的代码(写代码时尽量根据功能分块写,然后最后只留一个接口,这样思维不容易混乱)

还是老样子,我们先写.h文件,之前关于硬件的部分信息我放到了自学笔记5中,现在我们就用到的上面的信息,其中remote.h(遥控器)处于初始状态时返回值为1024.

/*
    ------------------------------------------------------------------------
  | 文件名     :remote.h
  | 文件描述   :本文件用于遥控器接收函数的接口以及遥控器接收相关变量的定义
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************

*/
#ifndef REMOTE_H_
#define REMOTE_H_

#include "remote.h"
#include "robot.h"
#include "stm32f4xx.h"
#include "usart.h"

#define CH0_BIAS 1024
#define CH0_BIAS 1024
#define CH0_BIAS 1024
#define CH0_BIAS 1024

extern uint8_t rc_data[18];
void RemoteReceiveHandle(void);

#endif

然后以上就是我们遥控器的.h文件
接下来就是遥控器具体函数的书写(remote.c)

/*
    ------------------------------------------------------------------------
  | 文件名     :remote.h
  | 文件描述   :本文件用于遥控器接收函数的接口以及遥控器接收相关变量的定义
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************
*/

#include "remote.h"

uint8_t rc_data[18];
void RemoteReceiveHandle(void)
{
	Robot1.Remote.Rc.ch0 = ((int16_t)rc_data[0] | ((int16_t)rc_data[1] << 8)) & 0x07FF; 
	Robot1.Remote.Rc.ch1 = (((int16_t)rc_data[1] >> 3) | ((int16_t)rc_data[2] << 5)) & 0x07FF;
	Robot1.Remote.Rc.ch2 = (((int16_t)rc_data[2] >> 6) | ((int16_t)rc_data[3] << 2) |
											 ((int16_t)rc_data[4] << 10)) & 0x07FF;
	Robot1.Remote.Rc.ch3 = (((int16_t)rc_data[4] >> 1) | ((int16_t)rc_data[5]<<7)) & 0x07FF;
	
	Robot1.Remote.Rc.s1 = ((rc_data[5] >> 4) & 0x000C) >> 2;
	Robot1.Remote.Rc.s2 = ((rc_data[5] >> 4) & 0x0003);

	Robot1.Remote.Mouse.x = ((int16_t)rc_data[6]) | ((int16_t)rc_data[7] << 8);
	Robot1.Remote.Mouse.y = ((int16_t)rc_data[8]) | ((int16_t)rc_data[9] << 8);
	Robot1.Remote.Mouse.z = ((int16_t)rc_data[10]) | ((int16_t)rc_data[11] << 8);    

	Robot1.Remote.Mouse.press_l = rc_data[12];
	Robot1.Remote.Mouse.press_r = rc_data[13];

	Robot1.Remote.Mouse.key = ((int16_t)rc_data[14]);
	
 
	if(Robot1.Remote.Rc.s2 == 2)
	{
		Robot1.Remote.Robot_Mode = RC_Stop;
	}
	else if(Robot1.Remote.Rc.s2 == 3)
	{
		Robot1.Remote.Robot_Mode = RC_MouseKey;
	}
	else if(Robot1.Remote.Rc.s2 == 1)
	{
		Robot1.Remote.Robot_Mode = RC_Remote;
	}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		HAL_UART_Receive_DMA(&huart1,rc_data,18u);
		RemoteReceiveHandle();
		HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_8);
		
	}
}

接下来就是关于can通讯电机的代码的书写

/*
    ------------------------------------------------------------------------
  | 文件名     :canmotor.h
  | 文件描述   :本文件用于can通讯电机数据接收和处理的接口和相关数据的定义
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************
*/
#ifndef CANMOTOR_H_
#define CANMOTOR_H_

#include "stm32f4xx.h"
#include "robot.h"
#include "main.h"


#define CAN_BUF_SIZE 6


extern uint8_t can_data[8] ;


extern void Transmit(void);
extern void CanDataEncoderProcess_Chassis( struct CHASSIS_t *chassis);

#endif

然后就到相关can通讯函数的接收和数据的处理了

/*
    ------------------------------------------------------------------------
  | 文件名     :canmotor.c
  | 文件描述   :本文件用于can通讯电机数据接收和处理
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************
*/
void CanTransmit_Chassis(CAN_HandleTypeDef *hcanx, int16_t cm1_iq, int16_t cm2_iq, int16_t cm3_iq, int16_t cm4_iq)
{
	CAN_TxHeaderTypeDef TxMessage;
	
	TxMessage.DLC=0x08;
  TxMessage.StdId=0x200;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.RTR=CAN_RTR_DATA;
  uint8_t TxData[8];
	
	TxData[0] = (uint8_t)(cm1_iq >> 8);
	TxData[1] = (uint8_t)cm1_iq;
	TxData[2] = (uint8_t)(cm2_iq >> 8);
	TxData[3] = (uint8_t)cm2_iq;
	TxData[4] = (uint8_t)(cm3_iq >> 8);
	TxData[5] = (uint8_t)cm3_iq;
	TxData[6] = (uint8_t)(cm4_iq >> 8);
	TxData[7] = (uint8_t)cm4_iq; 

	if(HAL_CAN_AddTxMessage(hcanx,&TxMessage,TxData,(uint32_t*)CAN_TX_MAILBOX0)!=HAL_OK)
	{
		 Error_Handler();      
	}
}




void Transmit()
{
	if(Robot1.Remote.Robot_Mode == RC_Stop)   
	{
		CanTransmit_Chassis(&hcan1,0,0,0,0);
	}
	else
	{
			#ifdef CHASSIS                    
		CanTransmit_Chassis(&hcan1, Robot1.Chassis_A.Speed_Pid.output, Robot1.Chassis_B.Speed_Pid.output, Robot1.Chassis_C.Speed_Pid.output, Robot1.Chassis_D.Speed_Pid.output);
		#endif
	}
}

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	CAN_RxHeaderTypeDef   RxHeader;
	if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, can_data) != HAL_OK)
  {
    Error_Handler();          
  }
  CanDataReceive(RxHeader.StdId);  
}


void CanDataReceive(int motor_index)
{
	switch(motor_index)
	{
		#ifdef CHASSIS
		case Robot1Chassis_A_ID:
		//	LostCounterFeed(CHASSIS_MOTOR1_INDEX);    
			CanDataEncoderProcess_Chassis(&Robot1.Chassis_A);break;    
		case Robot1Chassis_B_ID:
			//LostCounterFeed(CHASSIS_MOTOR2_INDEX);
			CanDataEncoderProcess_Chassis(&Robot1.Chassis_B);break;
		case Robot1Chassis_C_ID:
		//	LostCounterFeed(CHASSIS_MOTOR3_INDEX);
			CanDataEncoderProcess_Chassis(&Robot1.Chassis_C);break;
		case Robot1Chassis_D_ID:
			//LostCounterFeed(CHASSIS_MOTOR4_INDEX);
			CanDataEncoderProcess_Chassis(&Robot1.Chassis_D);break;
		#endif
	}
} 

此时数据已经接受了,因为是底盘,所以此处我们只接受了速度的返回值,然后我们需要利用pid对它进行调速了

/*
    ------------------------------------------------------------------------
  | 文件名     :pid.h
  | 文件描述   :本文件用于pid函数的接口和.h文件的引用
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************
*/
#ifndef PID_H_
#define PID_H_

#include "robot.h"


extern void Pid_Calculate_Chassis(struct CHASSIS_t *chassis);
extern void Calculate(void);
#endif

然后就到pid.c文件

/*
    ------------------------------------------------------------------------
  | 文件名     :pid.c
  | 文件描述   :本文件用于pid函数的运算
  | 作者       : pinocchio
  | 创建时间   :1.18
   ------------------------------------------------------------------------
	修改日期 :未修改
	修改人   :无
   ------------------------------------------------------------------------
  **************************************************************************
	* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
	* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
	* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有 
	* 4.请勿转载!!!!!!!!!!!
	* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
	**************************************************************************
*/
#include "pid.h"

void Calculate()
{
	#ifdef CHASSIS
	Pid_Calculate_Chassis(&Robot1.Chassis_A) ;
  Pid_Calculate_Chassis(&Robot1.Chassis_B);
	Pid_Calculate_Chassis(&Robot1.Chassis_C);
	Pid_Calculate_Chassis(&Robot1.Chassis_D);
	#endif
	
}


void Pid_Calculate_Chassis(struct CHASSIS_t * chassis)
{
	chassis->Speed_Pid.error[0]=chassis->Speed_Pid.error[1];
	chassis->Speed_Pid.error[1]=chassis->Speed_Pid.Ref_Speed - chassis->Speed_Pid.Fd_Speed ;
	if(chassis->Speed_Pid.Fd_Speed  >0.7*chassis->Speed_Pid.Ref_Speed )  chassis->Speed_Pid.error[2]+= chassis->Speed_Pid.error[1];
	chassis->Speed_Pid.output = chassis->Speed_Pid.KP * (chassis->Speed_Pid.error[1]) \
                            + chassis->Speed_Pid.KI * (chassis->Speed_Pid.error[2]) \
	                          + chassis->Speed_Pid.KD * (chassis->Speed_Pid.error[1] - chassis->Speed_Pid.error[0]) ;
	                      
	if(chassis->Speed_Pid.error[2] > 200) chassis->Speed_Pid.error[2]=200;
	if(chassis->Speed_Pid.output > chassis->Speed_Pid.OutputMAX)  chassis->Speed_Pid.output =  chassis->Speed_Pid.OutputMAX;
	if(chassis->Speed_Pid.output < -chassis->Speed_Pid.OutputMAX) chassis->Speed_Pid.output = -chassis->Speed_Pid.OutputMAX;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44109556/article/details/86550899

智能推荐

单片机模拟_wenxi1202的博客-程序员秘密

一.数制之间的转换。1.完成BCD码和十进制数的转换。(1).(123)10=(000100100011)BCD(2).(100101110101)BCD=(975)102.将下列十进制数转换成8、16、2进制数。(1).(154)10=(232)8=(9A)16=(10011010)2(2).(0.71875)10=(0.10111)23.将二进制数转换成8、16进制

Python中排序方法sort、函数sorted的key参数的作用分析_python列表sort中的key参数_LaoYuanPython的博客-程序员秘密

从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 ‘key’ 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据。那么怎么使用这个key参数呢?有2种办法:1、使用一个函数,这个函数的操作对象就是要比较的数据元素,返回结果就是某个可以用来比较的Python类型的数据;2、使用匿名函数lambda,通过简单表达式返回某个可以...

《北漂的京城巡回礼》_weixin_30258027的博客-程序员秘密

本文地址原文地址2017-08-15微信号wozhuzaisi程序员的文娱情怀引子京城-北京的地铁大图 说起来,京城待了也有些年头了,去过了不少地方,想起来这些或明艳,或清爽,或古朴,或奢华的地方,我就禁不住想要分享给大家这些个美丽,带给我欢乐的地方。京城-美丽的景色...

64点FFT的verilog 代码 TESTBENCH.v_64点fft csdn_soldier520的博客-程序员秘密

// TESTBENCH// test serial 64 bit FFTmodule TESTBENCH();begin reg signed [7:0] InputData [63:0][1:0];reg signed [19:0] CalData [63:0][1:0];reg signed [19:0] TempDataR;reg signed [19:0] Te...

老师给我们总结的在linux下安装源代码的方法_zhangmn的博客-程序员秘密

1.把你的程序移动到/usr/local/src ------------ 这一步你也可以不做,但是这方便以后对源代码程序的管理与升级,如果乱放,时间长了就不好管理了2.cd /usr/local/src  ---------进入源代码所在的目录3.tar xzvf mtools-3.9.9.9.tar.gz   ----------解压缩文件 如果是是以bz2结尾的用tar xjvf

随便推点

利用虚拟机Ubuntu的Samba服务,实现Windows映射网络盘到Ubuntu_samba ubuntu 虚拟机 映射_cfl927096306的博客-程序员秘密

我的环境:虚拟机Ubuntu和Windows是通过桥接的方式来连接我的需求:虚拟机Ubuntu下载了Android代码,想利用Windows的Android studio来看代码实现方式:通过Samba服务来解决1. Ubuntu安装Samba服务:apt-get install samba samba-common2. 编辑Samba的配置文件/etc/samba

.NET CORE 第一节 创建基本的 asp.net core_与上铺程序员为伍的博客-程序员秘密

.NET CORE 第一节 创建基本的 asp.net core 大家好首先呢,先声明一下这些个东东呢,都是我试验成功后的产物我也是个小白,这只能说是记录过程笔记,如果那些地方理解的不对请多多指教,谢谢大家了接下来就开始了哦首先呢当然是先创建个.NET core啦(备注:vs2017创建的)然后嘞就选择创建的框...

程序使用微软雅黑作为默认字体在xp下的问题_半斗的博客-程序员秘密

1、微软雅黑是 Vista 及更高版本 Windows 的标配中文字体,但不是 XP 的标配字体,XP 的任何一个 SP 或更新包都没有包含它。2、XP系统默认中文字体是宋体,在电脑上的显示效果不如微软雅黑好看。3、程序如果在XP下使用微软雅黑,但系统又没有该字体时,会使用XP默认字体。4、XP 系统上的微软雅黑字体,通常有两种来源:用户主动下载安装或安装 Of

RN学习笔记01:概述、特点与环境搭建_rn特点_howard2005的博客-程序员秘密

RN学习笔记01:概述、特点与环境搭建一、RN概述React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台。RN使用Javascript语言,类似于HTML的JSX,以及CSS来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就...

求助关于atom编译python程序_第九日饕餮的博客-程序员秘密

刚开始使用atom,想用atom来编写python的程序,按照教程装了script,但运行程序后总显示一堆乱码,如图:该如何解决?

ant design pro表格排序(可以点击三次)_hideinform_旭旭1998的博客-程序员秘密

1、首先在column属性中添加sorter: true{ title: '流量计编码', dataIndex: 'flowmeterCode', hideInForm: true, ellipsis: true, sorter: true }点三次需要再加一个tablechange:tableChange如下,当表格排序有变化是重新加载表格: const tableChange = (pagination: any, fil