基与OpenWRT的智能侦察车
内容见附件,下面是ppt内容预览:
项目分析:
下位机作为上位机和小车控制的桥梁,需要进行有效地通讯,并对接收到的命令做出相应的动作控制命令接收:通过与上位机的串口相连,通过串口接收上位机的命令;
小车姿态控制:下位机通过IO操作控制小车的两个电机的正反转动从而控制车体的姿态位置;
车上数据获取:读取IO设备上的传感器数据并发送给上位机;
软硬件开发环境:
硬件选型:STM32F103RC核心板带下载模块
开发环境:Keil μVision5 IDE 及ARM.CMSIS.3.20.4.pack 接口标准Keil.STM32F1xx支持库
开发语言:C语言 基于STM32F1xx库函数开发
GPIO寄存器描述 《STM32参考手册中文-p75》
1、端口配置低寄存器(GPIOx_CRL)(x = A...E)
2、端口配置高寄存器(GPIOx_CRH)(x = A...E)
3、端口输入数据寄存器(GPIOx_IDR)(x = A...E)
这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。
4、端口输出数据寄存器(GPIOx_ODR)(x = A...E)
只能以字(16bit)的形式操作,复位值全是0。写0即输出0,写1即输出1。
5、端口位设置/清除寄存器(GPIOx_BSRR)(x = A...E)
高16bit写1用于清0,低16bit写1用于置位,同时写1的话低16bi有效。
6、端口位清除寄存器(GPIOx_BRR)(x = A...E)
低16位写1用于置位。
7、端口配置锁定寄存器(GPIOx_LCKR)(x = A...E)
GPIO八种模式
typedef enum
{ GPIO_Mode_AIN = 0x0, /* 模拟输入 */
GPIO_Mode_IN_FLOATING = 0x04, /* 浮空输入,复位后的状态 */
GPIO_Mode_IPD = 0x28, /* 下拉输入 */
GPIO_Mode_IPU = 0x48, /* 上拉输入 */
GPIO_Mode_Out_OD = 0x14, /* 开漏输出 */
GPIO_Mode_Out_PP = 0x10, /* 推挽输出 */
GPIO_Mode_AF_OD = 0x1C, /* 复用开漏输出 */
GPIO_Mode_AF_PP = 0x18 /* 复用推挽输出 */
}GPIOMode_TypeDef;
下位机开发重点:
串口移植与配置,串口中断配置,串口数据接收循环队列;
命令/数据传输完整性的判断,判断命令是否格式完整,未完整存储再读。
传输的数据格式检查,检查命令格式,长度;
开发总结:
实现了一个下位机基本功能,可以通过串口传来的命令数据准确地完成车体运动的控制;
需要考虑串口中断通讯带来的数据是否完整性的问题。
不足与展望:
对传来的命令数据校验纠错不足,以及错误后需要请求重传功能;
后期可采集更多车载传感器数据上传到上位机。
后期通过PWM调制进行小车更精准的控制。
单片机源程序如下:
- /**
- ******************************************************************************
- * @file main.c
- * @author fire
- * @version V1.0
- * @brief 测试led
- ******************************************************************************
- **/
- #include "usart3_config.h"
- #include "HumanBodySensor.h"
- #include "stm32f10x.h"
- #include "CarInit.h"
- #include "SmartCarControl.h"
- #include <stdlib.h>
- #include "led.h"
- void LED_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14); // turn off all led
- }
- void Delay(__IO u32 nCount) //简单的延时函数
- {
- for(; nCount != 0; nCount--);
- }
- /*
- * 函数名:main
- * 描述 :主函数
- * 输入 :无
- * 输出 :无
- */
- int main(void)
- {
- LED_GPIO_Config();
-
- LED2(ON);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
-
- /************CarInit.c******************************************************************/
- CarPherialInit(); //车体控制GPIO 人体传感器输入GPIO
- LED3(ON);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
- InterruptInit();
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- /************CarInit end***************************************************************/
-
-
- USARTx_Config(); //串口配置
-
-
- GPIO_ResetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_ResetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
- while(1)
- {
- int a=345;//cm
- char b[12]={0};
- SmartCarControl();
- Delay(0x0FFFEF);
- HumanBodySensor();
- sprintf(b,"%d",a);
- printf("%scm",b);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
孙昊.rar
(691.61 KB, 下载次数: 44)
|