【考覈評估】stm32藍牙智能小車可調節速度,ADC控制LED燈亮度

在stm32f407的學習過程中,自己動手做一個智能小車,同時也是爲了實驗室考覈的需要。同時用電位器
利用ADC控制LED燈亮度。有問題或者要代碼可以問我直接在下方評論或者給我發郵件(我的郵箱[email protected]
注意:如果要控制速度ENA,ENB必須與PWM相連。
會串口通信就可以使用藍牙,一般從淘寶上買的藍牙默認爲從機,直接用杜邦線將藍牙與單片機連接起來就行。也可通過AT指令調節,這裏不做說明,網上很多。PWM調速的原理讀者很容易就可以在網上找到,這裏也不做說明。
藍牙連接方式:VCC------+5v
GND-------GND
TXD-------Ux_RX
RXD-------Ux_TX
那兩個IO口可以不用連接。 stm32與L298N連接方式(這是我自己的你們可以根據自己的情況修改): IN1----PB6 IN2----PB7 IN3----PB8 IN4----PB9 ENA----PF6 ENB-----PD13
在寫代碼的時候可以一部分寫完再寫另一部分,這樣出現了錯誤就能及時修改。在檢測PWM的時候可以先用杜邦線將選擇的PWM管腳口與LED管腳口連接,通過觀察燈的亮度來檢測PWM是否正常。
材料清單:小車,藍牙模塊HC05,L298N(具體數量根據電機數決定 ),18650鋰電池(4節1.5v的帶不動電機),杜邦線,線仔線。
![在這裏插入圖片描述](ht

tps://img-blog.csdnimg.cn/20200309213535980.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMWV9BXw==,size_16,color_FFFFFF,t_70)

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
上代碼:

在這裏插入圖片描述

主函數 main.h

#include "system.h"
#include "motor.h"
#include "pwm.h"
#include "motor.h"
#include "usart3.h"
#include "led.h"
#include "SysTick.h"
#include "adc.h"
#include "time.h"
#include "beep.h"

int main()
{ 
 
 u16 value;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷優先級分組 分2組
 SysTick_Init(168);
 LED_Init();
 BEEP_Init();
 TIM10_CH1_CH3_PWM_Init(500-1,84-1); //PWM調速
 TIM4_CH1_CH3_PWM_Init(500-1,84-1); //PWM調速
 MotorInit();//動力系統
 USART3_Init(9600);//藍牙串口連接手機
 ADCx_Init();
 TIM14_CH1_PWM_Init(5000-1,84-1); //頻率是2Kh
 TIM3_Init(5000-1,84-1); //500ms

while(1)
 { 
  value=Get_ADC_Value(ADC_Channel_5);
  TIM_SetCompare1(TIM14,value);  
  if(value>4000)
  {
   TIM_SetCompare1(TIM14,0);  //adc調節LED燈亮度
   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  }
 }
}

motor.h

#ifndef _motor_H
#define _motor_H
#include "system.h"
void MotorInit(void);
void Stop(void);
void Turnleft(void);
void Turnright(void);
void Turnback(void);
void Turnfront(void);
#endif

motor.c

#include "motor.h"
void MotorInit(void)
{
//初始化和使能單片機上的GPIO端口,保證可以正常給端口高低電平
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 GPIO_ResetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
}

//停止模式
void Stop(void)
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);
 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);
 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}

//左轉模式 -> 左電機反轉,右電機正轉
void Turnleft(void)
{
 GPIO_SetBits(GPIOB,GPIO_Pin_6);
 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);
 GPIO_SetBits(GPIOB,GPIO_Pin_9);
}
//右轉模式 -> 左電機正轉,右電機反轉
void Turnright(void)
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);
 GPIO_SetBits(GPIOB,GPIO_Pin_7);
 GPIO_SetBits(GPIOB,GPIO_Pin_8);
 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
//後退模式 -> 左電機反轉,右電機反轉
void Turnback(void)
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);
 GPIO_SetBits(GPIOB,GPIO_Pin_7);
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);
 GPIO_SetBits(GPIOB,GPIO_Pin_9);
}
//前進模式 -> 左電機正轉,右電機正轉
void Turnfront(void)
{
 GPIO_SetBits(GPIOB,GPIO_Pin_6);
 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
 GPIO_SetBits(GPIOB,GPIO_Pin_8);
 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}

