2 ~! y' ]" q1 \" {# ]+ H( f硬件介绍9 p$ K2 S+ [0 _6 ^. K$ {
主控芯片用的是100脚的STM32F103VET6,陀螺仪用的是MPU6050,电机驱动用的是TB6612,蓝牙是汇承的HC05邮票孔封装的,WIFI用的USR-WIFI232-S,小车底盘用的是平衡小车之家的某一款带编码器的(不是我买的,同学的),电池用的是一节7.2的镍镉电池,液晶用的是1.3寸IIC接口的OLED,开关用的是三脚纽子开关,电池接口用的是T插,电阻电容这些用的基本上是0603封装,编码器5V降压用的是ASM1117-5.0,3.3V降压用的是SP6203,拨码开关用的是4P贴片式2.54mm角距的,按键是两脚贴片,microusb接口用的是5针 7.2四脚插板牛角母座,超声波是某宝上几块钱烂大街的那种,蜂鸣器是有源的,编码器是小车底盘自带的,电池电压检测是电阻分压之后通过电压跟随器接入MCU内部AD测量的。+ p- e, B! p; e( I$ _0 R
STM32F103VET6主控芯片;两个microusb口,第一个是MCU的串口1,可作为普通的串口收发数据,通过调节板上BOOT选项,也可将其作为ISP下载程序接口;第二个是SWD硬件仿真接口;蓝牙模块,与MCU的串口2连接;WIFI模块,与MCU的串口3相连;一块1.3寸IIC协议的液晶接口;超声波接口;双电机驱动;六轴陀螺仪;电池电压检测;4个用于调试的LED;4个独立式按键;一组4P的拨码开关;有源蜂鸣器;两个6P带AB相编码器的电机接口。
+ W j$ i) c- E0 z 如下是电路原理图:( [, ?, I$ A, Y7 d0 x& c# y# l
- j8 T0 g$ Q* L
- S8 M ] s; M: v
如下打样好的PCB:
) ]' H9 Y. z" F1 C
+ I: D% o/ E' |* V9 b
# x- ~+ C4 x! a0 B! ~0 D软件介绍) e5 m- h. Y/ [1 ]8 d
这份配套的软件,模块分的很清楚。比如蓝牙的遥控部分,超声波部分在完整版的工程里面都是写好的。最好的办法就是,参照这个程序,一点一点自己粘贴然后修改底层搭建自己的工程。或者你也可以把自己的电路画的跟别人的一样,避免修改别人的底层,这样你粘贴过来甚至都不用改就能用了。相关推荐:做一个STM32小车很简单吗? X. d$ V" m2 ]6 _
如下是main.c代码:
3 T( L" t& _! T7 n5 `$ j- #include "stm32f10x.h"' T* z4 n# S6 |
- #include "stdio.h"* g. b0 g }% t' B S" r
- #include "systic.h"0 s4 }8 o* p6 W4 R* F
- #include "OLED.h"6 I' }8 Q3 k% k$ a( \! y
- #include "MPU6050.h"% H; T( O: Y8 T/ \
- #include "LED.h"9 K6 f# E/ d: v: y) @$ ^7 f% C
- #include "Buzzer.h"
* Q' p+ }) t7 u7 q0 C - #include "Switch.h". X# N7 J3 Q3 H% o! h p7 ^, H; ]
- #include "Key.h"
2 o' H- k& N+ c! ] - #include "Motor.h"" R+ n( b5 \( ^& y, M' Z2 y
- #include "USART.h"+ o' p+ z! @3 L) R
- #include "TIM.h"9 N! i' r6 _5 P! M
- ! ]( l8 g, F6 K6 v' |
- uint32_t Main_Count = 0;0 |. I( V% v' F Y( u/ o& l4 J
- uint8_t Key_num = 0;
0 c! P3 ]' \; S" ?6 q* ^6 ^0 C" l - uint32_t Test;9 F% }% f' B8 f9 y. Q
- uint8_t Temp[20];
2 ^2 [, }0 M" l" E8 M v
5 _5 k7 c1 s, b. S9 N* }) @% W0 {- int main(void)
/ L( s! K2 Q! Z - {
/ I" Z+ }9 q+ {/ z' |8 X4 w( k& H - USART_NVIC_Configuration(); // 配置串口中断
$ h( c; {1 r1 _- \8 m$ k- R8 U - USART_Config(); // 配置串口
. p0 m! H$ f3 m5 ~ - SysTick_Init(); //滴答定时器初始化 & T% V( i+ L& Z. @
- OLED_Init(); //OLED引脚初始化
- J7 w. Z' C' G+ }2 y6 D0 Q+ W1 { - OLED_Clear(); //OLED清屏 0 x& A5 s3 I% m! d% ?0 j: R0 Z) j3 S
- OLED_First_Line(); //OLED第一行显示: 贺梓洹毕业设计2 |" z# C0 H+ s3 b5 N1 ^
- LED_Init(); //LED引脚初始化6 f7 f0 w6 D) J* F* m* O3 O7 R' M" K
- Speak_Init(); //蜂鸣器引脚初始化1 Y% Y" ?# i% i4 n3 m
- Switch_Init(); //拨码开关引脚初始化
. C! P# B0 y; L/ }( A - Key_Init(); //按键引脚初始化7 t& O* T( T0 \+ s3 n% i
- MPU6050_Init();
/ _0 m; l& ]9 Z+ d - PWM_Init(7199,0);
+ t9 h6 r Z3 p! ~* M% ?! g b - TIM_Config();
: E5 R- e; Q: X' k, W - // Speak=1;. M' J6 U9 J: C0 G) N
- // Delay_s(1);* o4 v! _2 I: \
- // Speak=0;
2 C% k$ j4 b; \2 T9 u8 N# l( K - while(1)+ I4 [9 i, t1 o8 v; ?6 U# Y' U9 E% @
- {" l% J! s( i1 n
- // KeyScan();' }9 m, O) b! \5 l6 ~
- ) K8 ]1 {+ w K1 g# m6 f
0 t! R, k3 [* c- // if(Key1_Count==1). I2 a2 Y# z5 O4 r" a
- // {
( p, k* }$ U" Q) h( ^ - // Key1_Count=0;
( f0 w8 R' i) {5 @1 V( y( p - // kp=kp+3;
' `# w" _, |6 g9 f' {. n1 C1 T$ K - // }0 C# V! Y! L3 h" J. g8 |% [* L
- // OLED_ShowNum(0,6,Key1_Count,6,16);//显示ASCII字符的码值4 ~/ Y; r3 ~! \4 D% a
- // OLED_ShowNum(0,4,Key2_Count,6,16);//显示ASCII字符的码值. W) G7 Z# a. P, w9 }6 F' o
- // OLED_ShowNum(0,6,Key3_Count,3,16);//显示ASCII字符的码值5 z: z t% i, I+ G- t/ ~# v
- // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值9 P) {$ u8 Q' n+ a& ~$ Y, @% D
- // Delay_ms(5);
- _; y+ l+ d, ]' @, g3 V1 m7 s - // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值 $ B0 U- z, Q% a/ X) H/ v
- // LED2=0;: d. h! k* \9 b8 p5 W! \
- // LED3=0;0 z2 _) g0 u! I5 w
- // LED4=0;
/ t/ K+ e$ ~' g9 ~3 k/ Q - // Speak=0;
/ |. b, d( Q' a, K+ ]3 [( s W - // Delay_s(1);) _& o3 d9 G0 D
- //// LED1=1;
5 l" U6 N! J5 j - // LED2=1;: y4 S3 e2 ?4 a# G- [/ i
- // LED3=1;
- b; g- } p* `! s/ i - // LED4=1;! }$ n0 `9 A! \% }+ h8 i
- // Speak=1;: t# Z, ~ I8 _7 W4 e
- // Delay_s(1);
x* @5 J2 o9 A0 p
& E P3 G6 ~6 K) Y* W
! a- y! _1 i# I& E$ t- // READ_MPU6050(); ~5 o7 N# S, h/ `- Q4 o6 h8 B
- // Kalman_Filter(Data_6050.Acc_X , Data_6050.Gryo_Y); " ^5 f) ]- g* V- `5 P
- //// //GyroX++;
& T) |/ W0 G2 A; ]( \9 _ - // OLED_ShowNum(103,2,Data_6050.Acc_X,3,16);//显示ASCII字符的码值
; O* u. \7 b) J! W. g - //// //GyroY++;" Y" e) H5 L5 R! X% V( E
- // OLED_ShowNum(103,4,Data_6050.Gryo_Y,3,16);//显示ASCII字符的码值 " l9 x7 t3 W% x$ P/ Z! U+ z4 g9 X
- //// //GyroZ++;
& X& C5 V9 a% L) T0 I2 f: V/ X% M - // OLED_ShowNum(103,6,angle,3,16);//显示ASCII字符的码值 : C1 I2 u- {, Z( c% F4 F/ Z0 ]
- // Delay_ms(100);
6 L2 ~& o' Q3 M* R - }. X$ y, Y2 ?5 y: n" ^- O5 ?5 x+ P
- }
复制代码 , l- y1 z# g. u4 }
转载自:EE时间
j; P& C: U. N' _ |