一. 使用技术
PWM调速,PID,串口通信,陀螺仪测角度,蓝牙
二. 项目描述
大学的第一个比赛,项目采用主控stm32,车体采用一个四路电机驱动来驱动减速电机,小车依靠8路灰度循迹模块,实现在黑色赛道上行驶,通过窄桥,阶梯,且计算每个过程的时间和进行相应语音播报,同时将各段时间数值通过蓝牙模块传输到手机端。
三. 个人职责
●负责相关代码编写与调试,负责机械结构设计。
●调试项目中使用到的陀螺仪,蓝牙等模块。
四. 项目详解
1. STM32芯片解读
主频(MHz) | 内核 | Flash(Kbytes) | Ram(Kbytes) | 封装 | ADC channels | DAC channels | SPI | IIC | ||
STM32F407ZG | 168 | ARM Cortex-M4f | 1024 | 192 | LQFP144 | 24 | 2 | 3 | 3 | |
STM32F407ZE | 168 | ARM Cortex-M4f | 512 | 192 | LQFP144 | 24 | 2 | 3 | 3 | |
STM32F407VE | 168 | ARM Cortex-M4f | 512 | 192 | LQFP100 | 16 | 2 | 3 | 3 | |
STM32F103ZE | 72 | ARM Cortex-M3 | 512 | 64 | LQFP144 | 21 | 2 | 3 | 2 | |
STM32F103C8 | 72 | ARM Cortex-M4 | 64 | 20 | LQFP48 | 10 | 0 | 2 | 2 |
USART+UART |
4+2 |
4+2 |
4+2 |
3+2 |
3 |
(1) STM32F407附带DSP和FPU
DSP:数字信号处理
FPU:单精度浮点运算单元
(2) stm32是哈佛结构,数据和程序是分开的,x86是冯诺依曼结构。
(3) 强大的时钟系统:
[1] 4-26M的外部高速晶振
[2] 内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL倍频后得到
定时器
以STM32F407ZG为例,10+2+2+1+2(dog)
(TIM2和TIM5是32位)
2. 四路电机使用
//STM32F407ZGT6 定时器14pwm初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14, ENABLE); //使能TIM14
}
3. HC-05的使用
HC05_KEY=1; //KEY置高,进入AT模式
delay_ms(10);
u3_printf("AT\r\n"); //发送AT测试指令
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应
{
if(USART3_RX_STA&0X8000)break;
delay_ms(5);
}