完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
上周是真的惨,做了快一周的课程设计,智能循迹小车。这周又有期末考试,我是真的服了
终于 考完闲下来写个博客,总结总结,打算把硬件搭配到代码分开整理然后都写一下 目录 小车电机与L298N的问题 PWM的实现 电机控制的代码部分 常见小问题 小车电机与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" ***it left_IN1_IN4 = P0^4;//左轮经过测试,IN1=IN4=0时,IN2=IN3=1则车前进 ***it left_IN2_IN3 = P0^5;//故定义两引脚设置电平让其始终保持前进,后退则反之。 ***it right_IN1_IN4 = P2^6;//右轮经过测试,IN1=IN4=0时,IN2=IN3=1则车前进 ***it 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.电机响,就是不转,说明占空比太小咯 |
|
|
|
只有小组成员才能发言,加入小组>>
2388 浏览 0 评论
8923 浏览 4 评论
36506 浏览 19 评论
4987 浏览 0 评论
24336 浏览 34 评论
1383浏览 2评论
1636浏览 1评论
2030浏览 1评论
1451浏览 0评论
396浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 23:19 , Processed in 1.234708 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号