硬體部分
主要的是stm32f07單片機,TB6612,藍牙模塊,
思路部分
首先需要了解各個模塊的使用方法,比如要使用直流減速電機,就需要知道電機的相關驅動,如TB6612,LM298N,A4590等電機驅動,再深一步還需要了解這些驅動怎么使用,以及如何使用單片機輸出PWM,如何用單片機和藍牙模塊通信,在使用之前配置相關的硬體條件時,應該注意什么問題等等,
這里主要是利用32單片機驅動履帶車車模,藍牙控制可調速,
代碼部分
MOTOR.C電機引腳初始化
#include "motor.h"
void MOTOR_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF時鐘
//GPIOF9,F10初始化設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_5|GPIO_Pin_11|GPIO_Pin_3;//LED0和LED1對應IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
}
PWM.C
這里參考原子的歷程就行了,
void TIM9_PWM_Init(u32 arr,u32 psc)
{
//此部分需手動修改IO口設定
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE); //TIM3時鐘使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能PORTA時鐘
GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9); //GPIOA6復用為定時器3
GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9); //GPIOA7復用為定時器3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_5; //GPIOB 4 5
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(GPIOE,&GPIO_InitStructure); //初始化B 4 5
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(TIM9,&TIM_TimeBaseStructure);//初始化定時器3
//初始化TIM3 通道1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低
TIM_OC1Init(TIM9, &TIM_OCInitStructure); //根據T指定的引數初始化外設TIM1 4OC1
//初始化TIM3 通道2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低
TIM_OC2Init(TIM9, &TIM_OCInitStructure); //根據T指定的引數初始化外設TIM1 4OC1
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable); //使能TIM14在CCR1上的預裝載暫存器
TIM_OC2PreloadConfig(TIM9,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPE使能
TIM_Cmd(TIM9, ENABLE); //使能TIM14
}
通過PWM的輸出來實作電機的調速,
USART.C
void USART2_IRQHandler(void) //串口1中斷服務程式
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷(接收到的資料必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART2);//(USART1->DR); //讀取接收到的資料
if(Res=='1') //前進
{
FLAG=1;
}
if(Res=='2') //后退
{
FLAG=2;
}
if(Res=='3') //右轉
{
FLAG=3;
}
if(Res=='7') //左轉
{
FLAG=7;
}
if(Res=='4') //停止
{
FLAG=4;
}
if(Res=='5') //逐漸加速
{
FLAG=5;
}
if(Res=='6') //逐漸減速
{
FLAG=6;
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}
通過比較全域變數的值來確定不同時刻應該處理的資料,
main.c
主函式就很簡單了,直接呼叫全域變數通過switch來判斷就可以了,
switch(FLAG)
{
case 1:MoTor_straight(); break;
case 2:MoTor_back(); break;
case 7:MoTor_right(); break;
case 4:MoTor_stop(); break;
case 3:MoTor_left(); break;
case 5:
{
num=num+100;
if(num>1600)
num=500;
FLAG=0;
}break;
case 6:
{
num=num-100;
if(num<0)
num=500;
FLAG=0;
}break;
default: break;
}
今天的分享就到這里,第一次寫有點激動,溜了溜了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286834.html
標籤:其他
