3 c, m: M, S9 _4 y& C/ G0 M硬件介绍
* u- j, p( f3 O: E 主控芯片用的是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测量的。
! L6 v: l: ^% J+ Z( C# I9 S3 I6 l STM32F103VET6主控芯片;两个microusb口,第一个是MCU的串口1,可作为普通的串口收发数据,通过调节板上BOOT选项,也可将其作为ISP下载程序接口;第二个是SWD硬件仿真接口;蓝牙模块,与MCU的串口2连接;WIFI模块,与MCU的串口3相连;一块1.3寸IIC协议的液晶接口;超声波接口;双电机驱动;六轴陀螺仪;电池电压检测;4个用于调试的LED;4个独立式按键;一组4P的拨码开关;有源蜂鸣器;两个6P带AB相编码器的电机接口。$ Z1 @0 t4 F" ^: X2 ~
如下是电路原理图:
7 r5 q6 g, I0 x6 x w3 s" R. b! G+ O3 X* r) u6 s% G0 f5 Q6 r, o
9 @5 U5 o9 E: ]' [
如下打样好的PCB:: g" E# l5 ]6 M d& r# t
" P% P" d) G0 _& |) {) z8 J2 u! E9 K* ~2 V: v
软件介绍- k) @' C& [6 K" Q
这份配套的软件,模块分的很清楚。比如蓝牙的遥控部分,超声波部分在完整版的工程里面都是写好的。最好的办法就是,参照这个程序,一点一点自己粘贴然后修改底层搭建自己的工程。或者你也可以把自己的电路画的跟别人的一样,避免修改别人的底层,这样你粘贴过来甚至都不用改就能用了。相关推荐:做一个STM32小车很简单吗?
* S' Z6 @' h8 y6 P, p3 Q 如下是main.c代码:
+ q. S9 h1 R3 Z% z; M( C- #include "stm32f10x.h"
9 ?* X9 z& t* `7 d& z# z, z9 |: W - #include "stdio.h"
$ I) A: K0 A3 i7 S) c' N& g$ { - #include "systic.h"
3 o) m; Y: [+ b4 |- {9 Q5 N* k - #include "OLED.h"1 x' ~: y' S2 k9 H$ b
- #include "MPU6050.h"
, ]9 y0 z+ {7 ~5 x - #include "LED.h"+ Y1 J m# }. k" m% O# D
- #include "Buzzer.h": Q/ I3 i4 h7 F# ]: V6 t, M" C/ i% K ^
- #include "Switch.h"( K, w# W$ p$ P& I. a
- #include "Key.h". |7 Y* c0 J3 Q" x! p* G
- #include "Motor.h"( v. F# M' i2 X$ S6 O% Z! o7 S
- #include "USART.h"% t/ D! t! ?: ~' q! n
- #include "TIM.h"- w& Y3 w; C& P
- - A. G; F# z2 V& V# ?5 g
- uint32_t Main_Count = 0;+ t% f( _. b; c! N% ?
- uint8_t Key_num = 0;3 g3 h3 L( G8 T
- uint32_t Test;
( p. J9 \) I5 r8 w. X9 n8 w7 m - uint8_t Temp[20];) F& c0 p V& b. F& A. O+ ^+ _" `
i" w5 x- X* [* Q- int main(void)
9 [& I' p) w9 ^: d9 w6 z$ f - {
4 ]5 ?. Y6 S' J" a - USART_NVIC_Configuration(); // 配置串口中断! S; K4 M3 {$ ?. ^
- USART_Config(); // 配置串口3 Y( [5 d, F5 ^8 x+ P* _8 f
- SysTick_Init(); //滴答定时器初始化 $ ~8 z9 N/ A {1 [8 L4 O! H
- OLED_Init(); //OLED引脚初始化 2 y# K+ L1 P, @3 b3 Z( F- _/ F, o
- OLED_Clear(); //OLED清屏
+ [* S* c* L, o, y: d/ W( G3 Z& | - OLED_First_Line(); //OLED第一行显示: 贺梓洹毕业设计
2 ]" c* ?' I! r- Q/ u - LED_Init(); //LED引脚初始化1 C V6 S' v& d6 _, `% t$ N9 ` f# r
- Speak_Init(); //蜂鸣器引脚初始化
( B4 M$ c5 y9 s4 w) o( V - Switch_Init(); //拨码开关引脚初始化
2 `: s- Q/ V' L5 d9 r* ~+ R$ X - Key_Init(); //按键引脚初始化
7 s8 X z; h4 Z - MPU6050_Init();
9 [+ n3 y( @+ K8 o8 Y' B - PWM_Init(7199,0);' R& G6 N K% V {3 P
- TIM_Config();+ h0 |( b, P0 b# U. n: t- f
- // Speak=1;/ t0 \- w* Q# } s- L
- // Delay_s(1);! X7 |5 D S% \) y6 d
- // Speak=0;0 M6 K$ `) a8 K. E, F7 r
- while(1)) }$ w& ?+ h+ U9 {+ \: ~& X; x
- {4 G& J: i, J3 a ^
- // KeyScan();
" G4 K1 P9 d8 Q6 p2 _, ^
4 U- w( ]7 B& j: N4 Y# Y4 N" q6 Z
: p' O8 a1 g1 L- E* ~4 w- // if(Key1_Count==1)* T! ]6 W5 g* \: D* ]7 B
- // {1 Q6 ~5 `, p. [6 _
- // Key1_Count=0;
/ I/ q8 ]" h- j! J8 Y - // kp=kp+3;
* i2 `3 p# H c- H+ C - // }* r6 o( l- I6 Z
- // OLED_ShowNum(0,6,Key1_Count,6,16);//显示ASCII字符的码值
* P) p) N I0 ^$ h( J - // OLED_ShowNum(0,4,Key2_Count,6,16);//显示ASCII字符的码值
" ]4 e+ t* `+ l% C/ T- ^( M o - // OLED_ShowNum(0,6,Key3_Count,3,16);//显示ASCII字符的码值; P" |# D3 D4 o7 w7 f
- // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值8 \: c. V$ j' S! y+ n% M+ x, e
- // Delay_ms(5);
& i- v- @' x3 K+ p - // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值
4 P! E, V; s, y8 y, s/ m - // LED2=0;
; q( d0 w: k0 t( f6 e$ t - // LED3=0;
) h! I# I9 ]7 R$ M' {. N - // LED4=0;
% v9 Z# X8 W0 M$ | - // Speak=0;
) _! v; ]* n5 I& X, U0 ?+ G - // Delay_s(1);; y! k" R5 u$ X! Z
- //// LED1=1;6 j0 G( ~1 \' E p; R6 @- x- H
- // LED2=1;. y2 E5 Y+ j7 G7 ~' M/ {+ N
- // LED3=1;
: A9 T8 s+ \% N* \. t% A+ t - // LED4=1;
|/ A0 Z L6 M) t, z9 W - // Speak=1;
$ |1 `2 k9 Q8 p0 _ - // Delay_s(1);
M) B% k0 g, b# u
' v l7 a1 r6 v9 y' |- 8 j4 ~' D1 q: l; _
- // READ_MPU6050();
6 l( S. n4 O2 d& ? - // Kalman_Filter(Data_6050.Acc_X , Data_6050.Gryo_Y);
/ e3 ]1 M: H8 V5 k+ E3 A - //// //GyroX++;
2 a! b5 j# Q: [7 V! |9 a" H - // OLED_ShowNum(103,2,Data_6050.Acc_X,3,16);//显示ASCII字符的码值
+ X9 b7 a0 Y* ?/ R; T5 G5 w% Q8 x - //// //GyroY++;
0 d4 H4 t( O& a* Z1 V2 J - // OLED_ShowNum(103,4,Data_6050.Gryo_Y,3,16);//显示ASCII字符的码值
3 o, N4 W' {) W6 w$ L - //// //GyroZ++;; @0 r6 g! s7 f
- // OLED_ShowNum(103,6,angle,3,16);//显示ASCII字符的码值
# E5 L; G$ q8 M5 @8 J - // Delay_ms(100);8 R( S4 U/ j9 w5 O# O
- }* s8 J7 Q$ b! G
- }
复制代码 9 J9 {# {% f3 X& S- l5 ]
转载自:EE时间
+ \5 I; G: [ _ |