`
一、摘要
1. “基于stm32f4的蓝牙控制小车”是一个基于意法半导体与ARM公司生产的STM32F4 DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制端模块(通俗讲:用手机控制)。
2. 蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。手机之间通过蓝牙实现数据共享成为常理,将手机变为遥控器为人们的生活带来无限方便。遥控小车在工业、国防、科研等领域应用越来越广泛,例如说:消防遥控小车、探测小车等。
二、引言
本文详细阐述了使用蓝牙通信的手机遥控小车前行、倒退、左转、右转和停止等功能的软硬件设计过程。
而我自己也是刚刚做完我们学校的校内赛,以下都是我自己的经验之谈。
在做蓝牙小车前期,感觉网上的资料大多不太详细。现在我总结了一下,不足之处请大家谅解。
三、系统方案
该系统分为电机驱动模块、电源管理模块、主控板、蓝牙通信模块、Android控制端(手机下载串口通讯即可)等5个模块。(我用的是学长们给的stm32模块,大家也可以用网上的模块,都是大同小异的)
四、配件分类
开发板:stm32c8t6;电机驱动:l298n;蓝牙模块:HC-05主从机一体蓝牙模块(两个);电机(小黄电机,铁电机等);电池、降压模块(LM2596S DC-DC 降压电源模块 )等。附上我们小车的粗糙图:
五、前期工作
1. 蓝牙的配置。
2. 了解stn32c8t6的各个IO口。
3. 了解stn32的tiM(1~4),知道各个IO口对应的通道。
4. 了解L298驱动模块。
5. 以上我就不一一介绍,下面有文件大家看一下。
六、系统软件设计
1. 首先进行bsp.c的配置
2. 我使用的是A0~3(TIM2)和B6~9(TIM4)的引脚。
3. TIM2的配置(TIM4查表差不多,只要把TIM2的改为TIM4即可,原理请看stm32参考手册。)
- void TIM2_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period = (100- 1); //arr 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler = (7200-1); //分频 psc
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割,一般写0
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置为向上计数模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
- /* PWM1 Mode configuration: Channel1*/
- TIM_OCInitStructure.TIM_Pulse = 0; // 初始值
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //pwm模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能通道
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平
-
- TIM_OC1Init(TIM2, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能或者失能TIMx在CCR3上的预装载寄存器
- TIM_OC2Init(TIM2, &TIM_OCInitStructure);
- TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
- TIM_OC3Init(TIM2, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能或者失能TIMx在CCR3上的预装载寄存器
- TIM_OC4Init(TIM2, &TIM_OCInitStructure);
- TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
-
- TIM_ARRPreloadConfig(TIM2, ENABLE); /* 中断使能 */
- /* TIM3 enable counter */
- TIM_Cmd(TIM2, ENABLE); /* 使能 */
- }
复制代码
4.初始化串口1(蓝牙数据传输用A9、A10)
- void USART1_Configuration(void)
- {
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Configure USART1 Rx (PA.10) as input floating */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /* Configure USART1 Tx (PA.09) as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = 38400; //速率115200bps
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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; //收发模式
- /* Configure USART1 */
- USART_Init(USART1, &USART_InitStructure); //配置串口参数函数
- /* Enable USART1 Receive and Transmit interrupts */
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
- /* Enable the USART1 */
- USART_Cmd(USART1, ENABLE); //使能串口
- }
复制代码
5.蓝牙指令程序(在stm32f10x_it.c)
6.主函数(里面的数据是我们小车,大家可以自己更改)
- int x=0;
- int main(void)
- {
- BSP_Init();
- while(1)
- {
- if(x == 1)
- {
- TIM2->CCR1 = 0;
- TIM2->CCR2 = 99;
- TIM2->CCR3= 0;
- TIM2->CCR4 = 99;
- TIM4->CCR1 = 0;
- TIM4->CCR2 = 99;
- TIM4->CCR3= 0;
- TIM4->CCR4 = 99;
- }
- if(x == 2)
- {
- TIM2->CCR1 = 0;
- TIM2->CCR2 = 0;
- TIM2->CCR3 = 0;
- TIM2->CCR4 = 0;
- TIM4->CCR1 = 0;
- TIM4->CCR2 = 0;
- TIM4->CCR3 = 0;
- TIM4->CCR4 = 0;
- }
- if(x == 3)
- {
- TIM2->CCR1 = 99;
- TIM2->CCR2 = 0;
- TIM2->CCR3 = 99;
- TIM2->CCR4 = 0;
- TIM4->CCR1 = 99;
- TIM4->CCR2 = 0;
- TIM4->CCR3 = 99;
- TIM4->CCR4 = 0;
- }
- if(x == 4)
- {
- TIM2->CCR1 = 0;
- TIM2->CCR2 = 99;
- TIM2->CCR3 = 99;
- TIM2->CCR4 = 0;
- TIM4->CCR1 =0;
- TIM4->CCR2 =99;
- TIM4->CCR3 = 99;
- TIM4->CCR4 = 0;
- }
- if(x == 5)
- {
- TIM2->CCR1 = 99;
- TIM2->CCR2 = 0;
- TIM2->CCR3 = 0;
- TIM2->CCR4 = 99;
- TIM4->CCR1 = 99;
- TIM4->CCR2 = 0;
- TIM4->CCR3 = 0;
- TIM4->CCR4 = 99;
- }
- while_1(); // 主要的执行程序
- }
- }
- /*********************************************************
- printf重定义
- **********************************************************/
- int fputc(int ch,FILE *f)
- {
- USART_SendData(USART1,(u8)ch);
- while (USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
- return ch;
- }
复制代码
7.最后是提醒一下:
主要执行函数,执行空语句就好了。(在device.c里)
https://bbs.elecfans.com/forum.php?mod=attachment&aid=Njc4ODUyfGQzMTQzNWRlM2RjMGU3NTRiNWE1MGZhNmJmNDE4ODRlfDE3MzQ4NzA5ODg%3D&request=yes&_f=.rarattach://678852.rar
以上就是我做小车比赛的总结,希望对大家有所帮助。我通过这一次小车比赛,也是初步的认识了stm32,希望大家也能通过蓝牙小车程序的配置,了解stm32.
`
|