版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014695839/article/details/81137574
这段时间在实验室做一个两轮差速驱动的机器人,控制机器人运动的程序框架在此记录一下。
机器人的两个轮子分别由两个直流电机驱动,电机上带有编码器,可以测量轮子的转速和计算机器人的行程。机器人电机的控制由STM32来完成,STM32要根据上位机发送的命令控制机器人完成前进、后退和转弯等动作。STM32上实现的机器人控制的程序框架如下:
//wheels.c
#include "wheels.h"
//左轮剩余运动时间
uint16_t WHEELS_RestTimeLeft;
//右轮剩余运动时间
uint16_t WHEELS_RestTimeRight;
//左轮目标速度
float WHEELS_TargetSpeedLeft;
//右轮目标速度
float WHEELS_TargetSpeedRight;
//左轮速度
float WHEELS_CurrentSpeedLeft;
//右轮速度
float WHEELS_CurrentSpeedRight;
void WHEELS_Init()
{
//========================直流电机配置==============================
/*定时器配置PWM*/
//=========================编码器配置===============================
/*定时器配置为编码器模式*/
//=========================初始化变量==============================
WHEELS_RestTimeLeft = 0;
WHEELS_RestTimeRight = 0;
WHEELS_TargetSpeedLeft = 0;
WHEELS_TargetSpeedRight = 0;
WHEELS_CurrentSpeedLeft = 0;
WHEELS_CurrentSpeedRight = 0;
}
void WHEELS_DriveLeft(float speed, uint16_t msec)
{
WHEELS_RestTimeLeft = msec;
WHEELS_TargetSpeedLeft = speed;
}
void WHEELS_DriveRight(float speed, uint16_t msec)
{
WHEELS_RestTimeRight = msec;
WHEELS_TargetSpeedRight = speed;
}
//函数1ms调用一次
void WHEELS_Run()
{
//=========================左轮===============================
if(WHEELS_RestTimeLeft > 0)
{
WHEELS_RestTimeLeft --;
}
else
{
WHEELS_TargetSpeedLeft = 0;
}
/*计算当前速度WHEELS_CurrentSpeedLeft*/
/*根据当前速度和目标速度的误差重新设置占空比*/
//=========================右轮===============================
if(WHEELS_RestTimeRight > 0)
{
WHEELS_RestTimeRight --;
}
else
{
WHEELS_TargetSpeedRight = 0;
}
/*计算当前速度WHEELS_CurrentSpeedRight*/
/*根据当前速度和目标速度的误差重新设置占空比*/
}
WHEEL_Init函数:机器人的电机由STM32定时器的PWM控制,编码器通过定时器的编码器模式进行计数,因此WHEEL_Init函数对需要用到的定时器进行配置,并且初始化相关的变量。
WHEELS_DriveLeft / WHEELS_DriveRight函数:这两个函数可以在任意时刻调用,调用后机器人轮子以speed(参数)的线速度运动msec(参数)毫秒。在mesc毫秒内再次调用这个函数,可让机器人持续运动。
WHEELS_Run函数:这个函数需要1毫秒调用一次,有两个功能,一个功能是检测电机运动时长是否达到目标时长;另一个功能是检测轮子的当前的速度,然后调整轮子的速度至目标速度。