STM32红外寻迹小车(寄存器版)

最近学习了STM32,想通过制作一辆小车来加深对STM32的理解,在平时学习时经常用正点原子提供的源代码稍加该装就行,但是正点原子没有提供关于红外寻迹模板的相关程序。尽管网上很多关于STM32的红外寻迹的资料和源代码,但是几乎没有寄存器版本的源代码。有些博主有寄存器版的程序源码但是得花钱才能下载。那么今天我就分享一下制作寻迹小车的经验和程序源码。
一、红外寻迹小车原理
循迹模块我用的是红外传感器。黑线的检测原理是红外发射管发射光线到路面,红外光遇到白底则被反射,接收管接收到反射光,经施密特触发器整形后输出低电平;当红外光遇到黑线时则被吸收,接收管没有接收到反射光,经施密特触发器整形后输出高电平。简单的说就是当红外寻迹模板遇见黑线时会产生一个高电平,遇见白线时会返回一个低电平。所以根据原理设计思路为当左侧红外传感器遇见黑线时左拐,右边红外传感器遇见黑线时右拐。这样就可以完成

寻迹 黑线寻迹 白线寻迹
原理 左侧红外传感器遇见黑线时左拐,右边红外传感器遇见黑线时右拐。 当左侧红外传感器遇见黑线时右拐,右侧红外传感器遇见黑线时左拐。

二、寻迹小车设计注意事项
(1)因为硬件条件有限,反应速度不是很快会有一定的误差,所以小车的速度要尽量慢下来,从而弥补硬件的不足让小车有足够的反应时间。
(2)在设置两个红外传感器的IO口模式时要设置为浮空输入,这样才能通过程序读取IO口的状态来判断。
(3)在测试小车时尽量在光线较暗的条件下来测试小车,避免光线过亮影响测试。
(4)红外寻迹模块的OUT不能接在有上拉电阻的IO口
三、寻迹小车程序
1.新建工程在工程文件下新建MOTER、TIMER、XUNJI这3个文件夹,然后在各自文件夹下建立相关文件小写的.c和.h文件。
2.timer.c的程序如下:

#include "timer.h"
void TIM3_Int_Init(u16 arr,u16 psc)//初识化定时器3
{RCC->APB1ENR|=1<<1;  //TIM3时钟使能    TIM3->ARR=arr;    //设定计数器自动重装值//刚好1ms    TIM3->PSC=psc;   //预分频器7200,得到10Khz的计数时钟       TIM3->DIER|=1<<0;   //允许更新中断      TIM3->CR1|=0x01;    //使能定时器3MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
}
void TIM3_PWM_Init(u16 arr,u16 psc)
{                            //此部分需手动修改IO口设置RCC->APB1ENR|=1<<1;       //TIM3时钟使能    RCC->APB2ENR|=1<<3;     //使能PORTB时钟 RCC->APB2ENR|=1<<2;       //使能PORTA时钟GPIOB->CRL&=0XFFFFFFF0;  //PB0输出GPIOB->CRL|=0X0000000B;  //复用功能输出 GPIOA->CRL&=0XF0FFFFFF;    //PA6输出GPIOA->CRL|=0X0B000000; //复用输出TIM3->ARR=arr;         //设定计数器自动重装值 TIM3->PSC=psc;         //预分频器不分频TIM3->CCMR1|=6<<4;   //CH1 PWM2模式         TIM3->CCMR1|=1<<3;       //CH1预装载使能  TIM3->CCMR2|=6<<4;        //CH3预装载使能 TIM3->CCMR2|=1<<3;    //CH3输出使能TIM3->CCER|=1<<0;     //OC1 输出使能   TIM3->CCER|=1<<8; TIM3->CR1=0x0080;      //ARPE使能 TIM3->CR1|=0x01;       //使能定时器3    STBY=1;
}

timer.h代码如下:

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
#define left TIM3->CCR1
#define right TIM3->CCR3void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif

