目录
前言
学完江科大的stm32 就迫不及待想找个项目练练手,于是就先做了一个比较基础的智能小车项目,没有去设计板子,直接用的江科大的面包板做的一个简易的小车。这个过程还是遇到了一些困难,下面我以一个小白的视角把我自己遇到的问题分享出来供大家参考,编程全部采用模块化编程,可以随意拓展自己喜欢的功能
配置清单
- STM32C8T6核心板
- 小车底盘4WD(拼多多上面购买 会送4个电机)
- HC-SR04超声波测距模块
- sg舵机
- TB6612电机驱动模块
- HC-05蓝牙串口透穿模块
- 4节五号电池
代码实现
1.TB6612驱动4路电机
一个tb6612上面的接口只能驱动2个电机,,这里采用了串联的方式实现驱动4个电机转动,AO1、AO2、BO2、BO1分贝引出两根线
电机驱动代码(Motor.c)
#include "stm32f10x.h" // Device header
#include "PWM.h"
void MotorAll_Init(void)
{
//开启电机驱动口的四个GPIO口
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_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
PWM_Init();
}
//当IN1和IN2之间有电压差,即一个为1,一个为0时,电机转动
void MotorR_SetSpeed(int8_t Speed) //右轮
{
if (Speed >= 0) //正转
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //低
GPIO_SetBits(GPIOA, GPIO_Pin_5); //高
PWM_SetCompare1(Speed);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_4); //高
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //低
PWM_SetCompare1(-Speed);
}
}
void MotorL_SetSpeed(int8_t Speed) //左轮
{
if (Speed >= 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
PWM_SetCompare2(Speed);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
PWM_SetCompare2(-Speed);
}
}
利用pwm控制电机速度(PWM.c)
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCP