基于stm32的多功能小车_第1页
基于stm32的多功能小车_第2页
基于stm32的多功能小车_第3页
基于stm32的多功能小车_第4页
基于stm32的多功能小车_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于stm32的多功能小车 摘 要 STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。本次多功能小车采用stm32f103为主控芯片,用多个模块组合的形式组合来实现功能,本次设计的主要目的是学如何使用stm32,例如IO输入输出模式,时钟的配置,定时器的使用,串口,adc,spi,等等,小车实现了循迹功能,蓝牙,红外遥控,以及无线摇杆控制。关键词:stm32,蓝牙,无线摇杆,循迹,目录一设计任务与要求.1二单元电路设计.2 1循迹模块3 2驱动模块3 3稳压模块4 4蓝牙模块4 5红外接收模块5 6摇杆摇控器原理图6三测试结果8四各模块程序.

2、8五收获与心得.34一设计任务与要求 1寻迹功能(可以稳定的寻单黑线运行,不冲出赛道) 2 红外遥控功能(用一个红外遥控器可以控制小车,并且支持遥控器连续按下来控制小车左右转,前进,后退) 3蓝牙遥控功能(通过一个蓝牙模块充当从机,手机蓝牙充当主机,) 4基于NRF2401的遥控控制功能 二单元电路设计1循迹模块 光电循线由红外对管组成,通过检测接收到的反射光强判断黑白线从而,达到循迹的功能.本次采用的4路循迹.2驱动模块 电机驱动采用L298N,一片L298N可以驱动两个电机,内部包含4通道逻辑驱动电路,L298N的逻辑驱动L298N的逻辑功能:循迹模块电路图3稳压模块 该模块可以提供+5v

3、,+7.8的电压.4蓝牙模块 5红外接收5摇杆遥控器原理三测试结果1实现了红外遥控的选择模式功能:1键:红外遥控功能,前进,后退,左转,右转功能良好,并且支持遥控连续按2键:循迹模式,能够循迹简单的赛道,速度可调,但弯度太大时,循迹效果不好,速度需要多次调试。3键:蓝牙模式,能通过手机控制小车的动作,控制距离比蓝牙远,并且无死角,蓝牙控制稳定。4无线遥控模式,通过自制的遥控,控制小车,左摇杆控制小车方向,右摇杆控制小车速度,方向控制效果比较好,但是由于电机限制,控制速度的效果不是非常明显,但基本上实现的速度的控制。四各模块的程序1红外遥控if(text_falg=1) LED0=!LED0;k

4、ey=Remote_Scan(); switch(key)case 0: /str=ERROR; break; case 162: EN1=0; EN2=0; break; /power case 168: EN1=1; / EN2=1; PB7=0; PB8=0; TIM2-CCR3=800; TIM2-CCR4=800; delay_ms(50); EN1=0; EN2=0; break; case 98: EN1=1;/ EN2=1; PB7=1; PB8=1; TIM2-CCR3=100; TIM2-CCR4=100; delay_ms(50); EN1=0; EN2=0; break

5、; case 194: EN1=1; /zou EN2=0; PB7=1; PB8=1; TIM2-CCR3=100; delay_ms(50); EN1=0; break; /str=UP;case 34: EN1=0; /you EN2=1; PB7=1; PB8=1; TIM2-CCR4=100; delay_ms(50); EN2=0;break; 2红外接收#include remote.h#include delay.h#include usart.h/红外遥控初始化/设置IO以及定时器4的输入捕获void Remote_Init(void) GPIO_InitTypeDef GP

6、IO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /使能PORTB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);/TIM5 时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_P

7、in_1; /PA1 输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; /上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_1);/初始化GPIOA1 TIM_TimeBaseStructure.TIM_Period = 10000; /设定计数器自动重装值 最大10ms溢出 TIM_TimeBaseStructure.TIM_Prescaler =(72

8、-1); /预分频器,1M的计数频率,1us加1. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); /根据指定的参数初始化TIMx TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; / 选择输入端 IC2映射

9、到TI5上 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;/上升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /配置输入分频,不分频 TIM_ICInitStructure.TIM_ICFilter = 0x03;/IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波 TIM_ICInit(TIM5, &TIM_ICIni

10、tStructure);/初始化定时器输入捕获通道 TIM_Cmd(TIM5,ENABLE ); /使能定时器5 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; /TIM5中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ通道被使能NVIC_In

