stm32 蓝牙 智能小车

  电源问题已经解决,还是18650更给力,两节就可以达到8v上下。原来是模仿网上下的模板,把模板烧进去发现并没有成功,所以就把原来写的代码全部推翻,重新开始写。
  其实写一个工程,最快的方法并不是一口气把所有东西都给添加上,因为一旦出现错误,当然肯定会出现错误,根本不知道从哪里下手改bug,所以还不如一个一个的加模块,从最基础的开始加,我用的主板是stm3210fcbt6。
  先从电机驱动开始,电机驱动l298n,我把电机驱动和马达放到小车两个夹板之间,封装好就不需要在动了,电机驱动没有什么难度,电源给力,什么都好说。两块l298n,每块上面有四个In、两个En。其中两个in一个EN控制一个电机,输入高低电平01或10正反转,EN使能端,我先给高电平使能测试(到后边再给PWM)。接着就是找功能low的GPIO,我选择的C4~11,EN选择的A67 B01(对应TIME3_CH1~CH4,便于后边给PWM)。封装好Motor的动作函数,测试OK。
  然后是蓝牙,即USART。这儿需要注意的是,我用的HC_06蓝牙模块,默认波特率9600.这个要设置匹配。GPIO:PA9 10。用232测试,用串口软件测试更直观,单独写一个工程,测试成功,把这个C文件 H文件放进上一个工程。调试,改一些冲突,使整个工程协调,OK
  然后PWM,开始便于测试,直接给高电平使能,现在,给PWM,调速。还是先单独用LED测试,调通后放进工程,一个一个的把各个模块加进来,逐个击破。

#include "Motor.h"
u8 temp;
void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//电机驱动IN
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//电机驱动EN
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//电机驱动EN
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
}

void Motor_Forward(void)
{
	           GPIO_SetBits(GPIOC,GPIO_Pin_4);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
	           GPIO_SetBits(GPIOC,GPIO_Pin_7);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_6);
	           GPIO_SetBits(GPIOC,GPIO_Pin_9);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_8);
	           GPIO_SetBits(GPIOC,GPIO_Pin_10);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	           temp=1;
}
void Motor_Back(void)
{
	           GPIO_SetBits(GPIOC,GPIO_Pin_5);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_4);
	           GPIO_SetBits(GPIOC,GPIO_Pin_6);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_7);
	           GPIO_SetBits(GPIOC,GPIO_Pin_8);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_9);
	           GPIO_SetBits(GPIOC,GPIO_Pin_11);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_10);
	           temp=2;
}
void Motor_Right(void)
{
          	 GPIO_SetBits(GPIOC,GPIO_Pin_4);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
	           GPIO_SetBits(GPIOC,GPIO_Pin_6);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_7);
	           GPIO_SetBits(GPIOC,GPIO_Pin_8);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_9);
	           GPIO_SetBits(GPIOC,GPIO_Pin_10);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	           temp=3;
}
void Motor_Left(void)
{
	         	 GPIO_SetBits(GPIOC,GPIO_Pin_5);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_4);
	           GPIO_SetBits(GPIOC,GPIO_Pin_7);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_6);
	           GPIO_SetBits(GPIOC,GPIO_Pin_9);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_8);
	           GPIO_SetBits(GPIOC,GPIO_Pin_11);
		         GPIO_ResetBits(GPIOC,GPIO_Pin_10);
	           temp=4;
}
void Motor_Park(void)
{
          	GPIO_SetBits(GPIOC,GPIO_Pin_4);
		        GPIO_SetBits(GPIOC,GPIO_Pin_5);
	        	GPIO_SetBits(GPIOC,GPIO_Pin_6);
		        GPIO_SetBits(GPIOC,GPIO_Pin_7);
	          GPIO_SetBits(GPIOC,GPIO_Pin_8);
		        GPIO_SetBits(GPIOC,GPIO_Pin_9);
	        	GPIO_SetBits(GPIOC,GPIO_Pin_10);
		        GPIO_SetBits(GPIOC,GPIO_Pin_11);
	          temp=0;
}

Motor.c

#include "Usart.h"
void USART1_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=9600;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStructure);
	
	USART_Cmd(USART1,ENABLE);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&NVIC_InitStructure);
	
}
pwm.c
 #include "PWM.h"
	
	
	
	void PWM_Init(void)
	{
		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_TimeBaseStructure.TIM_Period=500-1;
	TIM_TimeBaseStructure.TIM_Prescaler=720-1;
	TIM_TimeBaseStructure.TIM_ClockDivision=0;
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=100;//指定将要加载到捕获比较寄存器的脉冲值,当计数器计数到这个值时,电平发生跳变
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较极性,当定时器计数值小于CCR1_Val时为高点平
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=100;
	TIM_OC2Init(TIM3,&TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=100;
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=100;
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	
	TIM_Cmd(TIM3,ENABLE);
	}
	

你可能感兴趣的:(stm32)