上周是真的惨,做了快一周的课程设计,智能循迹小车。这周又有期末考试,我是真的服了
终于 考完闲下来写个博客,总结总结,打算把硬件搭配到代码分开整理然后都写一下
目录
小车电机与L298N的问题
那个黄色的电机,即tt电机,那种黄色的,基础中的基础,垃圾中的垃圾。。。哈哈哈
两个铜片,接两根电机驱动线上(自己焊一下)。然后连接到L298N的输出A端或B端!!!
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) //100us@11.0592MHz定时器配置
{
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.电机响,就是不转,说明占空比太小咯
暂时想到就这些,慢慢写。