11、it(&NVIC_InitStructure); /根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC2,ENABLE);/允许更新中断 ,允许CC2IE捕获中断 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); /使能PB,PE端口时钟/ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitStructure.

12、GPIO_Pin = GPIO_Pin_8;/LED0-PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); /根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_0); /PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /LE

13、D1-PE.5 端口配置, 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOB,GPIO_Pin_5); /PE.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /LED1-PE.5 端口配置, 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOB,GPIO_Pin_6); /PE.5 输出高 GPIO_InitStructur

14、e.GPIO_Pin = GPIO_Pin_7; /LED1-PE.5 端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHzGPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /LED1-PE.5 端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHzGPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_InitStru

15、cture.GPIO_Pin = GPIO_Pin_9;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GP

16、IO_InitStructure.GPIO_Pin = GPIO_Pin_11;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz/GPIO_SetBits(GPIOA,GPIO_Pin_7); /PB.5 输出高GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

17、/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0 /遥控器接收状态/7:收到了引导码标志/6:得到了一个按键的所有信息/5:保留/4:标记上升沿是否已经被捕获 /3:0:溢出计时器u8 RmtSta=0; u16 Dval;/下降沿时计数器的值u32 RmtRec=0;/红外接收到的数据 u8 RmtCnt=0;/按键按下的次数 /定时器5中断服务程序 void TIM5_IRQHandler(void) if(TI

18、M_GetITStatus(TIM5,TIM_IT_Update)!=RESET)if(RmtSta&0x80)/上次有数据被接收到了RmtSta&=0X10;/取消上升沿已经被捕获标记if(RmtSta&0X0F)=0X00)RmtSta|=16;/标记已经完成一次按键的键值信息采集if(RmtSta&0X0F)14)RmtSta+;elseRmtSta&=(1300&Dval800)/560为标准值,560usRmtRec1400&Dval1800)/1680为标准值,1680usRmtRec2200&Dval4200&Dval4700)/4500为标准值4.5msRmtSta|=17;/

19、标记成功接收到了引导码RmtCnt=0;/清除按键次数计数器 RmtSta&=(14); TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2); /处理红外键盘/返回值:/ 0,没有任何按键按下/其他,按下的按键键值.u8 Remote_Scan(void) u8 sta=0; u8 t1,t2; if(RmtSta&(124;/得到地址码 t2=(RmtRec16)&0xff;/得到地址反码 if(t1=(u8)t2)&t1=REMOTE_ID)/检验遥控识别码(ID)及地址 t1=RmtRec8; t2=RmtRec; if(t1=(u8)t2)sta=

20、t1;/键值正确 if(sta=0)|(RmtSta&0X80)=0)/按键数据错误/遥控已经没有按下了 RmtSta&=(1CCR3=300; delay_us(100); / TIM2-CCR4=200; if( b=0&c!=0&(a!=0|b!=0) ) EN1=1;/前进 EN2=1; PB7=1; PB8=1; TIM2-CCR3=450; TIM2-CCR4=350; delay_us(100); if( c=0&d!=0&(a!=0|b!=0) ) EN1=1;/前进 EN2=1; PB7=1; PB8=1; TIM2-CCR3=350; TIM2-CCR4=450; dela

21、y_us(100); if(d=0&c!=0&(a!=0|b!=0) EN1=0;/前进 EN2=1; PB7=1; PB8=1; TIM2-CCR3=250; TIM2-CCR4=350;delay_us(100); if(a!=0&b!=0&c!=0&d!=0) EN1=1;/前进 EN2=1; PB7=1; PB8=1; TIM2-CCR3=350; TIM2-CCR4=350; delay_us(100); 4蓝牙串口判断if( text_falg=3) LED0=0; /if(USART_RX_STA&0x8000)=0)/ LED1=0; switch(USART_RX_BUF0)

22、 case A:LED0=1; EN1=1; EN2=1; PB7=1; PB8=1; TIM2-CCR3=100; TIM2-CCR4=100; break; case B: EN1=1; /you EN2=1; PB7=1; PB8=1; TIM2-CCR3=100; TIM2-CCR4=400; break; case C: EN1=1; /zou EN2=1; PB7=1; PB8=1; TIM2-CCR3=400; TIM2-CCR4=100; break; case D: EN1=1; /后退 EN2=1; PB7=0; PB8=0; TIM2-CCR3=800; TIM2-CCR

23、4=800; break; case S: EN1=0; EN2=0; break; USART_RX_STA=0;/ 5蓝牙串口初始化#include sys.h#include usart.h /如果使用ucos,则包括下面的头文件即可.#if SYSTEM_SUPPORT_UCOS#include includes.h/ucos 使用 #endif#if 1#pragma import(_use_no_semihosting) /标准库需要的支持函数 struct _FILE int handle; ; FILE _stdout; /定义_sys_exit()以避免使用半主机模式 _sy

24、s_exit(int x) x = x; /重定义fputc函数 int fputc(int ch, FILE *f) while(USART1-SR&0X40)=0);/循环发送,直到发送完毕 USART1-DR = (u8) ch; return ch;#endif /*使用microLib的方法*/ /* int fputc(int ch, FILE *f)USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) = RESET) return ch;int GetKey

