STM32五路循迹与超声波避障功能详解(第一部分)
PWM.c模块控制两路电机
用了定时器4的通道3控制左轮、通道4控制右轮
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
//tim234都为通用计时器,2是APB1的外设
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //定时器使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //配置时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出(片上外设控制引脚,包括定时器)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//选择时基单元的时钟,可以省略,系统会自动调用
TIM_InternalClockConfig(TIM4);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //1分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
//1s
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR自动重装器
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC预分频器
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复定时器,高级定时器有的,用不到
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
//初始化 输出比较 单元
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋默认初始值
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置输出比较模式
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;//极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
TIM_OCInitStructure.TIM_Pulse = 0; //CCR捕获比较寄存器
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
//启动定时器
TIM_Cmd(TIM4, ENABLE);
}
void PWM_SetCompare3(uint16_t Compare)
{
TIM_SetCompare3(TIM4, Compare);//高电平的时间
}
void PWM_SetCompare4(uint16_t Compare)
{
TIM_SetCompare4(TIM4, Compare);
}
Motor.c
TB6612电机驱动模块
VM接5V
两个电机的VCC接5V
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Motor_Init(void)
{
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
PWM_Init();
}
/*小车行驶*/
//有噪音(人耳20hz--20khz),可以加大频率(减小PSC)
void Car_Run()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB ,GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA ,GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(70);//高电平的时间
//右轮速度
PWM_SetCompare4(70);//高电平的时间
}
//后退
void Car_Back()
{
//左轮向后
GPIO_ResetBits(GPIOB ,GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
//右轮向后
GPIO_ResetBits(GPIOA ,GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(70);//高电平的时间
//右轮速度
PWM_SetCompare4(70);//高电平的时间
}
/*小车停止*/
void Car_Stop()
{
//左轮速度
PWM_SetCompare3(0);
//右轮速度
PWM_SetCompare4(0);
}
/*右拐*/
void Car_Right()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB ,GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA ,GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(80);
//右轮速度
PWM_SetCompare4(60);
}
/*左拐*/
void Car_Left()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB ,GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA ,GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(60);
//右轮速度
PWM_SetCompare4(80);
}
/*右小转*/
void Car_R_Slow()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB ,GPIO_Pin_0);
//右轮向后
GPIO_ResetBits(GPIOA ,GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(75);
//右轮速度
PWM_SetCompare4(65);
}
/*左小转*/
void Car_L_Slow()
{
//左轮向后
GPIO_ResetBits(GPIOB ,GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA ,GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(65);
//右轮速度
PWM_SetCompare4(75);
}
/*右大转*/
void Car_R_Fast()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB ,GPIO_Pin_0);
//右轮向后
GPIO_ResetBits(GPIOA ,GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(30);
//右轮速度
PWM_SetCompare4(30);
}
/*左大转*/
void Car_L_Fast()
{
//左轮向后
GPIO_ResetBits(GPIOB ,GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA ,GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(30);
//右轮速度
PWM_SetCompare4(30);
}
/*直角右转*/
void Angle_Right()
{
//左轮向前
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
//右轮向后
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(80);
//右轮速度
PWM_SetCompare4(80);
}
/*直角左转*/
void Angle_Left()
{
//左轮向后
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
//右轮向前
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
//左轮速度
PWM_SetCompare3(20);
//右轮速度
PWM_SetCompare4(55);
}
作者:仝仝仝同学