moter.c代码如下:

 RCC->APB2ENR|=1<<2;         //使能PORTA时钟RCC->APB2ENR|=1<<3;       //使能PORTB时钟RCC->APB2ENR|=1<<4;       //使能PORTC时钟GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=0X00300000;GPIOA->ODR|=1<<5;      GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=0X30000000;GPIOA->ODR|=1<<7; GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=0X00000030;GPIOB->ODR|=1<<1;GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=0X00000300;GPIOB->ODR|=1<<2;GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=0X00003000;GPIOB->ODR|=1<<3;GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=0X00030000;GPIOB->ODR|=1<<4;    GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=0X00030000;GPIOC->ODR|=1<<4;   GPIOC->CRL&=0XFF0FFFFF;GPIOC->CRL|=0X00300000;GPIOC->ODR|=1<<5;

moter.h代码如下:

#ifndef __MOTER_H
#define __MOTER_H
#include "sys.h"
//电机端口定义(PWMA  PB0  PWMB  PA6)
#define AIN2 PBout(1)
#define AIN1 PBout(2)
#define STBY PBout(3)
#define BIN2 PCout(5)
#define BIN1 PCout(4)
void MOTER_Init(void);  //初始化
#endif

xunji.c代码如下:

#include "xunji.h"
void XUNji_init(void)
{RCC->APB2ENR|=1<<4;      //使能PORTC时钟GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=0X08000000;//PC6浮空输入GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=0X80000000;//PC7浮空输入
}

xunji.h代码如下

#ifndef __XUNJI_H
#define __XUNJI_H
#include "sys.h"
#define left_led PCin(6)
#define right_led PCin(7)
void XUN_Init(void);    //初始化
#endif

这段代码中很容易犯错误为#define left_led PCout(6) #define right_led PCout(7)
因为我们要读取IO口的状态所以不能用out必须用in,写成#define left_led PCin(6)和#define right_led PCin(7)
test.c代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "moter.h"
#include "timer.h"
#include "xunji.h"
void HOU(void)//定义后退函数
{AIN1=0;AIN2=1;BIN1=0;BIN2=1;
}void STOP(void)//停
{AIN1=0;AIN2=0;BIN1=1;BIN2=1;
}void YOU(void)//右拐
{AIN1=1;AIN2=0;BIN1=1;BIN2=1;
}void ZUO(void)//左拐
{AIN1=0;AIN2=0;BIN1=1;BIN2=0;
}void GO(void)//前进
{AIN1=1;AIN2=0;BIN1=1;BIN2=0;
}int main(void)
{                      Stm32_Clock_Init(9); //系统时钟设置uart_init(72,115200);   //串口初始化为115200delay_init(72);           //延时初始化 TIM3_PWM_Init(899,0);   //不分频。PWM频率=72000/(899+1)=80KhzMOTER_Init();void XUN_Init();left=400;right=400;while(1){if(left_led == 1 && right_led == 1)//左右寻迹探头识别到黑线{GO();//前进}else{if(left_led == 1 && right_led == 0)//小车右边出线,左转修正{ZUO();//左转}if(left_led == 0 && right_led == 1)//小车左边出线,右转修正{YOU();//右转}      }       }
}

以上就是我在调试寻迹小车时的程序,和得到的一些注意事项。分享给大家希望对大家有所帮骤。如果有问题希望大家评论区留言我及时改正。