25、(void) while (!(USART1-SR & USART_FLAG_RXNE); return (int)(USART1-DR & 0x1FF);*/ /串口1中断服务程序/注意,读取USARTx-SR能避免莫名其妙的错误 u8 USART_RX_BUFUSART_REC_LEN; /接收缓冲,最大USART_REC_LEN个字节./接收状态/bit15,接收完成标志/bit14,接收到0x0d/bit130,接收到的有效字节数目u16 USART_RX_STA=0; /接收状态标记 /初始化IO 串口1 /bound:波特率void uart_init(u32 bound) /GP

26、IO端口设置 GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);/使能USART1,GPIOA时钟 USART_DeInit(USART1); /复位串口1 /USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /P

27、A.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化PA9 /USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入 GPIO_Init(GPIOA, &GPIO_In

28、itStructure); /初始化PA10 /Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;/抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;/子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/IRQ通道使能NVIC_Init(&NVIC_InitStructure);/根据指定的参

29、数初始化VIC寄存器 /USART 初始化设置USART_InitStructure.USART_BaudRate = bound;/一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;/字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;/一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;/无奇偶校验位USART_InitStructure.USART_HardwareFl

30、owControl = USART_HardwareFlowControl_None;/无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/收发模式 USART_Init(USART1, &USART_InitStructure); /初始化串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/开启中断 USART_Cmd(USART1, ENABLE); /使能串口 #if EN_USART1_RX /如果使能了接收void USART1_IRQHandl

31、er(void) /串口1中断服务程序u8 Res;#ifdef OS_TICKS_PER_SEC /如果时钟节拍数定义了,说明要使用ucosII了.OSIntEnter(); #endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) /接收中断(接收到的数据必须是0x0d 0x0a结尾)Res =USART_ReceiveData(USART1);/(USART1-DR);/读取接收到的数据if(USART_RX_STA&0x8000)=0)/接收未完成if(USART_RX_STA&0x4000)/接收到了0x0dif(Res!

32、=0x0a)USART_RX_STA=0;/接收错误,重新开始else USART_RX_STA|=0x8000;/接收完成了 else /还没收到0X0Dif(Res=0x0d)USART_RX_STA|=0x4000;elseUSART_RX_BUFUSART_RX_STA&0X3FFF=Res ;USART_RX_STA+;if(USART_RX_STA(USART_REC_LEN-1)USART_RX_STA=0;/接收数据错误,重新开始接收 #ifdef OS_TICKS_PER_SEC /如果时钟节拍数定义了,说明要使用ucosII了.OSIntExit(); #endif #en

33、dif6遥控(2401)接收程序#include 24l01.h#include delay.h/#include spi.h/#include stm32f10x.h/#include stm32f10x_spi.h const u8 TX_ADDRESSTX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发送地址const u8 RX_ADDRESSRX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发送地址/初始化24L01的IO口void NRF24L01_Init(void) GPIO_InitTypeDef GPIO_Init

34、Structure;SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE );/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /推挽输出

35、GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_4

36、);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; /上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;/LED0-PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_

37、InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); /根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_0); /PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /LED1-PE.5 端口配置, 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOB,GP

38、IO_Pin_5); /PE.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /LED1-PE.5 端口配置, 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOB,GPIO_Pin_6); /PE.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /LED1-PE.5 端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为

39、50MHzGPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /LED1-PE.5 端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); /推挽输出 ,IO口速度为50MHzGPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_

40、Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;/PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /PA0设置成输入,默认下拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz/GPIO_SetBits(GPIOA,GPIO_Pin_7); /PB.5 输出高GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论