pwm.h

#ifndef _pwm_H
#define _pwm_H
#include "system.h"
void TIM10_CH1_CH3_PWM_Init(u16 per,u16 psc);
void TIM4_CH1_CH3_PWM_Init(u16 per,u16 psc);
void TIM14_CH1_PWM_Init(u16 per,u16 psc);
void Speed_1_Control(void);
void Speed_2_Control(void);
void Speed_3_Control(void);
void Speed_0_Control(void);
#endif

pwm.c

#include "pwm.h"
#include "SysTick.h"
#include "motor.h"

void TIM10_CH1_CH3_PWM_Init(u16 per,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,ENABLE);//使能TIM4時鐘
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

 GPIO_PinAFConfig(GPIOF,GPIO_PinSource6,GPIO_AF_TIM10);//管腳複用
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //複用輸出模式
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//管腳設置
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度爲100M
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化結構體

 TIM_TimeBaseInitStructure.TIM_Period=per;   //自動裝載值
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻係數
 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
 TIM_TimeBaseInit(TIM10,&TIM_TimeBaseInitStructure); 

 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
 TIM_OC1Init(TIM10,&TIM_OCInitStructure); //輸出比較通道1初始化
 TIM_OC1PreloadConfig(TIM10,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的預裝載寄存器

 TIM_ARRPreloadConfig(TIM10,ENABLE);//使能預裝載寄存器
 TIM_Cmd(TIM10,ENABLE); //使能定時器
 }

 void TIM4_CH1_CH3_PWM_Init(u16 per,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);//管腳複用
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //複用輸出模式
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//管腳設置
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度爲100M
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化結構體
 
 TIM_TimeBaseInitStructure.TIM_Period=per;   //自動裝載值
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻係數
 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); 

 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
 TIM_OC2Init(TIM4,&TIM_OCInitStructure); //輸出比較通道1初始化
 TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的預裝載寄存器

 TIM_ARRPreloadConfig(TIM4,ENABLE);//使能預裝載寄存器
 TIM_Cmd(TIM4,ENABLE); //使能定時器
}

void TIM14_CH1_PWM_Init(u16 per,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//使能TIM14時鐘
 
 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//管腳複用
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //複用輸出模式
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管腳設置
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度爲100M
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化結構體
 
 
 TIM_TimeBaseInitStructure.TIM_Period=per;   //自動裝載值
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻係數
 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
 TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure); 
 
 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
 TIM_OC1Init(TIM14,&TIM_OCInitStructure); //輸出比較通道1初始化
 
 TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的預裝載寄存器
 TIM_ARRPreloadConfig(TIM14,ENABLE);//使能預裝載寄存器
 
 TIM_Cmd(TIM14,ENABLE); //使能定時器
}

void Speed_1_Control(void) //高速
{
 Turnfront();
 TIM_SetCompare1(TIM10,1);
 TIM_SetCompare2(TIM4,1);
}

 void Speed_2_Control(void) //中速
{
 Turnfront();
 TIM_SetCompare1(TIM10,150);
 TIM_SetCompare2(TIM4,150); 
}

void Speed_3_Control(void) //低速
{
 Turnfront();
 TIM_SetCompare1(TIM10,300);
 TIM_SetCompare2(TIM4,300);
}

void Speed_0_Control(void)  //一鍵加速
{
 u16 a=350;
 for(a=350;a>0;a--)
 {
  Turnfront();
  TIM_SetCompare1(TIM10,a);
  TIM_SetCompare2(TIM4,a);
  delay_ms(5);
 }
}

usart3.h

#ifndef _usart3_H
#define _usart3_H

#include "system.h"
void USART3_Init(u32 bound);

#endif

usart3.c

#include "usart3.h"
#include "led.h"
#include "beep.h"
#include "motor.h"
#include "SysTick.h"
#include "pwm.h"


