stm32循迹小车详细制作过程
一.材料准备
1、主控板
Stm32f103c8t6 (推荐,便宜够用)
2、下载器
USB转TTL串口模块
3、电源
12v锂电池组、配套充电器(推荐下图这种,方便,好接线,12v!12v! 12v!)
4、电机驱动模块
L298n电机驱动模块(尽量多备一两个,容易烧)
5、循迹模块
TCRT5000循迹模块(多买几个,四个吧)
6、杜邦线
公对公、母对母、公对母(都买上,不贵,消耗品)
7、开关
避免出现意外还是备一个吧
8、小车底座
有四个轮的,三个轮的(其中一个是万向轮)。
三个轮:好接线,可以转直角弯。
四个轮:稳定,也可以转直角弯,但相对来说比三个轮难转。
9、蜂鸣器模块
二.各器件详细解释
1.L298N介绍
如图,中间的三个接线端从左到右分别为VCC、GND、+5,其中VCC为12V供电,GND为供电地,+5为5V供电;左右两边的接线端分别为输出A和输出B;排针部分引脚分别为ENA、IN1、IN2、IN3、IN4、ENB,其中IN1~4为逻辑输入,ENA和ENB为PWM使能,已经默认被接到5V,若要使用PWM调速
可取下跳帽使用。
2.stm32c8t6
(1) STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
(2)程序下载方法
stm32f103c8t6的TX引脚为PA9 RX引脚为PA10。
串口下载的引脚
stm32f103c8t6的引脚
接法的说明
STM32 | cp2102 |
---|---|
3.3V | 3.3V |
PA9(TXD引脚) | RXD引脚 |
PA9(RXD引脚) | TXD引脚 |
GND | GND |
下载程序:
打开flymcu,设置如下
下载前将 boot0 = 1
然后就可以下载成功了
注意:下载程序完毕后,把boot0跳线帽复位即boot0 = 0
3.循迹模块
循迹原理非常简单,模块上配有一个输出指示灯,部分模块还有电源指示灯,我们主要关注输出指示灯。红外发射器一直发射红外线,红外线经发射后被接收,此时输出低电平,输出指示灯点亮。黑色是不反射红外线的,也就是说循迹模块遇到黑线,模块输出高电平,输出指示灯熄灭。当然除了遇到黑线熄灭,当距离太远红外线反射后检测不到,此时指示灯也会熄灭。那么如果要循迹,模块离地面要近,在没有遇到黑线时确保指示灯长亮,一旦指示灯熄灭就说明遇到黑线了。
如上图中4个管脚的,分别是VCC、GND、A0、D0。A0是模拟信号输出,D0是TTL电平输出。使用TCRT5000主要就是用来循迹,只需要连接VCC、GND、D0就可以了。
三.代码详细介绍
首先是主函数(main.c):
#include "stm32f10x.h"
#include "motor.h"
#include "delay.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
motor_gpio();
xunji_gpio();
pwm();
delay_init();
if(GO== 0) //这里也是一个循迹,用来作无接触启动,若不需要可以删除
{
while(1)
{
//LEFT_ONE LEFT_TWO RIGHT_ONE RIGHT_TWO代表的是四个循迹
if(LEFT_ONE==0&&LEFT_TWO==0&&RIGHT_ONE==0&&RIGHT_TWO==0)
{
run();
}
else if(LEFT_ONE==0&&LEFT_TWO==1&&RIGHT_ONE==0&&RIGHT_TWO==0)
{
left();
}
else if(LEFT_ONE==0&&LEFT_TWO==0&&RIGHT_ONE==0&&RIGHT_TWO==1)
{
right();
}
else if(LEFT_ONE==1&&LEFT_TWO==1&&RIGHT_ONE==1&&RIGHT_TWO==1)
{
turn();
delay_ms(200);
stop();
delay_ms(5000);
}
}
}
}
其次是pwm,循迹,及电机的初始化:
.h 文件
#ifndef __motor_H
#define __motor_H
#include "sys.h"
//可以按照此处接线 IN1~4对应L298n上的IN1~4
#define IN1 PAout(6)
#define IN2 PAout(5)
#define IN3 PAout(4)
#define IN4 PAout(3)
//可以按照此处接线 LEFT_ONE—— RIGHT_TWO 以及go 对应循迹模块上的D0
#define LEFT_ONE PBin(4)
#define LEFT_TWO PBin(6)
#define RIGHT_ONE PBin(7)
#define RIGHT_TWO PBin(8)
#define GO PBin(5)
void run(void);
void left(void);
void right(void);
void back(void);
void qleft(void);
void qight(void);
void stop(void);
void turn(void);
void motor_gpio(void);
void xunji_gpio(void);
void pwm(void);
#endif
.c文件
#include "motor.h"
#include "stm32f10x.h"
void motor_gpio()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void xunji_gpio()
{
//这里是对五个循迹进行的引脚初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void pwm()
{
//初始化pwm,PA1,PA2分别接L298N的EN1,EN2
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 899;
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
//TIM_SetCompare2 TIM_SetCompare3的数值分别对应左右两边的速度,可自行调整
void run()
{
TIM_SetCompare2(TIM2,380);
TIM_SetCompare3(TIM2,380);
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void back()
{
TIM_SetCompare2(TIM2,300);
TIM_SetCompare3(TIM2,300);
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void right()
{
TIM_SetCompare2(TIM2,400);
TIM_SetCompare3(TIM2,400);
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void left()
{
TIM_SetCompare2(TIM2,400);
TIM_SetCompare3(TIM2,400);
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void turn()
{
TIM_SetCompare2(TIM2,250);
TIM_SetCompare3(TIM2,250);
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
void stop()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
四.效果展示
stm32循迹小车系列文章:
1.stm32循迹小车详细制作过程(附加完全版代码)
2.L298n电机驱动详细介绍(stm32循迹小车中L298n的用法)
3.超声波模块详细介绍(stm32循迹小车中超声波的介绍)文章来源:https://www.toymoban.com/news/detail-787110.html
寻迹程序在群资料,有问题可以直接在群里问,互相交流学习。文章来源地址https://www.toymoban.com/news/detail-787110.html
到了这里,关于stm32循迹小车详细制作过程(附加完全版代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!