【平衡小车】学习日志(七)

  • 任务:编写蓝牙控制小车底层代码——USART、NVIC && 完善Motor部分代码

USART串口蓝牙控制

  • USART蓝牙串口引脚——PB10、11
1、完成驱动文件导入操作和编写驱动程序基本代码(参考之前文章)
//将【USART3】配置文件放在【Hardware】文件夹里
2、在 USART3.c编写串口初始化函数 Usart3_Init
/***************************************
USART3(TX)——PB10
USART3(RX)——PB11
***************************************/
//USART3初始化
void Usart3_Init(u32 bound)
{
    //RCC开启USART和GPIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    //GPIO初始化,把TX配置成复用输出,RX配置成输入
    GPIO_InitTypeDef GPIO_InitStructure;
    //USART3_TX   PB10    复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    //USART3_RX      PB11    浮空输入(上拉输入)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStructure);  
    
    
    //USAR3初始化设置
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = bound;//波特率(一般设置为9600)
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//选择是否硬件流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//选择【发送/接收】模式
    USART_Init(USART3, &USART_InitStructure);
    
    
    //开启中断
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    
    
    //使能串口
    USART_Cmd(USART3, ENABLE);                    
}
//串口3中断服务函数
void USART3_IRQHandler(void)
{
    int Bluetooth_Receive;
    
    //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    //RXNE为接收数据寄存器【非空】标志位
    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET) //若RXNE置1说明接收到数据
    {
        //读取接收到的数据并保存到变量中(十进制)
        Bluetooth_Receive = USART_ReceiveData(USART3);
        
        //执行控制命令
        BluetoothCMD(Bluetooth_Receive);
    }
}

蓝牙控制函数

//蓝牙控制命令
u8 Fore,Back,Left,Right;
void BluetoothCMD(int Bluetooth_Receive)
{
    switch(Bluetooth_Receive)
        {
            case 90://停止 Z
                Fore=0,Back=0,Left=0,Right=0;
                break;
            case 65://前进 A
                Fore=1,Back=0,Left=0,Right=0;
                break;
            case 72://左前 H
                Fore=1,Back=0,Left=1,Right=0;
                break;
            case 66://右前 B
                Fore=1,Back=0,Left=0,Right=1;
                break;
            case 71://左转 G
                Fore=0,Back=0,Left=1,Right=0;
                break;
            case 67://右转 C
                Fore=0,Back=0,Left=0,Right=1;
                break;
            case 69://后退 E
                Fore=0,Back=1,Left=0,Right=0;
                break;
            case 70://左后,向右旋 F
                Fore=0,Back=1,Left=0,Right=1;
                break;
            case 68://右后,向左旋 D
                Fore=0,Back=1,Left=1,Right=0;
                break;
            default://停止 Z
                Fore=0,Back=0,Left=0,Right=0;
                break;
        }
}

串口发送函数(字节、数组、字符串)——可在主程序中直接配置蓝牙

void Usart3_SendByte(char byte)   //串口发送一个字节
{
        USART_SendData(USART3, byte);        //通过库函数  发送数据
        while( USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);  
        //等待发送完成。   检测 USART_FLAG_TC 是否置1;    //见库函数 P359 介绍
}
void Usart3_SendBuf(char *buf, u16 len)
{
    u16 i;
    for(i=0; i<len; i++)Usart3_SendByte(*buf++);
}
void Usart3_SendStr(char *str)
{
    u16 i,len;
    len = strlen(str);
    for(i=0; i<len; i++)Usart3_SendByte(*str++);
}
3、在 sys.c中增加外部中断优先级配置函数 NVIC_Configuration
//Usart3 NVI 中断优先级配置(蓝牙串口)
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02 ;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;        //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
4、在USART3.h中声明串口初始化函数 Usart3_Init、蓝牙控 制函数BluetoothCMD、串口发送函数
void MPU6050_EXTI_Init(void);
5、在sys.h中 #includ e "USART3 .h"
#include "USART3.h"

Motor

1、在Motor.c新增异常关闭电机函数Turn_Off

/**************************************************************************
函数功能:异常关闭电机
入口参数:倾角和电压
返回  值:无
**************************************************************************/
void Turn_Off(float angle)
{
        if(angle<-40||angle>40)        //===倾角大于40度关闭电机                
        {                                                                                                    
                Motor1=0;
                Motor2=0;
        }        
}
2、在 Motor.h中声明异常关闭电机函数 Turn_Off
void Turn_Off(float angle);

蓝牙数据通过USART3收发,并用数据收发去触发外部中断以达到【蓝牙控制小车运动】的电机要求,为之后在PID外部中断服务函数中完成具体控制铺好了路
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值