void USART3_Init(u32 bound)
{
  GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOA時鐘
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3時鐘 
  
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_10;//管腳設置F9
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度爲100M
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化結構體

  USART_InitStructure.USART_BaudRate=bound;
  USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  USART_InitStructure.USART_StopBits=USART_StopBits_1;
  USART_InitStructure.USART_Parity=USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  USART_Init(USART3,&USART_InitStructure);

  USART_Cmd(USART3,ENABLE);
  USART_ClearFlag(USART3,USART_FLAG_TC);
  USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void USART3_IRQHandler (void)
{
  u8 r;//r爲手機串口APP發送給藍牙模塊的信息
  if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
  {
   USART_ClearITPendingBit(USART3, USART_IT_RXNE);   //清除 USART1 的中斷待處理位
   r=USART_ReceiveData(USART3);
     if(r=='1')
      {
       Speed_0_Control();
       led2=0;
      }
     
     if(r=='2')
     {
      Turnfront();
      TIM_SetCompare1(TIM10,1);
      TIM_SetCompare2(TIM4,1);
      led2=1;
     }
     
     if(r=='3')
      {
       Speed_1_Control();
       
      }
     
     if(r=='4')
     {
      Turnleft();
      TIM_SetCompare1(TIM10,1);
      TIM_SetCompare2(TIM4,1);
      led2=1;
     }
     
     if(r=='5')
      {
       beep=0;
      }
     
     if(r=='6')
     {
      Turnright();
      TIM_SetCompare1(TIM10,1);
      TIM_SetCompare2(TIM4,1);
      led2=1;
     }
     
     if(r=='7')
      {
       Speed_2_Control();
      }
     
     if(r=='8')
     {
      Turnback();
      TIM_SetCompare1(TIM10,1);
      TIM_SetCompare2(TIM4,1);
      led2=1;
     }
     
     if(r=='9')
      {
       Speed_3_Control();
      }
      
     if(r=='0')
     {
      beep=1;
     }
     
     if(r=='a')
      {
       Stop();
       beep=0;
       delay_ms(100);
       beep=1;
      }  
  }
  
  USART_ClearFlag(USART3,USART_FLAG_TC);
}

time.h

#ifndef _time_H
#define _time_H
#include "system.h"
void TIM3_Init(u32 per,u16 psc);

#endif

time.c

#include "time.h"
#include "led.h"
#include "SysTick.h"

void TIM3_Init(u32 per,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM4時鐘
 
 TIM_TimeBaseInitStructure.TIM_Period=per;   //自動裝載值
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻係數
 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
 
 TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); //開啓定時器中斷
 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
 
 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定時器中斷通道
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶佔優先級
 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //子優先級
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
 NVIC_Init(&NVIC_InitStructure); 
 
 TIM_Cmd(TIM3,ENABLE); //使能定時器 
}

/*******************************************************************************
* 函 數 名         : TIM4_IRQHandler
* 函數功能     : TIM4中斷函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/


void TIM3_IRQHandler(void)
{
 int i=0;
 if(TIM_GetITStatus(TIM3,TIM_IT_Update))
 {
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);//失能TIM3時鐘
  for(i=0;i<3;i++)
  {
   TIM_SetCompare1(TIM14,0);  
   delay_ms(1000);
   TIM_SetCompare1(TIM14,4000);  
   delay_ms(1000);
  }
  TIM_SetCompare1(TIM14,0);  
  
 }
 TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 
}

led.h

#ifndef _led_H
#define _led_H

#include "system.h"

#define led1 PFout(9)
#define led2 PFout(10)
void LED_Init(void);

#endif

led.c

#include "led.h"

/*******************************************************************************
* 函 數 名         : LED_Init
* 函數功能     : LED初始化函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void LED_Init()
{
 GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
 
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能端口F時鐘
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //輸出模式
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//管腳設置F9
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度爲100M
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化結構體
 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
}

beep.h

#ifndef _beep_H
#define _beep_H

#include "system.h"
#define BEEP_Pin (GPIO_Pin_8)  //定義BEEP管腳
#define BEEP_Port (GPIOF) //定義BEEP端口
#define beep PFout(8)  //BEEP PF8
void BEEP_Init(void);

#endif

beep.c

#include "beep.h"

/*******************************************************************************
* 函 數 名         : BEEP_Init
* 函數功能     : 蜂鳴器初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void BEEP_Init(void) 
{
 GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量 
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能端口F時鐘
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //輸出模式
 GPIO_InitStructure.GPIO_Pin=BEEP_Pin;//管腳設置F8
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度爲100M
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推輓輸出
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
 GPIO_Init(BEEP_Port,&GPIO_InitStructure); //初始化結構體
 
 GPIO_SetBits(BEEP_Port,BEEP_Pin); //關閉蜂鳴器
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章