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);
}

作者:仝仝仝同学

物联沃分享整理
物联沃-IOTWORD物联网 » STM32五路循迹与超声波避障功能详解(第一部分)

发表回复