STM32红外寻迹小车相关推荐

  1. 红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)程序部分

    红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)软件部分包括: 出库 直行模块 大,小弯道 环岛 s弯 停车 #include "headfile.h" #inc ...

  2. Arduino与Proteus仿真实例-简单红外寻迹小车控制仿真

    简单红外寻迹小车仿真 1.寻迹小车介绍 红外寻迹小车是一种简单的Line Flower Robot(LFR)自主导向机器人,它会随地面上的线来检测白色表面上的暗线或黑色表面上的白线.LRF跟随线,因此 ...

  3. 基于STM32智能小车->红外寻迹篇

    嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 前言 一.TCRT5000循迹模块介绍 二.红外寻迹小车原理 三.寻迹小车设计注意事项 四.寻迹小车程序 前言 系列文章之红外寻迹篇(库函数版本) ...

  4. STM32版CCD线性摄像头寻线寻迹小车

    基于STM32F103C8T6的CCD线性摄像头寻线寻迹小车 目录 基于STM32F103C8T6的CCD线性摄像头寻线寻迹小车 前言 一.模块介绍 二.使用说明 1.引脚说明 2.其他 三.调试过程 ...

  5. STM32f4日记8之四轮三路寻迹小车实验(小车实验二:红外模块检测寻迹(左拐,右拐,前进,停止))

    STM32f4日记8之四轮三路寻迹小车实验(小车实验二:红外模块检测寻迹(左拐,右拐,前进,停止)) 板子:stm32f407zgt6正点原子迷你版 作者:shawn 2021.2.14(大年初三) ...

  6. 22、4路红外模块实现寻迹小车

    目录 1.简介 2.使用例子 3.资源下载 正文 1.简介 4路红外寻迹模块是为智能小车. 机器人等自动化机械装置提供一种多用途的红外线探测系统的解决方案. 该传感器模块对环境光线适应能力强, 其具有 ...

  7. 关于寻迹小车组装建议

    太君组装寻迹小车 先说我碰到的问题: 焊接要注意,而且尽量先焊接再组装. 组装前应该先考考虑所有零件在小车上的布局. 每次接线时注意正负. 不要带电源组装. 修改电源线时请一根一根剪. 虽然有些常识我 ...

  8. 基于51单片机的寻迹小车

    智能车刚入门,前段时间制作了一个51寻迹小车,就是网上那种寻迹是用四个红外传感器,驱动是L298N,主板是自己焊接的51最小系统加了一个7805将电池的7.2v稳压成5v(虽然我直接用的电池电压),原 ...

  9. FPGA入门实验-寻迹小车的实现

    任务目标 寻迹小车的实现.用的红外寻迹模块,记得要把模块可调电阻参数调好. 实现代码 电机模块代码motor.v: module MOTOR(input sysclk,input rst_n,inpu ...

最新文章

  1. MySQL安装最后一步apply security settings错误
  2. java 网线串口开发_C++标准语言不断被开发,C++却走向了下坡路!
  3. [学习笔记] ES6的数组遍历方式 for, forEach,for...in, for...of
  4. DFT实训教程笔记1(bibili版本)- introduction to DFT DFT Architecture
  5. android listview源码--第一章RecycleBin
  6. OPA 3 - thirdParty Qunit.js and IFrame load logic
  7. 从濒临解散到浴火重生,OceanBase 这十年经历了什么?
  8. 数据库连接池的深入理解
  9. addition过程 sgnb_5G-NSA接入流程分析及问题定位四步法
  10. ironman钢铁侠高清mac动态壁纸
  11. 达梦数据库解决ZYJ环境数据库连接会闪断的问题
  12. 解决file_get_contents乱码
  13. React:开发者工具谷歌插件下载安装
  14. 多款国外虚拟主机简单比较
  15. sql: expected 0 arguments, got 1
  16. 微信小程序顶部下拉菜单栏
  17. 盘数几则热门微信好友诈骗套路
  18. 深入理解空间金字塔池化(SPP,ASPP)
  19. 计算机远程桌面在哪里打开,电脑开启远程桌面的方法
  20. Java小游戏教程,一小时学会贪吃蛇大作战,制作属于自己的游戏

热门文章

  1. thinksns开源微博系统 V3上传漏洞
  2. 摆脱外包进大厂,苦逼翻身把歌唱,20K、30K、40K!咬牙硬吃下这份儿数据结构与算法手册
  3. 新网域名如何绑定dnspod解析服务并添加相关记录?
  4. python学习--文件操作
  5. 重装、删除、卸载ArcGIS的注意的事项
  6. 关于前端的一些学习记录(1)
  7. python生成快递取件码_快递,顺丰,python,截图,15Seconds
  8. python如何读取weboutlook内容_用Python通过MAPI读取Outlook中的电子邮件
  9. python编程软件排行榜_python编程软件
  10. c语言c 下载文件,如何在C/C++中使用WinHTTP下载文件?