, }% x, t# X8 `7 Y
( n5 B6 t' `) J: w4 W, `硬件介绍 % Y- J b5 W7 A& X$ d
主控芯片用的是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测量的。 STM32F103VET6主控芯片;两个microusb口,第一个是MCU的串口1,可作为普通的串口收发数据,通过调节板上BOOT选项,也可将其作为ISP下载程序接口;第二个是SWD硬件仿真接口;蓝牙模块,与MCU的串口2连接;WIFI模块,与MCU的串口3相连;一块1.3寸IIC协议的液晶接口;超声波接口;双电机驱动;六轴陀螺仪;电池电压检测;4个用于调试的LED;4个独立式按键;一组4P的拨码开关;有源蜂鸣器;两个6P带AB相编码器的电机接口。 如下是电路原理图: 如下打样好的PCB:
9 T" [- z* F3 G# @; s( f( t$ V1 }0 E b2 h3 M! l( U- e* r+ w: a% E
) B- J! N: Q4 I
软件介绍
8 R% P- Y6 Q, I1 K5 @, t5 b 这份配套的软件,模块分的很清楚。比如蓝牙的遥控部分,超声波部分在完整版的工程里面都是写好的。最好的办法就是,参照这个程序,一点一点自己粘贴然后修改底层搭建自己的工程。或者你也可以把自己的电路画的跟别人的一样,避免修改别人的底层,这样你粘贴过来甚至都不用改就能用了。
0 z7 G; J' R3 L' o5 j7 E1 ^: ^ 如下是main.c代码:0 i8 t0 `! T) E
- #include "stm32f10x.h"$ X7 M0 R% c2 R& ?7 z2 P" F
- #include "stdio.h"# f+ V+ A9 ?. W+ O
- #include "systic.h"
7 j9 I) Q' _* ~/ }, F! u2 d - #include "OLED.h": r% _, Y: y1 x3 M! O/ s* ]* Y
- #include "MPU6050.h"
8 T# l( b7 }5 ~, O - #include "LED.h"
% K/ J+ _0 x) g! O+ }: y - #include "Buzzer.h"6 m) { `6 W: d3 L0 F2 j
- #include "Switch.h"
" ~' u+ \+ I) q9 \- k! P - #include "Key.h"
6 e2 ? Q2 {+ y" H - #include "Motor.h"7 N/ R6 A) x% F6 i
- #include "USART.h"
2 @ O5 C c/ G+ g9 Z7 `* g8 E% ] - #include "TIM.h"
8 N& m+ j( Y) W - % R7 `. W+ L) e% a, H# H
- uint32_t Main_Count = 0;& J' G2 K) k y$ g& y3 ?2 t8 O
- uint8_t Key_num = 0;4 ~* j. v0 G9 J& g( O
- uint32_t Test;
) B4 h+ e6 E% Q, c - uint8_t Temp[20];
% N9 N/ `5 M# D- [$ {" C - 8 l4 m) W9 y$ z! u
- int main(void)
1 E9 {6 p# \- w/ R - {
1 w3 n; G2 W% j% k& K/ Y o' M% P9 J, K - USART_NVIC_Configuration(); // 配置串口中断
d X* j+ G* t1 x% J! ^5 R - USART_Config(); // 配置串口
8 n! P! E4 q# C \5 o$ B) l - SysTick_Init(); //滴答定时器初始化
4 \2 c7 ?% _/ ~- M - OLED_Init(); //OLED引脚初始化
# u" J" A; V4 q* ]( J" G% H - OLED_Clear(); //OLED清屏
5 E& c2 b2 y# h' e) N% z6 { - OLED_First_Line(); //OLED第一行显示: 贺梓洹毕业设计
" G6 |" t; k( e) k6 b7 V0 D- ~ - LED_Init(); //LED引脚初始化
. ^ C0 o' W& n2 Z& | - Speak_Init(); //蜂鸣器引脚初始化
* s; ~8 h+ T, V+ W - Switch_Init(); //拨码开关引脚初始化+ ~6 Z. R$ z! @7 \
- Key_Init(); //按键引脚初始化: T+ a; j( P% \
- MPU6050_Init();% u+ d$ b4 h: d w. b( C
- PWM_Init(7199,0);! D% \, `/ G- E) M8 c/ h: ~
- TIM_Config();
3 |8 V4 @0 H6 z, A - // Speak=1;
; x8 x. @" Z3 x" s! W# } - // Delay_s(1);
% n; A. K6 c2 c( w: q - // Speak=0;3 V8 t! w. R N W5 G9 Q. Z5 v
- while(1)
! y! W3 P2 Z& w7 T. t4 s - {
; p; Y1 C7 w5 R% K6 w4 S9 Y* J - // KeyScan();+ R# a" ?0 Z# q
- ( Q' W, V1 |+ Y& V& ?- g
- Y: L" ^ W r$ v- L
- // if(Key1_Count==1)
9 c0 M6 Q6 i y) u c9 [% D - // {
" o `) g4 {% p- p - // Key1_Count=0;' m1 X0 N z* D8 P, e1 D* T3 L3 M' \
- // kp=kp+3;$ O; J8 `9 |/ K* F- s
- // }% Y7 r6 Q6 O: K( i- a
- // OLED_ShowNum(0,6,Key1_Count,6,16);//显示ASCII字符的码值
- \5 W6 E5 o( E4 F0 L, @7 \5 f - // OLED_ShowNum(0,4,Key2_Count,6,16);//显示ASCII字符的码值/ G. A y5 s$ `6 x0 I0 x" i
- // OLED_ShowNum(0,6,Key3_Count,3,16);//显示ASCII字符的码值- n; q) u' H: g" }
- // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值
9 g. d/ E3 d- G: R" Z+ `! c - // Delay_ms(5);4 v" o! P* c1 s0 Z
- // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值 - h/ J( o# s8 o' [
- // LED2=0;% G* o+ A' G6 ]. V5 M" ^- A
- // LED3=0;1 D) C0 J) v$ S9 L8 G% L
- // LED4=0;" v4 |' y3 u) @1 H, z3 c
- // Speak=0;
# z! T8 T# k8 c3 a' w9 ] - // Delay_s(1);: A6 d% @( P8 h0 F6 `( \) a
- //// LED1=1;2 b/ R# v/ W% b
- // LED2=1;
3 e- ~9 k4 v c - // LED3=1;
9 U3 G1 s E+ O5 d7 l5 x - // LED4=1;: }4 \: }% K6 U7 K' ? r3 r
- // Speak=1;
) m" Q) u" C, i/ H6 [1 I - // Delay_s(1);5 {& O5 V- t* U; k3 h/ W7 Q
2 O9 b& o9 b* \" a5 g6 H
( z8 `& F H5 |7 c0 _. @; S5 q! ?- // READ_MPU6050();
2 Z+ ~( E8 f3 A7 R0 S+ g* [ - // Kalman_Filter(Data_6050.Acc_X , Data_6050.Gryo_Y); y5 T+ X1 g+ A3 T
- //// //GyroX++;
0 \$ r9 b6 ]+ ?8 O1 D - // OLED_ShowNum(103,2,Data_6050.Acc_X,3,16);//显示ASCII字符的码值 4 j1 [" S! v5 e% V6 [( t
- //// //GyroY++;5 d* b. W! J7 b; n/ g" X6 P1 O
- // OLED_ShowNum(103,4,Data_6050.Gryo_Y,3,16);//显示ASCII字符的码值 $ N! N* h8 ` a9 y ^/ n# T1 \, R
- //// //GyroZ++;! ^! {5 ?8 X0 k! ~6 \5 ?
- // OLED_ShowNum(103,6,angle,3,16);//显示ASCII字符的码值 : T: L6 g- {8 r z) r2 z
- // Delay_ms(100);: s% w5 c( r. m
- }
9 o8 Y2 O- k9 E - }
复制代码
0 h0 D. ^! i. f4 E4 L
" ^1 y" ?3 ^3 F. P" S! C5 p1 j6 N3 m4 A+ \7 \# d
|