基于STC89C52的四轮小车电机控制函数

51单片机是大多数同学入门单片机的首选,在现今的高校也是十分地普及,而智能小车也是一个很有意思的东西。

废话不多说,直接上代码:

.C文件部分



/*********************************************\
*                   _ooOoo_                   *
*                  o8888888o                  *
*                  88" . "88                  *
*                  (| -_- |)                  *
*                  O\  =  /O                  *
*               ____/`---'\____               *
*             .'  \\|     |//  `.             *
*            /  \\|||  :  |||//  \            *
*           /  _||||| -:- |||||-  \           *
*           |   | \\\  -  /// |   |           *
*           | \_|  ''\---/''  |   |           *
*           \  .-\__  `-`  ___/-. /           *
*         ___`. .'  /--.--\  `. . __          *
*      ."" '<  `.___\_<|>_/___.'  >'"".       *
*     | | :  `- \`.;`\ _ /`;.`/ - ` : | |     *
*     \  \ `-.   \_ __\ /__ _/   .-` /  /     *
*======`-.____`-.___\_____/___.-`____.-'======*
*                   `=---='                   *
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*
*                No bug forever               *
\*********************************************/

/*
 *  Author:yyx
 *  function:基于寻迹壁障小车的电机驱动
 *          
 *  Created on: 2018年5月2日
 *注意:本程序是基于一片LN298驱动的,所以只能实现右(左)侧的两个电机同时向前或者向后, 并且能够控制其速度。
 */
#include "motor.h"


static volatile unsigned int SetFrequenceLevel = 0;  
static volatile unsigned char RightDuty=0;   //右边波形的占空比,速度大小(1-10)
static volatile bit RightDirect=0; //右侧方向控制位,1前进,0后退
static volatile unsigned char LeftDuty=0;    //左边波形的占空比,速度大小(1-10)
static volatile bit LeftDirect=0; //右侧方向控制位,1前进,0后退
/*
*定时器0和1初始化函数
*SetF:控制电机的PWM波的频率(10000-20000)
*/
void Both_Timer_Init(unsigned int SetF)
{
SetFrequenceLevel = 1000000/(SetF*10); //获取定时间隔
//配置T0和T1对应的TMOD,设置工作方式
TMOD = 0x11; //GATE=0,软件使能;定时模式;方式1,16位定时器
//配置初值
TH0 = TH1 = (65536-SetFrequenceLevel)/256;
TL0 = TL1 = (65536-SetFrequenceLevel)%256;
//开启中断
ET0 = 1;  //开启T0中断
ET1 = 1;
EA = 1;

}
/*
*功能:右侧两个电机控制函数
*参数:
     enable:使能位,1时使能两个电机;0时关闭电机
direct:方向控制。1为前进,0为后退
speed:速度控制位,取值为1-10;速度逐渐增大
*/
void Control_Right_Motor(bit enable,bit direct,unsigned char speed)
{
if(enable)
{
TR0 = 1;//使能TR位,使能T0定时器
RightDirect = direct;
if(direct)//如果前进
{
MR1 = 1;
MR2 = 0;
}else//如果后退
{
MR1 = 0;
MR2 = 1;
}
RightDuty = speed; //控制相应的速度
}else
{
MR1=MR2=0;
   TR0 = 0;//关闭T0定时器
}
}
//右侧方波产生中断,Timer0
void Timer0_Right() interrupt 1
{
static unsigned TimeCounter = 0;
//重装初值
TH0 = (65536-SetFrequenceLevel)/256;
TL0 = (65536-SetFrequenceLevel)%256;

TimeCounter++;

if(TimeCounter==RightDuty)
{
if(RightDirect)MR1=0;else MR2=0;
}
if(TimeCounter == 10)
{
TimeCounter = 0;
if(RightDirect)MR1=1;else MR2=1;
}
}




/*
*功能:左侧两个电机控制函数
*参数:
     enable:使能位,1时使能两个电机;0时关闭电机
direct:方向控制。1为前进,0为后退
speed:速度控制位,取值为1-10;速度逐渐增大
*/
void Control_Left_Motor(bit enable,bit direct,unsigned char speed)
{
if(enable)
{
TR1 = 1;//使能TR位,使能T1定时器
LeftDirect = direct;
if(direct)//如果前进
{
ML1 = 1;
ML2 = 0;
}else//如果后退
{
ML1 = 0;
ML2 = 1;
}
LeftDuty = speed; //控制相应的速度
}else
{
ML1=ML2=0;
   TR1 = 0;//关闭T1定时器
}
}
//左侧方波产生中断,Timer1_Left
void Timer1_Left() interrupt 3
{
static unsigned TimeCounter1 = 0;
//重装初值
TH1 = (65536-SetFrequenceLevel)/256;
TL1 = (65536-SetFrequenceLevel)%256;

TimeCounter1++;

if(TimeCounter1==LeftDuty)
{
if(LeftDirect)ML1=0;else ML2=0;
}
if(TimeCounter1 == 10)
{
TimeCounter1 = 0;
if(LeftDirect)ML1=1;else ML2=1;
}

}

头文件部分:

#ifndef __motor_h
#define __motor_h


#include <reg52.h>


sbit MR1 = P0^0;
sbit MR2 = P0^1;  //右侧两个电机控制管脚
sbit ML1 = P0^2;  //左侧两个电机控制管脚
sbit ML2 = P0^3;


void Both_Timer_Init(unsigned int SetF);
void Control_Right_Motor(bit enable,bit direct,unsigned char speed);
void Control_Left_Motor(bit enable,bit direct,unsigned char speed);

 

#endif 

第一次发博客,开心ヾ(๑╹◡╹)ノ"(`・ω・´)٩(๑❛ᴗ❛๑)۶

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
四轮小车电机差速PID代码是用来控制四个电机的速度,从而控制小车的运动轨迹。具体来说,PID算法是一种经典的控制算法,它能够通过对当前误差、误差变化率和误差积分值进行综合计算,输出一个控制量来调整系统状态,从而实现对系统的控制。 在四轮小车中,电机的转速与小车运动轨迹息息相关。差速PID算法主要是通过对四个电机的转速进行控制,来实现小车的转向、前进后退等运动。 一般而言,四轮小车电机差速PID代码需要包含以下几个部分: 1. 读取传感器数据:通过读取传感器数据来获取小车当前的姿态、角度、速度等信息。 2. 计算误差:将读取到的传感器数据与目标值进行比较,计算出当前的误差。 3. PID计算:根据当前误差、误差变化率以及误差积分值,利用PID算法计算出输出量。 4. 电机控制:将PID计算出的输出量转换成电机控制信号,通过电机驱动器控制电机的转速,从而实现小车的运动控制。 以下是一个简单的四轮小车电机差速PID代码示例: ``` // 读取传感器数据 double sensor_data = get_sensor_data(); // 计算误差 double error = target_value - sensor_data; // 计算误差变化率 double delta_error = error - previous_error; // 计算误差积分值 error_integral += error; // PID计算 double pid_output = kp * error + ki * error_integral + kd * delta_error; // 电机控制 set_motor_speeds(pid_output, -pid_output, pid_output, -pid_output); // 更新上一次误差值 previous_error = error; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值