提前说说:博主是用寄存器写的驱动。
历时两周,总算把小车弄好了,总体上来说做的太慢了。自己在32的学习中还不够仔细深入,只是浅面的学习,当真正做一个项目时,暴露的问题就太多了。这次在小车的制作的过程中,遇到了各种各样的问题,软件,硬件,各式各样的问题迎面而来,真的好几次心态崩了。不过还好小车这个项目不只是我一个人在搞,组里的其他成员也在一直在考虑问题,想办法,不断地解决解决,总归小车终于做好了,下面是小车完成图:
是有点灵魂接线(·
模块清单
stm32f103C8T6开发板
HC-SR04超声波测距模块X3
TB6612FNG 电机驱动模块X2
HC-05主从一体无线蓝牙模块X1
智能小车底盘 4WD小车循迹/避障小车 底盘X1
LM2596S DC-DC降压电源模块X1
电源模块3.3V 5V 12V多路输出 电压转换模块DC-DC 12V转3.3V 5V X1
12V电池X1
杜邦线 Xn
转串口模块X1
ST-linkX1
面包板X1
完成功能
超声波避障
蓝牙控制
走矩形
各个模块就不再介绍了,具体介绍大家可以自行百度或者看一下我的前几篇Arduino智能小车博客,里面有简单的介绍。
小车的所有详细代码和成品演示在我的资源中,大家可以下载提取(包括代码,引脚图,效果演示):
https://download.csdn.net/download/nidie508/11458242
那么,开始吧。
准备工作
1.首先配置好keil5 c8t6模板(温馨提示:多看看模板的核心驱动,包括sys.h delay.h usart.h等,这些核心文件一定要保证准确无误!)
2.了解开发板和确保开发板无误
3.熟悉怎么用转串口模块和st-link将驱动下载到开发板上。
下图示为c8t6开发板的引脚图
我们设计的思路如下,用三个超声波来避障。为什么用三个超声波呢?我们想的是如果用舵机的话,小车在行进过程中并不好判断,只能将车停下,舵机转动来检测哪个方向无障碍物,而用3个超声波不仅可以在行进中判断,也可以让小车没有停下的动作,显得整个过程比较流畅。这就是我们使用三个超声波的原因了。
我们使用的是定时器二的通道一,通道二,通道三来进行输入捕获的,那么,第一个问题就来了。
我们在写超声波代码时,用一个超声波先测试,发现超声波测试的并没有问题 ,串口显示的数据也并没有问题。但是,但是,在用三个超声波同时测试是,却发现数据显示的总有问题,输出的数据总是毫无规律,且数字都非常大,我们就在想是什么问题。
下面是三个超声波控制的代码:
//main.c#include "sys.h"#include "usart.h" #include "delay.h" #include "led.h" #include "dianji.h"#include "hcsr.h"u32 DIS_Init(u8 STA,u16 VAL){
u32 temp; u32 lenth; if((*STA)&0X80)//成功捕获到了一次高电平 {
temp=STA&0X3F; temp*=65536; //溢出时间总和 temp+=VAL; //得到总的高电平时间 lenth=temp*0.017; //计算长度 STA=0; //开启下一次捕获 } return lenth;}extern u8 TIM2CH2_CAPTURE_STA; //输入捕获状态extern u16 TIM2CH2_CAPTURE_VAL; //输入捕获值extern u8 TIM2CH3_CAPTURE_STA; //输入捕获状态extern u16 TIM2CH3_CAPTURE_VAL; //输入捕获值extern u8 TIM2CH4_CAPTURE_STA; //输入捕获状态extern u16 TIM2CH4_CAPTURE_VAL; //输入捕获值int main(void){ u32 temp=0; u32 length1; u32 length2; u32 length3; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化 //初始化与LED连接的硬件接口 TIM_PWM1_Init();//10000-1,36-1);//不分频。PWM频率=72M/(0.036M)=2Khz Echo1=0; Echo2=0; Echo3=0; HCSR04_Init(0XFFFF,72-1);//以1Mhz的频率计数 /*while(1) {
}*/ while(1) {
Echo3=1; delay_us(20); Echo3=0; length1=DIS_Init(&TIM2CH4_CAP