(1)采用51系列单片机作为控制器;
(2)采用四只MOS管组成的H桥电机驱动电路,采用IR2104S驱动H桥;
(3)电机可实现正反转、启动和停止、加速和减速;
(4)可采用蓝牙和按钮进行效果切换,并增加LED灯(左右方向灯)和蜂鸣器报警电路(转弯时报警);
(5)使用5V直流稳压电源;
主要内容:
1、最小系统设计;
2、综合布局设计;
3.蓝牙控制C编程;
4.按键控制C编程;
5、方向灯和蜂鸣器C程序设计;
6、模拟并观察实验结果;
7、电路焊接及调试;
要实现所需的功能,首先需要规划硬件模块。 所需元件有STC89C52RC芯片、12MHZ晶振、直流单机、IR2104S、MOS管IRF740、HC-05蓝牙模块、一些电容电阻线、一些红黄LED、按钮。 几个,USB-TTL模块,晶体管8050和8550以及蜂鸣器和其他一些模块。
首先要实现最小系统的正常运行。 最小单片机系统由单片机、晶振电路、复位电路、电源模块组成。 下面给出硬件电路图。 实现了最小系统的运行之后,我们就要开始考虑如何实现电机的驱动和状态控制。 H桥由四个MOS管组成。 全桥驱动可实现电机正反转。 通过改变MOS开通时间,即通过给予PWM波的形式实现电机调速,可以采用IRF2104S来驱动H桥。 需要蓝牙。 按键切换可以决定编程时是否需要中断知识。 按下按钮打开中断,执行中断服务程序。 具体可以通过编写代码来实现,下面将详细介绍; 我在本设计中设计的功能:可以实现电机调速、蓝牙控制、LED方向灯显示、蜂鸣器转向报警、硬件焊接方面,需要注意的是P0处必须加上拉电阻端口,电解电容正负极不能接反。 焊接完成后,需要对电路进行测试。
硬件电路图:
1.IRS2104S驱动电路:
图1-H桥
图 1 基于由四个 IR740 组成的 H 桥,由两个 IR2104S 驱动。 下图2是IR2104S数据手册中的半桥驱动电路图(左桥和右半桥对称来分析左半桥(以分析左半桥为例),图3是IR2104S内部电路原理图:
①VCC为芯片电源输入。 说明书中给出的工作电压为10~20V。
② IN和#SD作为输入控制,共同控制电机的旋转状态(转向、速度、是否旋转)。
③VB和VS主要用来构成自举电路。
④ HO和LO连接MOS管的栅极,分别用于控制上臂和下臂MOS管的导通和截止。
COM 引脚可以直接接地。
图2-IR2104S半桥驱动器
图3-IR2104S内部电路原理图
PWM波通过IN口给出,高低电平由#SD给出。 VCC通过二极管与VB相连,为VB口提供12V电压。 VB通过电容连接到VS,VS连接到上下NMOS中间。 这部分是自举电路,因为NMOS需要VGS > VGSth才能导通。 ,由于NMOS导通后电阻很小,相当于一根导线,源极电压等于漏极电压。 需要保证VGS>VGSth,所以这里需要一个自举电路来提高栅极对地电压,并且自举电路还可以降低MOS管的导通电阻,从而减少热损耗。 还需要利用二极管的单向导电性,防止电流回流损坏电路。 下图4是我的全桥电路图:
因为PWM输出导致上下NMOS依次导通,(HO,LO)分别经历(0,0)、(1,0)、(0,1)三个过程,即自举电容器充电,自举电容器充电。 放电时,下半桥栅极放电和上半桥栅极放电(前级施加在其上的电压),我在HO和LO和NMOS之间并联一个二极管和限流电阻,以加速放电。 一个电容器连接到输入电压输出到地以进行滤波。 同时,PWM可以通过给出不同的占空比来调节电机速度。
2.HC-05蓝牙模块
HC-05蓝牙模块通过串口连接51,可实现人机交互。 我只使用蓝牙作为接收端,通过手机上的蓝牙调试器APP向51发送控制信息(两者之间的通信方式为串口通信,波形比特率设置为4800)。
APP内设置了五个按钮,分别是左、右、上、下、确定,分别用于左转、右转、加速、减速和停止。 当按键按下时,会通过串口发送对应的键值,并以十六进制显示 分别是 0x48、0x4A、0x47、0x4B、0x49、51。单片机的 SBUF 寄存器存储接收到的值,然后我处理接收到的信息。
3.独立按键模块
我在这块上设置了三个独立的按钮,分别连接到P0.0、P0.1和P0.2。 同时,这三个IO口均连接有上拉电阻,以保护引脚。 这三个按钮分别起到加速、减速、停止的功能。
实现了软件去抖动(延迟检测端口是否被按下,然后再检测是否被按下),以提高准确性。
程序如下:
main.c 文件:
#include "reg52.h"
#include "light.h"
#include "motor.h"
#include "blue.h"
#include "key.h"
extern uchar Turn_flag;
void main(void)
{
PWM_Init();
UART_Init();
while(1)
{
Key_Ctrl(Key_Scan());
LED_Display(Turn_flag);
}
}
蓝色.c 文件:
#include "reg52.h"
#include "blue.h"
#include "string.h"
#define UART_RX_STA = 0;
uchar UART_RX_BUF[UART_MAX_RECV_LEN];
uchar Turn_flag = 0;
extern uchar comp;
sbit L = P1 ^ 3;
sbit R = P1 ^ 4;
sbit LED_Stop = P1 ^ 0; //红色灯--刹车灯
sbit BEEP = P2^7; //蜂鸣器
//定时器1初始化
void UART_Init(void)
{
SCON = 0x50;
TMOD = 0x20;
PCON = 0x80;
TH1 = 0xF3; //设置波特率为4800
TL1 = 0xF3;
ES = 1;
EA = 1;
TR1 = 1;
L = 0;
R = 0;
LED_Stop = 0; //红色灯--刹车灯
BEEP = 1;
}
//串口发送数据
void UART_SendData(uchar *BUFF)
{
uchar i;
for(i = 0; i < strlen(BUFF) ; i++)
{
SBUF = *(BUFF + i);
while(!TI);
TI = 0;
}
}
//串口中断函数,蓝牙电机控制
void UART_ReceiveData() interrupt 4
{
ES = 0; //暂时关闭串口中断
RI = 0;
UART_RX_BUF[0] = SBUF; //把收到的信息从SBUF放到UART_RX_BUF[]中
switch(UART_RX_BUF[0])
{
case 0x47:
if(comp != 80) comp += 10;
else comp = 80;
break;
case 0x48:
L = 0;
R = 1;
Turn_flag = 1;
break;
case 0x49:
comp = 0;
Turn_flag = 0;
break;
case 0x4A:
L = 1;
R = 0;
Turn_flag = 2;
break;
case 0x4B:
if(comp != 0) comp -= 10;
else comp = 0;
Turn_flag = 3;
break;
default:
break;
}
ES = 1; //重新开启串口中断
SBUF = UART_RX_BUF[0];
while(!TI);
TI = 0;
}
蓝色.h 文件:
#ifndef _BLUE_H
#define _BLUE_H
#define UART_MAX_RECV_LEN 40
#define uchar unsigned char
#define uint unsigned int
void UART_Init(void);
void UART_SendData(uchar *BUFF);
#endif
电机.c 文件:
#include "reg52.h"
#include "motor.h"
#define uchar unsigned char
#define uint unsigned int
sbit PWM1 = P2 ^ 6; //PWM输出IO口
sbit PWM2 = P2 ^ 4;
uchar cont = 0; //定时器0中断计数值
uchar comp ; //定时器0的比较值
//定时器0初始化
void PWM_Init(void)
{
TMOD = 0x01;
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
EA = 1;
TR0 = 1;
ET0 = 1;
PWM1 = 0;
PWM2 = 0;
}
//定时器0中断函数, PWM占空比设置
void TIMER0_INT(void) interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256; //1us
cont++;
if(cont <= comp)
{
PWM1 = 1;
PWM2 = 1;
}
else if(cont <= 100) //10khz
{
PWM1 = 0;
PWM2 = 0;
}
else cont = 0;
}
电机.h 文件:
#ifndef _MOTOR_H
#define _MOTOR_H
void PWM_Init(void);
#endif
光.c文件:
#include "reg52.h"
#include "light.h"
sbit LED_Stop = P1 ^ 0; //红色灯--刹车灯
sbit LED_L = P1 ^ 1; //黄色灯--左边
sbit LED_R = P1 ^ 2; //黄色灯--右边
sbit BEEP = P2 ^ 7; //蜂鸣器
sbit Beep_ST = P1 ^ 5;
//i = 1 ,延时1us
void delay_ms(uint i)
{
while(i--);
}
void LED_Display(uchar Turn_flag)
{
if(Turn_flag == 0)
{
LED_Stop = 0;
Beep_ST = 0;
LED_L = 0;
LED_R = 0;
BEEP = 0;
}
else if(Turn_flag == 1)
{
LED_Stop = 0;
Beep_ST = 1;
LED_L = 1;
BEEP = 1;
delay_ms(5000);
LED_L = 0;
BEEP = 0;
delay_ms(5000);
}
else if(Turn_flag == 2)
{
LED_Stop = 0;
Beep_ST = 1;
LED_R = 1;
BEEP = 1;
delay_ms(5000);
LED_R = 0;
BEEP = 0;
delay_ms(5000);
}
else if(Turn_flag == 3)
{
LED_Stop = 1;
BEEP = 1;
}
}
光.h 文件:
#ifndef _LIGHT_H
#define _LIGHT_H
#define uchar unsigned char
#define uint unsigned int
void LED_Display(uchar );
void delay_ms(uint );
#endif
key.c 文件:
#include "key.h"
#include "reg52.h"
#include "motor.h"
sbit K1 = P0 ^ 0;
sbit K2 = P0 ^ 1;
sbit K3 = P0 ^ 2;
#define uchar unsigned char
#define uint unsigned int
extern uchar comp ;
extern uchar Turn_flag;
void delay(uint i)
{
while(i--);
}
u8 Key_Scan(void)
{
if(K1 == 0)
{
delay(500);
if(K1 == 0) return 1;
else return 0;
}
else if(K2 == 0)
{
delay(500);
if(K2 == 0) return 2;
else return 0;
}
else if(K3 == 0)
{
delay(500);
if(K3 == 0) return 3;
else return 0;
}
else return 0;
}
void Key_Ctrl(u8 i)
{
switch (i)
{
case 1:
if(comp != 80) comp += 10;
else comp = 80;
break;
case 2:
if(comp != 0) comp -= 10;
else comp = 0;
Turn_flag = 3;
break;
case 3:
comp = 0;
break;
default:
break;
}
}
key.h 文件:
#ifndef _KEY_H
#define _KEY_H
#define u8 unsigned char
#define u16 unsigned int
u8 Key_Scan(void);
void Key_Ctrl(u8 );
#endif
附焊接图: