管IRF740HC-05蓝牙模块,电容电阻若干USB-TTL

主要目标:(1)用51系列单片机作为控制器;(2)采用由四个MOS管组成的H桥电机驱动电路,并由IR2104S来驱动H桥;(3)可实现电机正、反转,启停

(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

附焊接图:

单片机

3名大二学生制作“萌芽康护”婴儿车获一等奖

2024-4-24 15:06:26

单片机

山东理工大学第五届“单片机应用设计大赛”赛事组织

2024-4-24 16:00:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索