day1:学习pwm调速控制直流电机调速转动
PWM:脉冲宽度调制技术
主要通过调节占空比(高电平时间占整个周期的时间)来调节速度,占空比越高,转速越快。
电机频率在 6-16kHZ 转换成周期大约在62.5us~167us(便于使用定时器控制占空比)存在计算公式可查资料
产生pwm基本思路:利用定时器产生脉冲,引入计数变量,当小于或者大于设定宽度时改变电平
void Timer0Routine() interrupt 1 //中断
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
Count++; //每100us打断一次,计数器加1
if(Count<Compare)
{
Motor=1;
}
else
{
Motor=0;
}
Count%=100;
}
宽度compar为50时
day2:学习驱动电机L298N,H桥电路
主要了解 接线
驱动电路主要是放大电流以便达到控制电机转动,如果直接与单片机相连电流太小不能使电机转动
正反转原理:需要通过H桥电路来实现
P型MOS管在栅极为低电平时导通,高电平时关闭。
N型MOS管在栅极为高电平时导通,低电平时关闭。
三极管导通为输入正向电压。
转向(假设为nmos):
当Q1,Q4给高电平,Q2,Q3给低电平时,电机正向转动
当Q2,Q3给高电平,Q1,Q4给低电平时,电机正向转动
重要 当要改变转向时,要控制死区,避免上下两个mos管直接导通,电流过大,烧坏mos管
例如:当电机从正转变为反转过程中,若二者的下降沿同时出现(同时为高电平),则上下直接导通,可以在逻辑中对上升沿以及下降沿添加的延时(死区)避免出现
刹车:可以两个上桥或者两个下桥同时导通,短路
调速:当转动时,可以给导通的上桥或者下桥一个pwm实现调速
对于l298n来说
IN1输入高电平,IN2输入低电平,对应电机A正转
IN1输入低电平,IN2输入高电平,对应电机A反转
停转对于IN1、IN2同时高电平或者低电平
调速对IN1或者IN2输入pwm(拔掉跳线帽) 电机B同理
day3: HC-05蓝牙模块及蓝牙app制作,并利用蓝牙串口通信实现控制直流电机
学习蓝牙模块的原因是因为方便调试代码是否有问题,便于修改
参考视频:https://www.bilibili.com/video/BV1Cy4y1h7ma?vd_source=100abe451980ff9dd4a5647d880af0c5
app制作网站:MIT App Inventor (gzjkw.net)
app制作完成后利用AT指令配置蓝牙(在xcom串口助手完成)
串口通信:
串口寄存器配置参考数据手册,也可以直接利用isp生成
因为发送(单纯发送可以不用中断)和接收同时用一个中断系统,所以在中断中要判断是发送还是接受产生的中断
参考视频:江科协UART串口通信
day4:利用L298N和HC05控制电机正反转以及调速
利用day2的学习成果,先进行正反转调节主函数如下:
#include <REGX52.H>
#include "timer0.h"
#include "hc05.h"
sbit IN3=P1^0;
sbit IN4=P1^1;
unsigned char Speed;
void main()
{
IN3=0;IN4=0;
Uart1_Init();
Timer0_Init();
while(1)
{
switch(Speed)
{
case 1: IN3=0;IN4=0;break; //停止
case 2: IN3=1;IN4=0;break; //正转
case 3: IN3=0;IN4=1;break; //反转
}
}
}
void Uart1_Isr(void) interrupt 4
{
if (TI==1) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
}
if (RI==1) //检测串口1接收中断
{
Speed=SBUF;
RI = 0; //清除串口1接收中断请求位
}
}
注意:单独的调节正反转不需要接ENA和ENB,当进行pwm调速时才接ENA和ENB
进行调速就对IN3或者IN4利用定时器进行pwm输入即可
day5 :编写函数装车
装车成果如下:
该版本小车简单,只用了蓝牙模块实现了遥控功能,故存在缺陷
后续将对小车的做如下改进 :1.增加电磁循迹模块 2.超声波测距模块 实现自动避障 3.pid控制差速转向