大家好,又见面了,我是你们的朋友全栈君。
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)
{
//¼ì²âµ½ºÚÏßΪ1 ¼ì²â²»µ½ºÚÏßΪ0
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"
#define IN1 PAout(6)
#define IN2 PAout(5)
#define IN3 PAout(4)
#define IN4 PAout(3)
#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()
{
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);
}
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191340.html原文链接:https://javaforall.cn