电子系统综合实践------智能循迹小车(一)硬件电机控制部分(基于STC15F2K60S2)

上周是真的惨,做了快一周的课程设计,智能循迹小车。这周又有期末考试,我是真的服了

终于 考完闲下来写个博客,总结总结,打算把硬件搭配到代码分开整理然后都写一下

目录

小车电机与L298N的问题

PWM的实现

电机控制的代码部分

常见小问题


小车电机与L298N的问题

那个黄色的电机,即tt电机,那种黄色的,基础中的基础,垃圾中的垃圾。。。哈哈哈

两个铜片,接两根电机驱动线上(自己焊一下)。然后连接到L298N的输出A端或B端!!!电子系统综合实践------智能循迹小车(一)硬件电机控制部分(基于STC15F2K60S2)_第1张图片

12V是电池供的电,7V左右也差不多,

输出的5V也还OK,没错,那个5V供电口是输出的5V,所以可以不用另备降压模块。

通道A使能的是输出A的两根线,通道B使能的是输出B的两根线。中间逻辑输入,分别是IN1 IN2 IN3 IN4,左边两个控制A 右边两个给B,11 00均是不转,01 10哪个正传哪个反转得试一下,即按照自己车轮方向,然后给个10 或01,看看轮子怎么转,四个轮子均记录下来即可。ENA ENB是给PWM占空比的

PWM的实现

额,STC15F2K60S2的PWM实现,可以用硬件PCA产生,也可以用定时器模拟,大差不差。显然硬件产生PWM更好,虽然限制了IO口,但是可以不依赖定时器中断。我采用的是定时器中断,因为方便

这里是100us中断,然后中断里累加100次,即10ms为周期,然后zkb1 zkb2分别为左轮右轮的PWM占空比

void Time0Init(void)		//[email protected]定时器配置
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xAE;		//设置定时初值
	TH0 = 0xFB;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}
void timer0init()//定时计数器0中断初始化函数
{
	Time0Init();
	ET0 = 1;
	EA = 1;
}

中断部分

很普通的产生PWM方法

void timer0() interrupt 1   //定时计数器0中断函数,控制PWM输出
{
    if(tt < 10000)
		tt++;//设置一个tt累加变量,第一个1s让轮子满转,克服静态摩擦力,让车轮转起来
	if(tt >= 10000)//有的车需要,大多不需要
		start_flag = 1;
	if(start_flag == 1)
	{
		if(T < zkb1)
			PWM1 = 1;
	    else 
			PWM1 = 0;
		if(T < zkb2)
			PWM2 = 1;
		else 
			PWM2 = 0;
		T++;
		if(T >= 100)
		{
			T = 0;
		}

	}
}

电机控制的代码部分

将电机控制模块与循迹模块,循迹判断模块进行分开,便于功能添加代码维护

move.h头文件内容如下

#ifndef _MOVE_H
#define _MOVE_H

#include "system.h"

sbit left_IN1_IN4 = P0^4;//左轮经过测试,IN1=IN4=0时,IN2=IN3=1则车前进
sbit left_IN2_IN3 = P0^5;//故定义两引脚设置电平让其始终保持前进,后退则反之。
sbit right_IN1_IN4 = P2^6;//右轮经过测试,IN1=IN4=0时,IN2=IN3=1则车前进
sbit right_IN2_IN3 = P2^7;//故定义两引脚设置电平让其始终保持前进,后退则反之。

extern u8 zkb1;  //占空比控制变量
extern u8 zkb2;
void left_stop();//左轮停止从IN来控制
void right_stop();//右轮停止从IN来控制
void left_go();//左轮前进
void left_return();//左轮后退
void right_go();//左轮前进
void right_return();//左轮后退
void left_turn1();//左转函数(常用微调、钝角)
void left_turn2();//左转锐角函数
void right_turn1();//右转函数1
void right_turn2();//右转直角函数
void qianjin();//前进函数
void stop();//停车函数
#endif

move.c文件内容

#include "move.h"
void left_stop()//左轮停止从IN来控制
{
	left_IN1_IN4 = 0;
	left_IN2_IN3 = 0;
}
void right_stop()//右轮停止从IN来控制
{
	right_IN1_IN4 = 0;
	right_IN2_IN3 = 0;
}
void left_go()//左轮前进
{
	left_IN1_IN4 = 0;
	left_IN2_IN3 = 1;
}
void left_return()//左轮后退
{
	left_IN1_IN4 = 1;
	left_IN2_IN3 = 0;
}
void right_go()//右轮前进
{
	right_IN1_IN4 = 0;
	right_IN2_IN3 = 1;
}
void right_return()//右轮后退
{
	right_IN1_IN4 = 1;
	right_IN2_IN3 = 0;
}
void left_turn1()//左转函数(常用微调、钝角)
{
	left_stop();//左轮不转
	right_go();//右轮正转,所以左转
	zkb1 = 0;
	zkb2 = 90; 
}
 
void left_turn2()//左转锐角函数
{
    left_return();
	right_go();
	zkb1 = 100;//左轮反转
	zkb2 = 100; //右轮正转
}
 
void right_turn1()//右转函数(常用微调、钝角)
{
	left_go();
	right_stop();
	zkb1 = 90;//占空比输出均为90%
	zkb2 = 0;//占空比0,这样右轮不动,左轮正转,小车右转
}
 
void right_turn2()//右转直角函数
{
	left_go();//左轮正转
	right_return();//右轮反转
	zkb1 = 50;//占空比输出均为50%
	zkb2 = 50;
}
 
void qianjin()//前进函数
{
	left_go();
	right_go();
	zkb1 = 21;   //占空比输出均为21%
	zkb2 = 21;
}

void stop()//停车函数
{
	left_stop();
	right_stop();
	zkb1=0;
	zkb2=0;
}

注释基本已经很清楚了,由于我们的赛道是布纸那种,阻力实测有点大,所以我的占空比给的比较大,大家应自己根据自个的车进行选择合适占空比

常见小问题

1.如果小车走的很抖动,是因为PWM频率太小而导致的

2.四轮车,左边两轮速度一般是要一样的,右轮也是,转弯时通过两边轮速的不同而实现转弯的

3.如果占空比给小了不转,给大一点就猛转,应该适当降低电池电压

4.小车一会儿动一会儿不动,爱动不动,碰一下动一下,说明没电了。还有轮子转不动了,都是没啥电了

5.电机响,就是不转,说明占空比太小咯

 

暂时想到就这些,慢慢写。

你可能感兴趣的:(循迹小车)