. e6 @% |' X8 g; E& V' |
- G9 D) B4 i% J% k7 X硬件介绍 ! ?) R2 w3 L- \) j9 S
主控芯片用的是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相编码器的电机接口。 如下是电路原理图:
, y7 N+ ~1 D/ ~4 A
0 |7 z% N7 q7 }' ]" d( [ ' D0 B. c6 t: v
" K- z6 x& M- O" o/ \0 D1 R# z
如下打样好的PCB:
+ N8 b+ n' r# R6 t; ~ N, Q9 s
- s3 m5 T7 B e+ A/ \0 _
! [* b& Z+ e- J! q& s( j8 M4 t V: i软件介绍
5 x C: Q- U- V) Q" X! B
2 |; M3 i1 C, {# h这份配套的软件,模块分的很清楚。比如蓝牙的遥控部分,超声波部分在完整版的工程里面都是写好的。最好的办法就是,参照这个程序,一点一点自己粘贴然后修改底层搭建自己的工程。或者你也可以把自己的电路画的跟别人的一样,避免修改别人的底层,这样你粘贴过来甚至都不用改就能用了。 如下是main.c代码:
6 }( ]2 }) c& G9 _: r$ n- #include "stm32f10x.h"
5 p; N) C1 L4 g F7 M- d; L - #include "stdio.h"# |" `4 i0 }# S" s4 ~- _
- #include "systic.h"7 Z! ?' O: E& A# e7 R
- #include "OLED.h"' r1 G0 C7 F; }9 {+ \
- #include "MPU6050.h"
7 \8 J2 n9 j* H& o4 p - #include "LED.h"% s6 l X, [! u" w
- #include "Buzzer.h"8 s7 j0 r, Q- w- L
- #include "Switch.h"
& j8 O% l$ m! q0 ^1 b0 z) r - #include "Key.h"
1 F9 |2 g$ o4 [; k9 [( S5 c( e - #include "Motor.h"$ N# @+ i0 M( @3 k5 t( I, _2 I
- #include "USART.h"
( v: I- V8 Y" W) ?: V - #include "TIM.h"
0 v: t4 H1 W( M! @- U( t( a( ] - 8 O7 ~% J4 F( Z% C" X( M
- uint32_t Main_Count = 0;
/ z H* E6 R9 n1 D0 } - uint8_t Key_num = 0;
0 L/ V2 T% t; t! t! w- _ - uint32_t Test;+ q% m- J3 A: L4 \. ]2 b" ~
- uint8_t Temp[20];
2 ?" e" L0 j# d6 s- I
+ S, \& ^' M+ J" E& A( w- int main(void)
5 W1 Q7 q4 E! \$ {' u+ w5 r7 n6 @ - {+ K( O0 z( \" B& s
- USART_NVIC_Configuration(); // 配置串口中断 G" z8 O# |/ ~, q. ^7 K
- USART_Config(); // 配置串口
- |- Z( B' |# F9 Z) {% S, C - SysTick_Init(); //滴答定时器初始化
; U% p0 b) X6 \ - OLED_Init(); //OLED引脚初始化 , B# g* M- Z$ R* m- n/ t
- OLED_Clear(); //OLED清屏 ' L' R4 C3 }9 K3 V: t* q5 d4 p
- OLED_First_Line(); //OLED第一行显示: 贺梓洹毕业设计
* C0 E# p! j4 d1 x) _4 g - LED_Init(); //LED引脚初始化
$ P9 X! F0 z% o" O8 q9 w, ~ - Speak_Init(); //蜂鸣器引脚初始化# B6 R7 I4 o4 A3 K w. |5 \2 d
- Switch_Init(); //拨码开关引脚初始化- ?+ X' m7 L) T) C( L0 U4 P& f
- Key_Init(); //按键引脚初始化 C" W& S3 k7 s4 }' |- H
- MPU6050_Init();
8 a+ ] Y. Z: J" j/ ^- } - PWM_Init(7199,0);' `% R$ \6 M8 b7 N1 Q3 U# U
- TIM_Config();4 P( v) h3 Y. I4 K
- // Speak=1;
" T# t: j6 I7 r, p a - // Delay_s(1);0 e* f0 Q) N# Y) F& o& F' |3 V6 b" d
- // Speak=0;
" r" e* N5 g+ R6 {' b - while(1)1 N8 |6 H, J, V5 O, }/ o4 G& ?
- { E" |4 i& E1 G O# P4 a0 v" ]
- // KeyScan();9 m. E4 z% T0 C- f% K; @
- 0 _# }0 i. o6 u/ i7 h7 o8 ^
- * s9 y9 t& Y9 u7 E
- // if(Key1_Count==1)
) m6 R, d e- @$ h9 C' }+ v* o4 ?, E - // {7 D4 e4 i, ]% p" e j: Y/ d
- // Key1_Count=0;
/ k7 N; B- U& k- M0 M" X5 w - // kp=kp+3;
! i2 ^4 {- }( p9 | - // }/ D+ G* V+ J9 o' F O. B
- // OLED_ShowNum(0,6,Key1_Count,6,16);//显示ASCII字符的码值3 `) t$ r8 K* h* [% Z6 Z
- // OLED_ShowNum(0,4,Key2_Count,6,16);//显示ASCII字符的码值) V( a. F7 z8 i" @
- // OLED_ShowNum(0,6,Key3_Count,3,16);//显示ASCII字符的码值
7 ~% S& @+ D+ a! ~) X% ` - // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值
% S& Q- R4 Q! h/ Q) I3 e - // Delay_ms(5);
+ z1 l6 k9 H% h. n Z, l2 ^ - // OLED_ShowNum(103,6,Key4_Count,3,16);//显示ASCII字符的码值 $ `! @ Z1 \: h; N' ^" P* \
- // LED2=0;2 |, ~3 m$ T+ J/ [
- // LED3=0;
9 s+ L( m: g/ x& k* V2 Y5 P - // LED4=0;* T8 B6 n8 x& K# h# l; [' U* V
- // Speak=0;( E- b' A! x1 L
- // Delay_s(1);' ~' i9 |" Z6 A. c# p( P( V; T
- //// LED1=1;
/ W1 c8 x& k5 i" K% q3 J - // LED2=1;
/ C C; W, Y& s - // LED3=1;1 s2 |$ I; A7 o. h
- // LED4=1;/ ^4 ~+ R b( O4 X; {
- // Speak=1;. t$ I( _4 t& h! z( [+ h& s# R7 c. m
- // Delay_s(1);
& T" q" K" I# [; C3 W8 i, v
) y2 B6 g$ P( M- a: h. E
8 n6 d Z5 Q$ K$ J8 z- // READ_MPU6050();
/ ~0 J9 Y1 ~! L" c( y8 B2 D: V - // Kalman_Filter(Data_6050.Acc_X , Data_6050.Gryo_Y); 8 ~8 S1 s! S }4 C6 N. c* ^5 u
- //// //GyroX++;
) W- ?) U3 ]( s4 _ - // OLED_ShowNum(103,2,Data_6050.Acc_X,3,16);//显示ASCII字符的码值
* C7 m3 }- f; i7 H [" Q' x - //// //GyroY++;
G+ T3 l, H4 E5 H - // OLED_ShowNum(103,4,Data_6050.Gryo_Y,3,16);//显示ASCII字符的码值 4 s! u3 e7 s, u( ^
- //// //GyroZ++;2 U- B0 a' F U7 d# y- w4 B, K, `* V
- // OLED_ShowNum(103,6,angle,3,16);//显示ASCII字符的码值
* y1 p* v! ]( m- c3 }; m/ `, i: @ - // Delay_ms(100);
7 y6 U; i5 n9 L8 U" g - }1 D* D- F: `5 |8 Q
- }
复制代码
f% F7 i8 E# A+ z / }8 P& I3 t5 k
转载自:STM32嵌入式开发
, K1 F2 K. J- n1 ^6 Y
% y1 y/ f9 }+ O _1 j& X# z9 N, ^; P5 f( F3 P% }$ \# z4 ^/ ?$ K
|