1月14日
1.对于昨天最后写的can通信,里面有几个高八位低八位的赋值,是因为
对stm32板子来说,此处反馈的就是接受的,一定要注意。
1.现在我们来总结一下所有结构体关系
1.第一个是机器人基本状态的结构体
2.第二个是遥控器接受数据的结构体
3.第三个是can通讯电机相关数据的结构体
2.接下来要定义一个发送数据的函数(之前已经定义完成,但此处要在另一个函数中判断是否是运动模式,并且要对速度赋值)
先是.h文件
#ifndef _SEND_SIGNAL_H_
#define _SEND_SIGNAL_H_
void SendSignal(void);
#endif
//此处只是为了以后方便添加变量定义
然后是.c文件
#include "send_signal.h"
#include "robot.h"
#include "can_motor.h"
extern struct Robot_t infantry;
int speed;//定义速度大小
void SendSignal(void)
{
if(infantry.workstate == STOP)
{
CanTransmit_1234(&hcan1,0,0,0,0);
}
else
{
m3510_1.speed_pid.ref = speed;
#ifdef CHASSIS
CanTransmit_1234(&hcan1, m3510_1.speed_pid.output,0, 0, 0);
#endif
// 判断模式
}
}
3.接来下是到操作系统,将之前写的所有函数结合到FREETOS.c中
首先要在stm32cube中选择FREETOS
然后就是到keil中操作
此时看到多出freetos.c文件,打开后发现
osThreadDef(send_signal, all, osPriorityIdle, 0,2048);
send_signalHandle = osThreadCreate(osThread(send_signal), NULL);
两句话,这两个是线程的定义,第一个函数而言,
第一个参量是线程的名字,第二个是线程执行的函数(此处我们定义了一个all的函数来将所有函数整合),第三个是优先级,第四个不知,第五个是分配的空间。
线程就是会一直无限的循环,类似于for(;;)
all函数
void all(void const * argument)
{
infantry.workstate = PREPARE;
for(;;)
{
Calculate(); //计算输出值,接收信号包含在内了
SendSignal(); //发出信号
osDelay(1);
}
}
4.接下来读了18年RM官方步兵车的源代码代码所学到的东西总结
1.
首先学到的是项目工程可以尽量分细,这样后来容易调试,而且尽量把功能模块化
2.将初始化放到一个函数中
3. 报错用法
上面的用法可以直接用另一个解决
4. 嵌套结构体
极大简化重复定义嵌套结构体
5在函数中使用可以选择自己需要的,类似于if